ansible笔记(23):循环(五)

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

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

所属分类:ansible 运维技术

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

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

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

现在我有一个需求,我需要使用ansible在目标主机中创建5个目录,这5个目录的名字是test2、test4、test6、test8、test10,我该怎么办呢?当然,我可以使用 shell 模块执行一条命令去完成,但是我们现在正在总结"循环"的使用方法,所以,我要用循环完成这个需求,使用循环完成这个任务很简单,我们只需要借助一个循环的关键字,它就是"with_sequence",放开刚才的需求不说,我们先来看一个"with_sequence"的小示例,示例playbook如下:

---
- hosts: test70
  remote_user: root
  gather_facts: no
  tasks:
  - debug:
      msg: "{{ item }}"
    with_sequence: start=1 end=5 stride=1

我们先不用纠结上例的"with_sequence"设置是什么意思,我们先来看一下上例的执行效果,先执上述playbook后,debug模块的输出结果如下

TASK [debug] ***************************
ok: [test70] => (item=1) => {
    "changed": false,
    "item": "1",
    "msg": "1"
}
ok: [test70] => (item=2) => {
    "changed": false,
    "item": "2",
    "msg": "2"
}
ok: [test70] => (item=3) => {
    "changed": false,
    "item": "3",
    "msg": "3"
}
ok: [test70] => (item=4) => {
    "changed": false,
    "item": "4",
    "msg": "4"
}
ok: [test70] => (item=5) => {
    "changed": false,
    "item": "5",
    "msg": "5"
}

如输出信息所示,debug模块被循环调用了5次,msg的值从1一直输出到了5,值的大小每次增加1,没错,这正是"with_sequence"关键字的作用,"with_sequence"可以帮助我们按照顺序生成数字序列,上例的playbook中,with_sequence的设置是"start=1 end=5 stride=1",其中start=1表示从1开始,end=5表示到5结束, stride=1表示步长为1,即从1到5每次增加1。

我们也可以换一种书写格式,如下格式如上例中的格式效果相同

    with_sequence:
      start=1
      end=5
      stride=1

其实,还有一种更简单的写法,能够生成连续的数字序列,写法如下:

---
- hosts: test70
  remote_user: root
  gather_facts: no
  tasks:
  - debug:
      msg: "{{item}}"
    with_sequence: count=5

上例中count=5表示数字序列默认从1开始,到5结束,默认步长为1,与上述两种写法的效果相同。

当我们不指定stride的值时,stride的值默认为1,但是,当end的值小于start的值时,则必须指定stride的值,而且stride的值必须是负数,示例如下:

---
- hosts: test70
  remote_user: root
  gather_facts: no
  tasks:
  - debug:
      msg: "{{item}}"
    with_sequence: start=6 end=2 stride=-2
上例中start的值为6,end的值为2,stride的值为-2,表示从6开始,每次减2,到2结束,上例playbook的执行结果如下:
TASK [debug] ***************************
ok: [test70] => (item=6) => {
    "changed": false,
    "item": "6",
    "msg": "6"
}
ok: [test70] => (item=4) => {
    "changed": false,
    "item": "4",
    "msg": "4"
}
ok: [test70] => (item=2) => {
    "changed": false,
    "item": "2",
    "msg": "2"
}

看完上述总结,你肯定已经明白了"with_sequence"循环的用法,所以,我们可以使用"with_sequence"完成上述创建目录的需求,示例playbook如下:

---
- hosts: test70
  remote_user: root
  gather_facts: no
  tasks:
  - file:
      path: "/testdir/testdir/test{{ item }}"
      state: directory
    with_sequence:
      start=2
      end=10
      stride=2

"with_sequence"还有一个小功能,就是"格式化"输出数据的功能,"格式化数据"的方法与 C语言 的printf函数的使用方法类似,如果你不了解printf函数,可以参考博客中的文章:printf命令总结,这篇文章介绍了 linux 下printf命令的用法,虽然C语言的printf与linux的printf命令的使用方法并不完全相同,但是大致类似,还是能够对理解"with_sequence"的格式化功能有所帮助的,此处假设你已经阅读了对应的文章或者已经理解了printf的使用方法,那么我们来看一个格式化数据的小示例,playbook如下:

---
- hosts: test70
  remote_user: root
  gather_facts: no
  tasks:
  - debug:
      msg: "{{item}}"
    with_sequence: start=2 end=6 stride=2 format="number is %0.2f"

如上例所示,使用"format"可以指定数据输出的格式,上例中我指定的数据格式为"number is %0.2f",其中,"number is "是我指定的固定字符串," %0.2f"表示将数字格式化为一个保留两位小数点的浮点数,那么上例的playbook执行后debug模块输出信息如下:

TASK [debug] ***************************
ok: [test70] => (item=number is 2.00) => {
    "changed": false,
    "item": "number is 2.00",
    "msg": "number is 2.00"
}
ok: [test70] => (item=number is 4.00) => {
    "changed": false,
    "item": "number is 4.00",
    "msg": "number is 4.00"
}
ok: [test70] => (item=number is 6.00) => {
    "changed": false,
    "item": "number is 6.00",
    "msg": "number is 6.00"
}

从输出结果可以看出,最终的信息格式与我们所指定的格式完全一致。

"with_sequence"说完了,再来了解一个新的关键字,它就是"with_random_choice"

"with_random_choice"的用法非常简单,使用"with_random_choice"可以从列表的多个值中随机返回一个值,先来看一个小示例,playbook如下:

---
- hosts: test70
  remote_user: root
  gather_facts: no
  tasks:
  - debug:
      msg: "{{item}}"
    with_random_choice:
    - 1
    - 2
    - 3
    - 4
    - 5

如上例所示,我们定义了一个列表,列表中有5个值,我们使用"with_random_choice"处理这个列表。

连续执行上例playbook,可以看出每次返回的结果是从列表中随机选中的一个,具体返回结果我就不粘贴了,快动手试试吧~

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

我的微信公众号

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


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

查看所有标签

猜你喜欢:

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

JavaScript Patterns

JavaScript Patterns

Stoyan Stefanov / O'Reilly Media, Inc. / 2010-09-21 / USD 29.99

What's the best approach for developing an application with JavaScript? This book helps you answer that question with numerous JavaScript coding patterns and best practices. If you're an experienced d......一起来看看 《JavaScript Patterns》 这本书的介绍吧!

Base64 编码/解码
Base64 编码/解码

Base64 编码/解码

MD5 加密
MD5 加密

MD5 加密工具

RGB CMYK 转换工具
RGB CMYK 转换工具

RGB CMYK 互转工具