-
Ansible
条件语句
1)上面的例子在不同的机器上安装nginx
,不同的操作系统风格使用不同的软件包管理器。debian
使用APT
,Red Hat
使用Yum
, 但这是两个独立的Playbook
,您必须为各自的服务器使用正确的剧本。
可以使用条件语句,将这两个Playbook
合成为一个。可以使用when
条件语句为每个任务指定一个条件,只有当条件为真时, 该任务才运行。
条件可以是我们执行的任何检查, 例如检查操作系统系列是否为Debian
或Red Hat
。ansible_os_family
是Ansible
使用操作系统风格填充的内置变量。确保在条件语句中检查相等时使用双等号。 -
条件语句和或运算
或运算,只要满足两个条件中的任何一个,task
就会执行。例如下面的例子,如果操作系统系列是Red Hat
或者Suse
就会使用yum模块安装软件包。
-
条件语句和与运算
and
运算,必须同时满足这两个条件才执行。下面的例子,只有当操作系统系列是Debian
并且版本是16.04
时,我们才使用APT
模块。
-
在循环中使用条件
例如, 我们有一个需要安装的软件包列表,而不是单个软件包。我们有一个名为packages
的数组, 其中包含列表。列表中的每一项都有要安装的软件包的名称以及一个名为required
的属性,仅当required
属性设置为true
时才安装软件包。 就可以使用下面的例子:
首先, 我们指定loop
指令以在循环中执行已安装的任务。要安装的软件包的名称是item.name
, 这将安装指定的所有三个软件包。每个任务都有一个名为item
的变量,而item
具有相应的包详细信息。可以添加一个when
条件,当required
等于true
的时候,才执行这个task
,这就是循环中条件语句的用法。 -
条件语句和
register
要将条件语句与前一个任务的输出一起使用,们需要开发一个剧本来检查其服务和电子邮件的状态。所以有两个任务,第一个任务检查服务的状态,第二个任务发送电子邮件。
要记录一个任务的输出,可以使用register
指令。因此, 我们将第一个任务的输出注册到result
变量, 然后在第二个任务中, 我们使用when
条件来检查result
里面有没有down
,如果没有则执行第二个task
,发送一封邮件。
例子:
下面这个例子只有当host
是node02
的时候,才会启动nginx
服务,也就是只在node02
上启动nginx
,而不是所有的节点上。--- - name: 'Execute a script on all web server nodes' hosts: all become: yes tasks: - service: 'name=nginx state=started' when: 'ansible_host=="node02"'
下面这个例子,
when
语句里面引用了age
这个变量,注意when
语句里面不能有{{}}
--- - name: 'Am I an Adult or a Child?' hosts: localhost vars: age: 25 tasks: - name: I am a Child command: 'echo "I am a Child"' when: 'age < 18' - name: I am an Adult command: 'echo "I am an Adult"' when: 'age >= 18'
下面这个例子, 第一个
task
的输出记录到了register command_output
里面,第二个task
,先检查command_output
有没有对应的ip
,如果没有的话,才加一条到conf
文件里面。这里只是一个例子,更好的时候方法是用lineinfile
模块。--- - name: 'Add name server entry if not already entered' hosts: localhost become: yes tasks: - shell: 'cat /etc/resolv.conf' register: command_output - shell: 'echo "nameserver 10.0.250.10" >> /etc/resolv.conf' when: 'command_output.stdout.find("10.0.250.10") == -1'
更多关于Ansible的文章,请参考我的Ansible专栏:https://blog.csdn.net/u011069294/category_12331290.html