Ansible Playbook中的循环

前言

接上回《Ansible Playbook中的条件控制》咱继续说。循环是每门语言必不可少的特性,在Ansible中,循环的玩法更是多,但是莫怕,我们常用的循环就那么几类,下面我们就对我们常用的几种Ansible循环展开一番总结。

本文中涉及的试验环境信息如下:

服务器信息如下:
192.168.5.2 # 管理主机
192.168.5.3 # 被管理远程主机
192.168.5.4 # 被管理远程主机


inventory文件内容如下:
[web]
192.168.5.3
192.168.5.4

标准循环

标准循环是指使用with_items来迭代list类型变量,不仅支持简单的字符串列表,还支持哈希列表。下面通过两个简单的例子进行说明。

---
- hosts: web
  gather_facts: False
  tasks: 
    - name: loops demo
      debug: msg="Echo loops item {{item}}"
      with_items:
        - message1
        - message2

上面的代码会将with_items中的内容依次代入debug中进行输出,上述代码的输出内容如下:

ok: [192.168.5.3] => (item=message1) => {
    "msg": "Echo loops item message1"
}
ok: [192.168.5.3] => (item=message2) => {
    "msg": "Echo loops item message2"
}
ok: [192.168.5.4] => (item=message1) => {
    "msg": "Echo loops item message1"
}
ok: [192.168.5.4] => (item=message2) => {
    "msg": "Echo loops item message2"
}

对于哈希列表同样也是可以的,比如这样子:

---


- hosts: web
  gather_facts: False
  tasks:
    - name: loops demo
      debug: msg="name={{item.name}}, age={{item.age}}"
      with_items:
        - {name: "Yanggd", age: "27"}
        - {name: "Yanglx", age: "5"}

对于这段代码,输出是这个样子的:

ok: [192.168.5.3] => (item={u'age': u'27', u'name': u'Yanggd'}) => {
    "msg": "name=Yanggd, age=27"
}
ok: [192.168.5.3] => (item={u'age': u'5', u'name': u'Yanglx'}) => {
    "msg": "name=Yanglx, age=5"
}
ok: [192.168.5.4] => (item={u'age': u'27', u'name': u'Yanggd'}) => {
    "msg": "name=Yanggd, age=27"
}
ok: [192.168.5.4] => (item={u'age': u'5', u'name': u'Yanglx'}) => {
    "msg": "name=Yanglx, age=5"
}
如果同时使用 whenwith_items(或其它循环声明),那么 when声明会为每次循环都单独判断依次。

嵌套循环

嵌套循环就是循环里套循环,在我们用Java或者其它语言时,在Ansible中使用with_nested进行的演义,那这个嵌套循环怎么玩呢?通过一个简单的例子来演示一下,一看就懂了。

---


- hosts: "192.168.5.3"
  gather_facts: False
  tasks:
    - name: loop and loop
      debug: msg="outside loop {{item[0]}}, inside loop {{item[1]}}"
      with_nested: 
        - ['A', 'B']
        - [1, 2, 3]

由于输出会很多,所以这里只用了一台远程服务器进行演示。如果一眼看不明白,把输出结果贴上,就可以更清楚了:

ok: [192.168.5.3] => (item=[u'A', 1]) => {
    "msg": "outside loop A, inside loop 1"
}
ok: [192.168.5.3] => (item=[u'A', 2]) => {
    "msg": "outside loop A, inside loop 2"
}
ok: [192.168.5.3] => (item=[u'A', 3]) => {
    "msg": "outside loop A, inside loop 3"
}
ok: [192.168.5.3] => (item=[u'B', 1]) => {
    "msg": "outside loop B, inside loop 1"
}
ok: [192.168.5.3] => (item=[u'B', 2]) => {
    "msg": "outside loop B, inside loop 2"
}
ok: [192.168.5.3] => (item=[u'B', 3]) => {
    "msg": "outside loop B, inside loop 3"
}

对哈希表使用循环

相比于上面的标准循环,哈希表循环能支持更丰富的数据结构。通过上面的总结,我们知道,标准的循环最外层数据必须是Python的list数据类型,而哈希表循环可以直接支持yaml格式的数据变量。来个小小的例子解读一下:

---


- hosts: "192.168.5.3"
  gather_facts: False
  vars:
    website:
      www.jellythink.com:
        author: Yanggd
        type: IT
      www.qq.com:
        author: Pony
        type: General
  tasks:
    - name: loops demo
      debug: msg="website name:{{item.key}}, author is {{item.value.author}}, type is {{item.value.type}}"
      with_dict: "{{website}}"

通过with_dict来玩转这个哈希表循环,上面代码的输出如下所示:

ok: [192.168.5.3] => (item={'value': {u'type': u'General', u'author': u'Pony'}, 'key': u'www.qq.com'}) => {
    "msg": "website name:www.qq.com, author is Pony, type is General"
}
ok: [192.168.5.3] => (item={'value': {u'type': u'IT', u'author': u'Yanggd'}, 'key': u'www.jellythink.com'}) => {
    "msg": "website name:www.jellythink.com, author is Yanggd, type is IT"
}

有没有品出什么???

对文件列表使用循环

有些时候,我们需要针对某一目录下指定格式的文件进行处理,这个时候使用with_fileglob循环去匹配我们需要处理的文件就非常方便了。比如这样子:

---


- hosts: "192.168.5.3"
  gather_facts: False
  tasks:
    - name: file loops
      debug: msg="file name is {{item}}"
      with_fileglob:
        - /etc/*.conf

with_fileglob会匹配etc目录下所有以conf结尾的文件,当做item变量。输出内容有点多,这里就不展示了。

总结

呵呵,这么简单的一个循环,总结了这么长的一篇文章,不要怪我,我的文章就是这么实在,没有一点点水分,少了一些干瘪的文字,多了一些实际的代码,希望你喜欢这样的文章。如果觉的还不错,可以点击下方的“打赏”哦,又或扫描右边的二维码,关注一波也是不错的。

哎,中午又喝了酒,抽了烟,糟蹋了自己的身体;但人生不就是这样么~~~


人生是个圆,有的人走了一辈子也没有走出命运画出的圆圈,其实,圆上的每一个点都有一条腾飞的切线。

dcc9a882ccf943737994a1e18eb99b9c.jpeg

玩代码、玩技术

长按识别二维码,关注“果冻想”

如果觉得还不错,可以点个“在看”哦~

posted @ 2020-10-28 09:06  ^_^果冻^_^  阅读(2)  评论(0编辑  收藏  举报  来源