when条件判断、loop循环
when:
在Ansible中,提供的唯一一个通用的条件判断是when指令,当when指令的值为true时,则该任务执行,否则不执行该任务。
例如:
--- - name: 修改文件内容 hosts: all tasks: - name: one copy: content: 'Development' dest: /etc/issue when: "inventory_hostname in groups.dev" //当主机属于清单列表中的dev组的时候执行,不需要加{{}}
需要注意的是,when指令因为已经明确是做条件判断,所以它的值必定是一个表达式,它会自动隐式地包围一层 {{}} ,所以在写when指令的条件判断时,不要再手动加上 {{}} 。
虽然when指令的逻辑很简单:值为true则执行任务,否则不执行任务。但是,它的用法并不简单,因为when指令的值可以是Jinja2的表达式,很多内置在Jinja2中的Python的语法都可以用在when指令中,而这需要掌握Python的基本语法。如果不具备这些知识,那么想要实现某种判断功能可能会感觉到较大的局限性
loop:
loop等价于with_list,从名字上可以知道它是遍历数组(列表)的,所以在loop指令中,每个元素都以列表的方式去定义。列表有多少个元素,就循环执行模块多少次,每轮循环中,都会将本次迭代的列表元素保存在控制变量item中。
例如:
--- - name: set hostname hosts: new gather_facts: false vars: hostnames: - host: 192.168.200.34 name: new1 - host: 192.168.200.35 name: new2 tasks: - name: set hostname hostname: name: "{{item.name}}" when: item.host == inventory_hostname loop: "{{hostnames}}" //循环变量hostname
在这个示例中,是对 {{hostnames} }进行循环遍历,hostnames中包含两个元素,每个元素都是一个key/value的对象结构。所以,第一次迭代时,item变量的值是:
{ host: "192.168.200.34", //item.host值 name: "new1" //item.name值 }
注意,当loop和when一起使用时,when的条件判断是在循环内部执行的,也就是说循环指令(如loop)的解析顺序早于when指令。