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指令。

 

posted @ 2022-03-23 11:10  小蟋帅  阅读(258)  评论(0编辑  收藏  举报