写点什么

ansible 循环

用户头像
耳东
关注
发布于: 2 小时前

有时候写 Playbook 的时候发现写了很多的 task 都在重复引用某个模块,比如一次传输 10 个文件,就要写 10 个 task。接下来介绍使用 loops 的方式去编写 Playbook 以减少重复使用某个模块。

标准 loops

标准 loops 是我们在编写 Playbook 过程中使用最多的一种 loops ,他能直接减少编写 task 的次数,示例如下:


---- hosts: all  tasks:    - name: display loops      debug: msg="name is {{ item }}"      with_items:        - one        - two        - aaa  
复制代码


with_items 的值是 python list 数据结果,可以理解为每个 task 会循环读取 list 李明的值,然后 key 的名称是 item,当然 list 里面也支持 python 字典。


---- hosts: all  tasks:    - name: display loops      debug: msg="name is {{ item.key }} ,vaule is {{  item.value }}"      with_items:        - {key: "one", vaule: "1"}        - {key: "two", vaule: "2"}        - {key: "AAA", vaule: "a"}  
复制代码


loops 除了标准的支持以外,还支持嵌套和散列

文件匹配 loops

文件匹配 loops 是我们编写 Playbook 的时候需要针对文件进行操作中最常用的一些循环,比如我们需要针对一个目录下指定哪个个事的文件进行处理,这个时候直接在引用的时候 用 with_fileglob 循环去匹配我们需要处理的 文件即可。 看一个例子。


---- hosts: all  tasks:    - name: display loops      debug: msg="file is {{ item }}"      with_fileglob:        - /root/*.yml
复制代码


with_fileglob 会匹配 root 目录下所有以 yml 结尾的文件,当中 变量 item

随机 loops

随机选择一个作为变量。


---- hosts: all  tasks:    - name: display loops      debug: msg="file is {{ item }}"      with_random_choice:        - "A1"        - "A2"        - "A3"
复制代码


with_random_choice 会在传入的 list 中随机选择一个,与 python random 实现原理一样。

条件判断 loops

有时候执行一个 task 以后,我们需要检查这个 task 的结果是否达到了预想状态,如果没有达到我们需要的状态是,就需要退出整个 Playbook 执行过程。这个时候我们就需要对某个 task 结果一直循环检测了,示例如下


---- hosts: all  tasks:    - name: display loops      shell: cat /root/ansible      register: host      until: host.stdout.startswith("Master")      retries: 5      delay: 5                
复制代码


5 秒执行一次 cat /root/ansible 将结果 register 给 host 然后判断 host.stdout.startswith 的内容是否是 Master 字符串开头,如果条件成立,此 task 完成,如果条件不成立,5 秒后重试,5 次后不成立,此 task 运行失败。

发布于: 2 小时前阅读数: 2
用户头像

耳东

关注

还未添加个人签名 2020.05.24 加入

主要研究分享运维技术,专注于监控、CICD、操作系统、云原生领域,公众号【耳东学堂】,知识星球同名,坚持原创,希望能和大家在运维路上结伴而行 邮箱:erdong@mail.erdong.site

评论

发布
暂无评论
ansible 循环