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

栏目: 服务器 · 发布时间: 5年前

内容简介:所属分类:ansible
  • A+

所属分类:ansible 运维技术

在本博客中,ansible是一个系列文章,我们会尽量以通俗易懂的方式总结ansible的相关知识点。

ansible系列博文直达链接:ansible轻松入门系列

"ansible系列"中的每篇文章都建立在前文的基础之上,所以, 请按照顺序阅读这些文章,否则有可能在阅读中遇到障碍。

前文中我们已经了解了一些用于循环的关键字,比如 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"
    ]
}

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

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

聪明如你一定看出来了,上图中的排列组合方式就好像笛卡尔乘积中的一样,所以,"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"的效果一致,可以无差别使用他们。

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

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

我的微信公众号

关注"实用运维笔记"微信公众号,当博客中有新文章时,可第一时间得知哦~


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Beginning XSLT 2.0

Beginning XSLT 2.0

Jeni Tennison / Apress / 2005-07-22 / USD 49.99

This is an updated revision of Tennison's "Beginning XSLT", updated for the new revision of the XSLT standard. XSLT is a technology used to transform an XML document with one structure into another ......一起来看看 《Beginning XSLT 2.0》 这本书的介绍吧!

JSON 在线解析
JSON 在线解析

在线 JSON 格式化工具

SHA 加密
SHA 加密

SHA 加密工具

RGB HSV 转换
RGB HSV 转换

RGB HSV 互转工具