ansible系列(24)--ansible的loop循环语句
1. loop循环语句
在写 playbook 的时候发现了很多 task 都要重复引用某个相同的模块,比如一次启动10个服务,或者一次拷贝10个文件,如果按照传统的写法最少要写10次,这样会显得 playbook 很臃肿。如果使用循环的方式来编写 playbook ,这样可以减少重复编写 task 带来的臃肿。
引用格式:
- 对迭代项的引用,固定变量名为
"item"; - 要在
task中使用with_items或loop关键字给定要迭代的元素列表;
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循环语句的更多相关文章
- Javascript基础系列之(六)循环语句(while语句)
循环语句的作用是反复的执行同一段代码,尽管分几种不同的类型,但其原理几乎相同:只要给定的条件满足,包含在循环体内的语句会不断执行,一旦条件不再满足则终止. while循环是前测试循环,这意味着是否终止 ...
- Javascript基础系列之(六)循环语句(for循环)
如果您希望一遍又一遍地运行相同的代码,并且每次的值都不同,那么使用循环是很方便的. document.write(cars[0] + "<br>"); document ...
- Javascript基础系列之(六)循环语句(break和continue语句)
break和continue语句对循环中的代码执行提供了更为严格的流程控制.break语句可以立刻退出循环,阻止再次执行循环体中的任何代码.continue语句只是退出当前这一循环,根据控制表达式还允 ...
- Javascript基础系列之(六)循环语句(do while循环)
do/while 循环是 while 循环的变体.该循环会执行一次代码块,在检查条件是否为真之前,然后如果条件为真的话,就会重复这个循环. 语法结构如下 do { statement } while ...
- Oracle PL/SQL之LOOP循环控制语句
在PL/SQL中可以使用LOOP语句对数据进行循环处理,利用该语句可以循环执行指定的语句序列.常用的LOOP循环语句包含3种形式:基本的LOOP.WHILE...LOOP和FOR...LOOP. LO ...
- PL/SQL中LOOP循环控制语句
在PL/SQL中可以使用LOOP语句对数据进行循环处理,利用该语句可以循环执行指定的语句序列.常用的LOOP循环语句包含3种形式:基本的LOOP.WHILE...LOOP和FOR...LOOP. LO ...
- [转载]Oracle PL/SQL之LOOP循环控制语句
在PL/SQL中可以使用LOOP语句对数据进行循环处理,利用该语句可以循环执行指定的语句序列.常用的LOOP循环语句包含3种形式:基本的LOOP.WHILE...LOOP和FOR...LOOP. LO ...
- Oracle中PL/SQL的循环语句
在PL/SQL中可以使用LOOP语句对数据进行循环处理,利用该语句可以循环执行指定的语句序列.常用的LOOP循环语句包含3种形式:基本的LOOP.WHILE...LOOP和FOR...LOOP. LO ...
- Oracle LOOP循环控制语句
在PL/SQL中可以使用LOOP语句对数据进行循环处理,利用该语句可以循环执行指定的语句序列.常用的LOOP循环语句包含3种形式:基本的LOOP.WHILE...LOOP和FOR...LOOP. LO ...
- PL/SQL 循环语句
1.基本 LOOP 循环语句 语法: LOOP 语句序列; END LOOP; 其中,语句序列中需要一个EXIT语句或一个EXIT WHEN语句来中断循环. 实例: DECLARE x ) :; BE ...
随机推荐
- java实战字符串4:寻找最长的元音子串的长度
题目描述 定义:当一个字符串只有元音字母(aeiouAEIOU)组成,称为元音字符串.现给定一个字符串,请找出其中最长的元音字符子串,并返回其长度:如果找不到,则返回0. 子串:字符串中任意个连续的字 ...
- #单调队列#JZOJ 1753 锻炼身体
题目 一个\(n*m\)的矩阵,有些格子不能经过,有\(k\)个时段, 要么停留某个格子,要么沿时段规定的方向移动,问最多能够移动多少次 \(n,m,k\leq 200\) 分析 题目已经提示了\(O ...
- 体验Semantic Kernel图片内容识别
前言 前几日在浏览devblogs.microsoft.com的时候,看到了一篇名为Image to Text with Semantic Kernel and HuggingFace的文章.这篇文章 ...
- 活动报名|OpenHarmony 战“码”先锋,PR 征集令
OpenAtom OpenHarmony(以下简称"OpenHarmony")工作委员会首度发起「OpenHarmony 开源贡献者计划」,旨在鼓励开发者参与 OpenHarmon ...
- SpringBoot中bean的生命周期
目录 概述 使用场景 代码演示bean初始化 TestSupport BeanPostProcessorImpl log 代码 概述 Bean 生命周期管理是 Spring Boot 中的关键功能之一 ...
- C 语言中的 switch 语句和 while 循环详解
C 语言中的 switch 语句 替代多重 if..else 语句,可以使用 switch 语句.switch 语句用于选择多个代码块中的一个来执行 switch(表达式) { case x: // ...
- TAMUctf 2024 RSA-证书修复-总结
上周末跟朋友们参加了TAMUctf 2024国际赛,最终排在了第14名,还是很不错的成绩. 本次比赛Monk师傅也是出了三个RSA证书修复问题的题目,质量很不错.这里给大家整理一下供学习. Trunc ...
- Python调用动态库,获取BSTR字符串
今天客户在用Python调用我们的动态库的时候,遇到一个问题,调用动态库中的函数,函数返回的是BSTR字符串,但是客户接收到的是一个8位长度的数字. 动态库函数原型:EXTERN_C BSTR ELO ...
- ip 记录路由选项
前言 准备整理网络这块,先把概念整理. ip记录路由选项,这个是做什么的呢? 比如说我们发的一条信息,从一端到另外一端经过了那些路由呢?这是一个问题啊. 这个ip记录路由选项就是来看这个问题的,当然这 ...
- 【最简单】禁用Chrome的“请停用以开发者模式运行的扩展程序”提示
安装油猴插件后,每次打开Chrome浏览器后右上角都会提示,"请停用以开发者模式运行的扩展程序"的一个窗口,强迫症患者表示很烦. 小白的我试过网上多数方法,有些已经失效,有些都太麻 ...