学习Ansible Playbook来自动化任务

了解Ansible Playbook以自动化任务。

之前,我们讨论了Ansible introductioninstallation guide,接下来,让我们谈谈Playbook及其构建块。

什么是Ansible Playbook?

Playbook是Ansible的自动化语言。它是一个包含一组指令的简单文件。在Playbook中,我们定义了Ansible应该做什么。Playbook包含运行任务的剧本,这些任务运行模块。这些任务按顺序执行。

例如,可以简单地在不同的服务器上按顺序运行一系列命令,并重新启动这些服务器。也可以复杂到在公共和私有云中部署和配置数百个虚拟机,包括负载均衡、监控和网络设置。

Playbook语言

Playbook是用YAML代码编写的简单文件。

YAML是一种数据序列化语言。它既适合人类阅读,也适合机器阅读。您不需要任何特殊的编码技能来编写YAML代码。您可以将数据序列化语言视为一个翻译器,将您所有的数据结构分解并按照可以重新构建的顺序进行串行化,以供以后使用。您可以在相同的环境中或甚至在不同的环境中使用这个重构后的数据结构。

下面是一个安装mysql的示例YAML文件:

---
- name: 安装MySQL
  hosts: yaoweibin-mysql-service
  tasks:
    - name: 安装MySQL
      action: $ansible_pkg_mgr pkg=mysql-server state=installed
    - name: 添加Python MySQL DB
      action: $ansible_pkg_mgr pkg=python-mysqldb state=installed

Ansible Playbook基础

本文的这部分介绍了基本的Ansible概念,以更好地理解Ansible Playbook。

主机和用户

Ansible需要基础设施中的目标机器,以便从Ansible Playbook部署play。通过IP地址将主机添加到Ansible清单中。主机是由一个或多个组或主机模式的列表组成,用冒号分隔。remote_user包含用户账户的名称。

---
- hosts: ProdServers
  remote_user: yaoweibin

变量

变量使您能够修改playbook的运行方式。它们几乎可以在playbook的任何地方使用,并且可以从清单继承,在运行时显式设置,在playbook运行开始时发现。您可以使用字母、数字和下划线定义变量名称,但它必须以字母开头。

例如,port_01是一个有效的变量,而01_post是一个无效的变量。这是一个示例变量的示例:

vars:
    http_port: 80
    max_clients: 200

清单

要运行playbook,您需要一个目标机器列表,希望在上面进行自动化。这就是清单的作用。清单列表可以以几种不同的方式构建和存储,包括静态文件,即Ansible主机。或者可以通过一个清单脚本动态生成,该脚本将从外部源中获取主机列表。

您还可以在清单列表中指定一个变量。清单最终是您希望在整个环境中自动化的事物列表。

[webservers]
192.168.20.1
192.168.20.2
192.168.20.4
[dbservers]
172.17.1.56
172.17.1.57

任务

ansible playbook中的plays运行任务。任务负责运行ansible模块。一次只能运行一个任务,任务按顺序执行。它们的任务是用YAML编写的,这种语言非常接近英语。

例如:安装软件包,更新软件等。以下是在Ansible Playbook中安装httpd的任务示例:

tasks:
  - name: 安装httpd软件包
    yum: name=httpd state=latest

处理程序

处理程序是一种特殊类型的任务。

它们可以由任务触发,并在播放结束时运行一次。它用于在配置文件中发生任何更改时发送通知,例如,在安装后启动apache服务。使用“notify”语法来调用处理程序。以下是重新启动apache的处理程序示例:

---
- hosts: all
  tasks:
  - name: ensure apache is at the latest version
    yum: name=httpd state=latest
    notify:
    - restart apache
  - name: ensure apache is running (and enable it at boot)
    service: name=httpd state=started enabled=yes
  handlers:
    - name: restart apache
      service: name=httpd state=restarted

创建和运行您的第一个Ansible Playbook

让我告诉您如何编写一个playbook。每个playbook都以顶部的三个破折号(—)开头。

在Ansible Playbook中首先要提及的是您要在其上运行playbook的主机机器。

然后可以通过收集事实来提及变量;然后可以提及您要执行的不同任务。现在,请记住,任务按照您编写它们的顺序执行。例如,您想首先安装软件A,然后安装软件B,请确保playbook中编写的第一个任务是安装软件A,下一个任务可以安装软件B。

然后,在底部有处理程序。处理程序也是任务,但不同之处在于要执行处理程序,您需要在任务列表中的某些触发器中运行处理程序。

让我向您展示如何创建一个ansible playbook,以在主机上安装和启动nginx。

创建一个.yml文件,您将在其中放置用于创建ansible playbook的YAML代码。

gedit nginx.yml

将下面的YAML代码放入此文件中并保存文件。

---
- hosts: Client
  sudo: yes
  vars:
    - server_port: 8080

  tasks:
    - name: Installs nginx web server
      apt: pkg=nginx state=installed update_cache=true
      notify:
        - start nginx

  handlers:
    - name: start nginx
      service: name=nginx state=started

上面的YAML文件以hosts开头,我想在客户机器(Client)上运行此playbook。客户机IP地址已保存在/etc/ansible/hosts文件中。

下一行允许使用sudo权限运行任务。

然后我在此ansible playbook中定义了server_port变量。

然后是我在此ansible playbook中的第一个任务,用于安装nginx web服务器。此任务还有notify参数,这意味着在此任务之后将运行处理程序。

最后,我编写了一个处理程序来启动客户机上的nginx。

既然您已经清楚了ansible playbook中的YAML代码,让我们运行playbook。以下是运行ansible playbook的语法:

ansible-playbook file_name.yml

现在,我将运行我创建的用于安装和启动nginx的ansible playbook。

root@yaoweibin:/home/yaoweibin# ansible-playbook nginx.yml 

PLAY [Client] ******************************************************************

TASK [Gathering Facts] *********************************************************
ok: [node1]

TASK [Installs nginx web server] ***********************************************

changed: [node1]

RUNNING HANDLER [start nginx] **************************************************
ok: [node1]

PLAY RECAP *********************************************************************
node1                      : ok=3    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

运行以下命令来检查ansible playbook是否正确安装和启动了nginx服务器。

root@yaoweibin:/home/yaoweibin# ps waux | grep nginx
root      3021  0.0  0.0  77676  1516 ?        Ss   15:27   0:00 nginx: master process /usr/sbin/nginx -g daemon on; master_process on;

结论

这就是关于Ansible playbook的内容。我希望这篇文章能帮助你学习如何创建和运行Ansible playbook。如果你想学习Ansible的高级主题,包括Roles、Jinja2、Lookups、Filter、Custom Modules,请查看这个Course

类似文章