ansible-playbook循环

有时候一个playbook文件中很多tasks都重复引用了某个模块,通过循环可以降低代码工作量,

1.标准loops

loop.yaml文件内容如下:

---

- hosts: all

  gather_facts: False

  tasks:

  - name: debug loops

    debug: msg="name ----------> {{ item }} "

    with_items:

    - one

    - two

    - three

运行结果如下:

with_items的值是python list数据结构,当然list里面也支持python字典:

---

- hosts: all

  gather_facts: False

  tasks:

  - name: debug loops

    debug: msg="name ----------> {{ item.key }} ----------> {{ item.value }} "

    with_items:

    - {key: "one", value: "VALUE1"}

    - {key: "two", value: "VALUE2"}

    - {key: "three", value: "VALUE3"}

运行结果如下:

2.嵌套loops

修改loop.yaml内容如下:

---

- hosts: all

  gather_facts: False

  tasks:

  - name: debug loops

    debug: msg="name ----------> {{ item[0] }} ----------> {{ item[1] }} "

    with_nested:

    - ['A', 'B']

    - ['a', 'b', 'c']

运行结果如下:

3.散列loops

散列loops相比标准loops支持更丰富的数据结构,支持YAML格式的数据变量。

修改loops.yaml内容如下:

---

- hosts: all

  gather_facts: False

  vars:

  user:

    zhangsan:

    name: zhangsan

    shell: bash

    lisi:

    name: lisi

    shell: zsh

  tasks:

  - name: debug loops

    debug: msg="name ---> {{ item.key }} ---> value ---> {{ item.value.name }} ---> {{ item.value.shell }}"

    with_dict: "{{ user }}"

运行结果如下:

4.文件匹配loops

原理:使用python glob模块去做文件模糊匹配:

修改loop.yaml文件内容如下:

---

- hosts: all

  gather_facts: False

  tasks:

  - name: debug loops

    debug: msg="files ---> {{ item }}"

    with_fileglob:

    - ./*.yaml

运行结果如下:

5.随机选择loops

原理:使用python random模块实现:

修改loop.yaml文件内容如下:

---

- hosts: all

  gather_facts: False

  tasks:

  - name: debug loops

    debug: msg="name ---> {{ item }}"

    with_random_choice:

    - "ansible1"

    - "ansible2"

    - "ansible3"

运行结果如下:

6.条件判断loops

修改loop.yaml文件内容如下:

---

- hosts: all

  gather_facts: False

  tasks:

  - name: debug loops

    shell: cat /etc/redhat-release

    register: host

    until: host.stdout.startswith("RedHat")

    retries: 5

    delay: 5

5秒执行一次 cat /etc/redhat-release并将结果register传递给host,然后判断host.stdout.startswith的内容是否以RadHat开头,如果条件成立,则该task完成,否则5s后重试,总共尝试5次。运行结果如下:

7.文件优先匹配loops

该匹配方式和文件匹配方式很相似,它会根据传入的变量从上到下优先匹配。修改loop.yaml文件内容如下:

---

- hosts: all

  gather_facts: False

  tasks:

  - name: debug loops

    debug: msg="files ---> {{ item }}"

    with_first_found:

    - "loop.yaml"

    - "variable.yaml"

运行结果如下:

8.register loops

其实register可以同时接受多个task的结果,这时需要使用jinja2的for循环把所有的结果显示出来。修改loop.yaml文件内容如下:

---

- hosts: all

  gather_facts: False

  tasks:

  - name: debug loops

    shell: "{{ item }}"

    with_items:

    - hostname

    - uname

    register: ret

  - name: display loops

    debug: msg="{% for i in ret.results %} {{ i.stdout }} {% endfor %}"

运行结果如下:

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容