1. loop循环语句

在写 playbook 的时候发现了很多 task 都要重复引用某个相同的模块,比如一次启动10个服务,或者一次拷贝10个文件,如果按照传统的写法最少要写10次,这样会显得 playbook 很臃肿。如果使用循环的方式来编写 playbook ,这样可以减少重复编写 task 带来的臃肿。

引用格式:

  • 对迭代项的引用,固定变量名为"item"
  • 要在task中使用with_itemsloop关键字给定要迭代的元素列表;

1.1 使用循环批量安装软件

  • 方式一:

    [root@xuzhichao playbook]# cat loop_install.yml
    - hosts: NginxWebs
    remote_user: root tasks:
    - name: Install Packages
    yum:
    name: "{{ item }}"
    state: present
    loop:
    - httpd
    - mariadb-server
  • 运行playbook

    root@xuzhichao playbook]# ansible-playbook loop_install.yml 
    
    PLAY [NginxWebs] **********************************************************************************************************************************************
    
    TASK [Install Packages] ***************************************************************************************************************************************
    ok: [192.168.20.23] => (item=httpd)
    ok: [192.168.20.22] => (item=httpd)
    changed: [192.168.20.23] => (item=mariadb-server)
    changed: [192.168.20.22] => (item=mariadb-server) PLAY RECAP ****************************************************************************************************************************************************
    192.168.20.22 : ok=1 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
    192.168.20.23 : ok=1 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
  • 方式二:

    [root@xuzhichao playbook]# cat loop_install1.yml
    - hosts: NginxWebs
    remote_user: root
    vars:
    packages:
    - httpd
    - mariadb-server tasks:
    - name: Install Packages
    yum:
    name: "{{ packages }}"
    state: present
  • 运行playbook

    [root@xuzhichao playbook]# ansible-playbook loop_install1.yml
    
    PLAY [NginxWebs] **********************************************************************************************************************************************
    
    TASK [Install Packages] ***************************************************************************************************************************************
    changed: [192.168.20.23]
    changed: [192.168.20.22] PLAY RECAP ****************************************************************************************************************************************************
    192.168.20.22 : ok=1 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
    192.168.20.23 : ok=1 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0

1.2 使用循环批量启动服务

playbook文件如下:

[root@xuzhichao playbook]# cat loop_service.yml
- hosts: NginxWebs
remote_user: root tasks:
- name: Start Service
service:
name: "{{ item }}"
state: started
loop:
- httpd
- mariadb-server

运行playbook:

[root@xuzhichao playbook]# ansible-playbook -C loop_service.yml 

PLAY [NginxWebs] **********************************************************************************************************************************************

TASK [Start Service] ******************************************************************************************************************************************
changed: [192.168.20.23] => (item=httpd)
changed: [192.168.20.22] => (item=httpd)
changed: [192.168.20.23] => (item=mariadb-server)
changed: [192.168.20.22] => (item=mariadb-server) PLAY RECAP ****************************************************************************************************************************************************
192.168.20.22 : ok=1 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
192.168.20.23 : ok=1 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0

1.3 使用循环批量创建用户

批量创建用户,使用 key values 字典的方式。

[root@xuzhichao playbook]# cat loop_createuser.yml
- hosts: NginxWebs
tasks:
- name: Create Groups
group:
name: "{{ item }}"
state: present
loop:
- group1
- group2
- group3 - name: Create Users
user:
name: "{{ item.user }}"
group: "{{ item.group }}"
uid: "{{ item.uid }}"
state: present
create_home: yes
loop:
- { user: user1, group: group1, uid: 2001 }
- { user: user2, group: group2, uid: 2002 }
- { user: user3, group: group3, uid: 2003 }

运行playbook

[root@xuzhichao playbook]# ansible-playbook -C loop_createuser.yml 

PLAY [NginxWebs] **********************************************************************************************************************************************

TASK [Create Groups] ******************************************************************************************************************************************
ok: [192.168.20.23] => (item=group1)
ok: [192.168.20.22] => (item=group1)
ok: [192.168.20.23] => (item=group2)
ok: [192.168.20.22] => (item=group2)
changed: [192.168.20.23] => (item=group3)
changed: [192.168.20.22] => (item=group3) TASK [Create Users] *******************************************************************************************************************************************
changed: [192.168.20.22] => (item={u'group': u'group1', u'user': u'user1', u'uid': 2001})
changed: [192.168.20.23] => (item={u'group': u'group1', u'user': u'user1', u'uid': 2001})
changed: [192.168.20.22] => (item={u'group': u'group2', u'user': u'user2', u'uid': 2002})
changed: [192.168.20.23] => (item={u'group': u'group2', u'user': u'user2', u'uid': 2002})
changed: [192.168.20.23] => (item={u'group': u'group3', u'user': u'user3', u'uid': 2003})
changed: [192.168.20.22] => (item={u'group': u'group3', u'user': u'user3', u'uid': 2003}) PLAY RECAP ****************************************************************************************************************************************************
192.168.20.22 : ok=2 changed=2 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
192.168.20.23 : ok=2 changed=2 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0

1.4 使用循环批量拷贝文件

在需要拷贝多个文件,这些文件又有不同的属主属组权限等属性时,而且拷贝到的目标目录不同时,可以使用循环来拷贝文件。

示例,playbook文件如下:

[root@xuzhichao playbook]# cat loop_copyfile.yml
- hosts: NginxWebs
tasks:
- name: Copy Configuer File
template:
src: "{{ item.src }}"
dest: "{{ item.dest }}"
owner: "{{ item.owner }}"
group: "{{ item.group }}"
omode: "{{ item.mode }}"
loop:
- { src: "conf/nginx.conf.j2", dest: "/etc/nginx/nginx.conf", owner: "root", group: "root", mode: "0644" }
- { src: "conf/example.com.conf.j2", dest: "/etc/nginx/conf.d/example.con.conf", owner: "root", group: "root", mode: "0644" }
- { src: "file/index.html", dest: "/data/nginx/example/index.html", owner: "nginx", group: "nginx", mode: 0644 }

创建相关模板文件:

[root@xuzhichao playbook]# touch conf/nginx.conf.j2
[root@xuzhichao playbook]# touch conf/example.com.conf.j2
[root@xuzhichao playbook]# touch file/index.html

运行playbook

[root@xuzhichao playbook]# ansible-playbook -C loop_copyfile.yml 

PLAY [NginxWebs] ****************************************************************************************************************************

TASK [Copy Configuer File] *****************************************************************************************************************************
changed: [192.168.20.23] => (item={u'dest': u'/etc/nginx/nginx.conf', u'src': u'conf/nginx.conf.j2', u'group': u'root', u'mode': u'0644', u'owner': u'root'})
changed: [192.168.20.22] => (item={u'dest': u'/etc/nginx/nginx.conf', u'src': u'conf/nginx.conf.j2', u'group': u'root', u'mode': u'0644', u'owner': u'root'})
changed: [192.168.20.22] => (item={u'dest': u'/etc/nginx/conf.d/example.con.conf', u'src': u'conf/example.com.conf.j2', u'group': u'root', u'mode': u'0644', u'owner': u'root'})
changed: [192.168.20.23] => (item={u'dest': u'/etc/nginx/conf.d/example.con.conf', u'src': u'conf/example.com.conf.j2', u'group': u'root', u'mode': u'0644', u'owner': u'root'})
changed: [192.168.20.23] => (item={u'dest': u'/data/nginx/example/index.html', u'src': u'file/index.html', u'group': u'nginx', u'mode': 420, u'owner': u'nginx'})
changed: [192.168.20.22] => (item={u'dest': u'/data/nginx/example/index.html', u'src': u'file/index.html', u'group': u'nginx', u'mode': 420, u'owner': u'nginx'})

ansible系列(24)--ansible的loop循环语句的更多相关文章

  1. Javascript基础系列之(六)循环语句(while语句)

    循环语句的作用是反复的执行同一段代码,尽管分几种不同的类型,但其原理几乎相同:只要给定的条件满足,包含在循环体内的语句会不断执行,一旦条件不再满足则终止. while循环是前测试循环,这意味着是否终止 ...

  2. Javascript基础系列之(六)循环语句(for循环)

    如果您希望一遍又一遍地运行相同的代码,并且每次的值都不同,那么使用循环是很方便的. document.write(cars[0] + "<br>"); document ...

  3. Javascript基础系列之(六)循环语句(break和continue语句)

    break和continue语句对循环中的代码执行提供了更为严格的流程控制.break语句可以立刻退出循环,阻止再次执行循环体中的任何代码.continue语句只是退出当前这一循环,根据控制表达式还允 ...

  4. Javascript基础系列之(六)循环语句(do while循环)

    do/while 循环是 while 循环的变体.该循环会执行一次代码块,在检查条件是否为真之前,然后如果条件为真的话,就会重复这个循环. 语法结构如下 do { statement } while ...

  5. Oracle PL/SQL之LOOP循环控制语句

    在PL/SQL中可以使用LOOP语句对数据进行循环处理,利用该语句可以循环执行指定的语句序列.常用的LOOP循环语句包含3种形式:基本的LOOP.WHILE...LOOP和FOR...LOOP. LO ...

  6. PL/SQL中LOOP循环控制语句

    在PL/SQL中可以使用LOOP语句对数据进行循环处理,利用该语句可以循环执行指定的语句序列.常用的LOOP循环语句包含3种形式:基本的LOOP.WHILE...LOOP和FOR...LOOP. LO ...

  7. [转载]Oracle PL/SQL之LOOP循环控制语句

    在PL/SQL中可以使用LOOP语句对数据进行循环处理,利用该语句可以循环执行指定的语句序列.常用的LOOP循环语句包含3种形式:基本的LOOP.WHILE...LOOP和FOR...LOOP. LO ...

  8. Oracle中PL/SQL的循环语句

    在PL/SQL中可以使用LOOP语句对数据进行循环处理,利用该语句可以循环执行指定的语句序列.常用的LOOP循环语句包含3种形式:基本的LOOP.WHILE...LOOP和FOR...LOOP. LO ...

  9. Oracle LOOP循环控制语句

    在PL/SQL中可以使用LOOP语句对数据进行循环处理,利用该语句可以循环执行指定的语句序列.常用的LOOP循环语句包含3种形式:基本的LOOP.WHILE...LOOP和FOR...LOOP. LO ...

  10. PL/SQL 循环语句

    1.基本 LOOP 循环语句 语法: LOOP 语句序列; END LOOP; 其中,语句序列中需要一个EXIT语句或一个EXIT WHEN语句来中断循环. 实例: DECLARE x ) :; BE ...

随机推荐

  1. Games101 -- 作业3

    说明 本次作业主要是实现对一个obj文件表示的物体利用贴图进行渲染 rasterizer.cpp框架分析 和作业二类似,只不过颜色不再是固定值,而是通过纹理获得 //draw 函数 // Also p ...

  2. 使用FlashFXP,密钥方式连接Amazon的CE2实例

    操作步骤如下: 1.选择"站点" -> "密钥管理器" 2.选择"导入" 3.名称随意填, 类型选择"用于SFTP的RSA/ ...

  3. 【已解决】MySQL5.x和MySQL8.x 密码验证的区别(修改MySQL数据库密码的验证方式)

    mysql5.x使用的是 mysql_native_password mysql8.x使用的是 caching_sha2_password 1. 进入mysql mysql -u root -p 2. ...

  4. Windows11右键菜单设置成Win10旧版模式

    Windows按键+X,打开终端(cmd),复制命令    reg add "HKCU\Software\Classes\CLSID\{86ca1aa0-34aa-4e8b-a509-50c ...

  5. jcmd:JDK14中的调试神器

    目录 简介 jcmd的语法 列出运行的JVM 打印stack信息 打印heap info 打印heap dump 统计heap使用情况 JFR功能 总结 简介 jcmd是JDK自带的调试工具,具有非常 ...

  6. Qt实现多图片合成PDF文件

    需求:纯Qt,把多张图片合成到一个PDF文件中 // 合成PDF // include <QPdfWriter> QString pdfFileName = "D:\\a.pdf ...

  7. mysql 重新整理——索引优化explain字段介绍二 [十]

    前言 紧接上文. 正文 type type字段有如下类型: 1.all 2.index 3.rang 4.ref 5.eq_ref 6.const,system 7.null 最好到最差的顺序为: s ...

  8. 实战:如何编写一个 OpenTelemetry Extensions

    前言 前段时间我们从 SkyWalking 切换到了 OpenTelemetry ,与此同时之前使用 SkyWalking 编写的插件也得转移到 OpenTelemetry 体系下. 我也写了相关介绍 ...

  9. MUI-拿到版本名称和版本code

    场景: 一般App发布了新版本之后,都会提示用户去更新.这就需要我们获取App的当前版本号与后台存储的版本号做对比来判断是否需要更新. 获取版本名称和版本code: 打开manifest.json文件 ...

  10. mac笔记本esc按键失灵(系统13ventura13.3.1 2019款i7)

    1.原因 mac系统存在bug,有几率碰到,此时siri卡死无法唤出,笔记本使用了一年多接近两年,第一碰到 2.解决方案 重启 任务管理器杀掉siri