ansible——playbook循环

1.标准loop

通过with_items参数实现,item会去with_items这个数组中轮询取值。
定义normal_loos.yaml:

复制代码
---
- hosts: all
  gather_facts: False
  tasks:
    - name: debug loops
      debug: msg="name ------> {{ item }}"
      with_items:
        - one
        - two
复制代码

执行结果:

当然可以支持键值对的方式:
定义normal2_loops.yaml:

复制代码
---
- hosts: all
  gather_facts: False
  tasks:
    - name: debug loops
      debug: msg="name ------> {{ item.key }} value ------> {{ item.value }}"
      with_items:
        - {key: "one", value: "VALUE1"}
        - {key: "two", value: "VALUE2"}
复制代码

执行结果:

 

2.嵌套Loops

主要实现多个循环体的合并。
定义nest_loop.yaml:

复制代码
---
- hosts: all
  gather_facts: False
  tasks:
    - name: debug loops
      debug: msg="name->{{ item[0] }} value->{{ item[1] }}"
      with_nested:
         - ['A']
         - ['a','b','b']
复制代码

执行结果:

解释说明:
  with_nested是一个数组.
  item[0]表示这个数组的第一个元素,也就是['A']
  item[1]表示这个数组的第二个元素,也就是['a','b','b']
  然后分别循环这两个元素。

 

3.散列loops

标准loop支持的是数组,类似于python中的列表。
嵌套loop其实使用是[{},{}]这种列表套字典的形式,
而散列loop可以直接支持字典形式,只是变相要遵循yaml格式。

定义:  hash_loop.yaml

复制代码
---
- hosts: all
  gather_facts: Fasle
  vars:
    user:
      kebi:
        name: zhangrongkai
        addr: luotian
      maoxian: 
        name: songlixing
        addr: xiaochang

  tasks:
    - name: debug loops
      debug: msg="name--->{{ item.key }} value--->{{ item.value.name }} addr---{{ item.value.addr }}"
      with_dict: "{{ user }}"
复制代码

将其转化为python中的字典格式:

复制代码
user = {
    "kebi": {
        "name": "zhangrongkai",
        "addr": "luotian"
    },
    "maoxian": {
        "name": "songlixing",
        "addr": "xiaochang"
    }
}
复制代码

item=user,key=[kebi,maoxian],然后取其属性值。

注意这里:with_dict: "{{ user }}"
在2.0之前,采用的是这种格式:with_dict: user
否则就会报错:

 

4.文件配置loops

在某些时候,我们需要针对某一类型的文件进行一些操作,这个时候就可以使用fileglob这个参数。
通过这个fileglob就能匹配到相应的文件,然后就可以进行相应的操作。
定义:file_loop.yaml

---
- hosts: all
  tasks:
    - name: debug loops
      debug: msg="filename--->{{ item }}"
      with_fileglob:
        - /tmp/*.py

执行结果:

在ansible内部其实是调用python模块glob,然后进行如下操作:
  glob.glob("/tmp/*.py")

 

5.随机选择loops

随机选择item数组中的一个值。
定义:random_loop.yaml

复制代码
---
- hosts: all
  tasks:
     - name: debug loops
       debug: msg="name--->{{ item }}"
       with_random_choice:
         - "test1"
         - "test2"
         - "test3"
复制代码

执行结果:

内部其实就是使用python的random模块来实现。

 

6.条件判断

有时候,我们需要执行一个操作,这个操作可能失败,我们希望5秒之后再去尝试执行,
这样的操作重复5次,如果还不行就退出。
定义:case_loop.yaml

复制代码
---
- hosts: all
  tasks:
    - name: debug loops
      shell: cat /etc/hostname
      register: host
      until: host.stdout.startswith("centos")
      retries: 5
      delay: 5
复制代码

执行结果:

解释说明:
  name: debug loops #任务名称,非必需
  shell: cat /etc/hostname #操作
  register: host #操作的结果赋值给host
  until: host.stdout.startswith("centos") #直到...成立
  retries: 5 #重复5次
  delay: 5 #每个5秒重复一次

如果操作失败,是下面结果:

 

7.文件优先匹配Loops

文件优先匹配会根据你传入的变量或者文件进行从上往下匹配,如果匹配到某个文件,它会用这个文件当作{{item}}的值。

---
- hosts: all
  tasks:
    - name: debug loops
      debug: msg="file--->{{ item }}"
      with_first_found:
        - "{{ ansible_distribution }}.yaml"
        - "default.yaml

 

8.register Loops

之前通过register定义ret来接收shell操作的结果。
当时之前接收的是一个数据,但是现在确实接收多个。

定义:  register_loop.yaml

复制代码
---
- hosts: all
  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 %}"
复制代码

执行结果:

posted @   明王不动心  阅读(1391)  评论(0编辑  收藏  举报
编辑推荐:
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
阅读排行:
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
点击右上角即可分享
微信分享提示