ansible笔记(21):循环(三)

前文中我们已经了解了一些用于循环的关键字,比如 with_list、with_items、with_flattened、with_together,这篇文章我们继续。

假设,现在我有一个需求,我需要在目标主机的测试目录中创建a、b、c三个目录,这三个目录都有相同的子目录,它们都有test1和test2两个子目录,使用最原始的办法,我们可以在目标主机上执行如下一堆命令

# pwd  /testdir/testdir  # mkdir -p a/test1  # mkdir -p a/test2  # mkdir -p b/test1  # mkdir -p b/test2  # mkdir -p c/test1  # mkdir -p c/test2  

当然,我们也可以使用稍微讨巧一点的方法,执行如下命令

# mkdir -p {a,b,c}/{test1,test2}  

如果我们想要使用ansible完成上述需求,我们该怎么做呢?我们能够使用shell模块执行上述命令吗?我们来试试,在ansible主机上执行如下命令

# ansible test70 -m shell -a "mkdir -p /testdir/testdir/{a,b,c}/{test1,test2}"  

我们使用上述命令成功的在目标主机上创建了符合我们要求的目录结构,其实,我们还能够使用循环完成上述工作,如果想要使用循环来完成上述工作,则需要先了解一个用于循环的关键字,这个关键字就是”with_cartesian”,这个关键字怎么使用呢?有怎样的效果的呢?来看一个小示例playbook,如下

---  - hosts: test70    remote_user: root    gather_facts: no    tasks:    - debug:        msg: "{{ item }}"      with_cartesian:      - [ a, b, c ]      - [ test1, test2 ]  

上例中定义了一个嵌套的列表,其中嵌套了两个小列表,第一个小列表中有a、b、c三个元素,第二个小列表中有test1、test2两个元素,然后我们使用 with_cartesian关键字处理这个嵌套的列表,然后循环调用debug模块输出了item的值,执行上例playbook后,debug模块的输出信息如下

TASK [debug] ***********************************  ok: [test70] => (item=[u'a', u'test1']) => {      "changed": false,      "item": [          "a",          "test1"      ],      "msg": [          "a",          "test1"      ]  }  ok: [test70] => (item=[u'a', u'test2']) => {      "changed": false,      "item": [          "a",          "test2"      ],      "msg": [          "a",          "test2"      ]  }  ok: [test70] => (item=[u'b', u'test1']) => {      "changed": false,      "item": [          "b",          "test1"      ],      "msg": [          "b",          "test1"      ]  }  ok: [test70] => (item=[u'b', u'test2']) => {      "changed": false,      "item": [          "b",          "test2"      ],      "msg": [          "b",          "test2"      ]  }  ok: [test70] => (item=[u'c', u'test1']) => {      "changed": false,      "item": [          "c",          "test1"      ],      "msg": [          "c",          "test1"      ]  }  ok: [test70] => (item=[u'c', u'test2']) => {      "changed": false,      "item": [          "c",          "test2"      ],      "msg": [          "c",          "test2"      ]  }  

从输出信息可以看出,第一个小列表中的每个元素与第二个小列表中的每个元素都”两两组合在了一起”,如下图所示

聪明如你一定看出来了,上图中的排列组合方式就好像笛卡尔乘积中的一样,所以,”with_cartesian”关键字的作用就是将每个小列表中的元素按照”笛卡尔的方式”组合后,循环的处理每个组合,所以,你一定已经想到了,我们可以利用这个特性,完成我们之前创建目录的需求,示例playbook如下:

---  - hosts: test70    remote_user: root    gather_facts: no    tasks:    - file:        state: directory        path: "/testdir/testdir/{{ item.0 }}/{{ item.1 }}"      with_cartesian:      - [ a, b, c ]      - [ test1, test2 ]  

上例playbook执行后,即可在目标主机中创建出符合我们要求的目录,有了前文中的各种示例作为基础,我想你一定已经看明白了。

其实,还有一个关键字可以代替”with_cartesian”,它就是”with_nested”,”with_nested”与”with_cartesian”的效果一致,可以无差别使用他们。

好了,这篇文章就总结到这里,希望对你有所帮助。

原文出处:zsythink -> https://www.zsythink.net/archives/2781

本站所发布的一切资源仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。本站信息来自网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容。如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。如果侵犯你的利益,请发送邮箱到 [email protected],我们会很快的为您处理。