自动化运维工具Ansible实战(七)playbook循环

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介:

(一)简述

    在使用ansible做自动化运维的时候,免不了的要重复执行某些操作,如:添加几个用户,创建几个MySQL用户并为之赋予权限,操作某个目录下所有文件等等。好在playbook支持循环语句,可以使得某些需求很容易而且很规范的实现。


(二)常用的循环语句

1,with_items。with_items是playbooks中最基本也是最常用的循环语句:

语法:

1
2
3
4
5
6
7
8
9
tasks:
- name:Secure config files
     file : path= /etc/ {{ item }} mode=0600 owner=root group=root
     with_items:
         - my.cnf
         - shadow
         - fstab
     或with_items: "{{ somelist }}"
###上面的例子说明在/etc下创建权限级别为600,属主属组都是root三个文件
1
2
3
4
5
6
7
使用with_items迭代循环的变量可以是个单纯的列表,也可以是一个较为复杂 的数据结果,如字典类型:
tasks:
- name: add several  users
   user: name={{ item.name }} state=present  groups ={{ item. groups  }}
   with_items:
     - { name:  'testuser1' groups 'wheel'  }
     - { name:  'testuser2' groups 'root'  }


2、with_nested嵌套循环

示例:

1
2
3
4
5
6
tasks:
- name: give  users  access to multiple databases
   mysql_user: name={{ item[0] }} priv={{ item[1] }}.*:ALL append_privs= yes  password=foo
   with_nested:
     - [  'alice' 'bob'  ]
     - [  'clientdb' 'employeedb' 'providerdb'  ]

item[0]是循环的第一个列表的值['alice','bob']。item[1]是第二个列表的值。表示循环创建alice和bob两个用户,并且为其赋予在三个数据库上的所有权限。

也可以将用户列表事先赋值给一个变量:

1
2
3
4
5
6
tasks:
- name: here,  'users'  contains the above list of employees
   mysql_user: name={{ item[0] }} priv={{ item[1] }}.*:ALL append_privs= yes  password=foo
   with_nested:
     "`users`"
     - [  'clientdb' 'employeedb' 'providerdb'  ]


3、with_dict

with_dict可以遍历更复杂的数据结构。假如有如下变量内容:

1
2
3
4
5
6
7
users :
   alice:
     name: Alice Appleworth
     telephone: 123-456-7890
   bob:
     name: Bob Bananarama
     telephone: 987-654-3210
1
2
3
4
5
####现在需要输出每个用户的用户名和手机号:
tasks:
   - name: Print phone records
     debug: msg= "User {{ item.key }} is {{ item.value.name }} ({{ item.value.telephone }})"
     with_dict:  "{{ users }}"


4、with_fileglob文件匹配遍历

1
2
3
4
5
6
7
8
9
10
####可以指定一个目录,使用with_fileglob可以循环这个目录中的所有文件,示例如下:
tasks:
- name:Make key directory     
       file : path= /root/ .sshkeys ensure=directory mode=0700 owner=root group=root     
- name:Upload public keys     
       copy: src={{ item }} dest= /root/ .sshkeys mode=0600 owner=root group=root     
       with_fileglob:
         - keys/*.pub     
- name:Assemble keys into authorized_keys  file     
       assemble: src= /root/ .sshkeys dest= /root/ . ssh /authorized_keysmode =0600 owner=root group=root

5、with_subelement遍历子元素

假如现在需要遍历一个用户列表,并创建每个用户,而且还需要为每个用户配置以特定的SSH key登录。变量文件内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
users :
   - name: alice
     authorized:
       /tmp/alice/onekey .pub
       /tmp/alice/twokey .pub
     mysql:
         password: mysql-password
         hosts:
           "%"
           "127.0.0.1"
           "::1"
           "localhost"
         privs:
           "*.*:SELECT"
           "DB1.*:ALL"
   - name: bob
     authorized:
       /tmp/bob/id_rsa .pub
     mysql:
         password: other-mysql-password
         hosts:
           "db1"
         privs:
           "*.*:SELECT"
           "DB2.*:ALL"
1
2
3
4
5
6
7
###playbook中定义如下:
- user: name={{ item.name }} state=present generate_ssh_key= yes
   with_items:  "`users`"
- authorized_key:  "user={{ item.0.name }} key='{{ lookup('file', item.1) }}'"
   with_subelements:
      users
      - authorized
1
2
3
4
5
6
###也可以遍历嵌套的子列表:
- name: Setup MySQL  users
   mysql_user: name={{ item.0.name }} password={{ item.0.mysql.password }} host={{ item.1 }} priv={{ item.0.mysql.privs |  join ( '/' ) }}
   with_subelements:
     users
     - mysql.hosts

6、with_sequence循环整数序列

with_sequence可以生成一个自增的整数序列,可以指定起始值和结束值,也可以指定增长步长。 参数以key=value的形式指定,format指定输出的格式。数字可以是十进制、十六进制、八进制:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
- hosts: all
   tasks:
     # create groups
     - group: name=evens state=present
     - group: name=odds state=present
     # create some test users
     - user: name={{ item }} state=present  groups =evens
       with_sequence: start=0 end=32  format =testuser%02d
     # create a series of directories with even numbers for some reason
     file : dest= /var/stuff/ {{ item }} state=directory
       with_sequence: start=4 end=16 stride=2     # stride用于指定步长
     # a simpler way to use the sequence plugin
     # create 4 groups
     - group: name=group{{ item }} state=present
       with_sequence: count=4


7、with_random_choice随机选择

从列表中随机取一个值:

1
2
3
4
5
6
- debug: msg={{ item }}
   with_random_choice:
      "go through the door"
      "drink from the goblet"
      "press the red button"
      "do nothing"

8、do-Util循环

示例:

1
2
3
4
5
- action: shell  /usr/bin/foo
   register: result
   until : result.stdout. find ( "all systems go" ) != -1
   retries: 5
   delay: 10

重复执行shell模块,当shell模块执行的命令输出内容包含"all systems go"的时候停止。重试5次,延迟时间10秒。retries默认值为3,delay默认值为5。任务的返回值为最后一次循环的返回结果。


9、循环注册变量

在循环中使用register时,保存的结果中包含results关键字,该关键字保存模块执行结果的列表

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
- shell:  echo  "{{ item }}"
   with_items:
     - one
     - two
   register:  echo
变量 echo 内容如下:
{
     "changed" true ,
     "msg" "All items completed" ,
     "results" : [
         {
             "changed" true ,
             "cmd" "echo \"one\" " ,
             "delta" "0:00:00.003110" ,
             "end" "2013-12-19 12:00:05.187153" ,
             "invocation" : {
                 "module_args" "echo \"one\"" ,
                 "module_name" "shell"
             },
             "item" "one" ,
             "rc" : 0,
             "start" "2013-12-19 12:00:05.184043" ,
             "stderr" "" ,
             "stdout" "one"
         },
         {
             "changed" true ,
             "cmd" "echo \"two\" " ,
             "delta" "0:00:00.002920" ,
             "end" "2013-12-19 12:00:05.245502" ,
             "invocation" : {
                 "module_args" "echo \"two\"" ,
                 "module_name" "shell"
             },
             "item" "two" ,
             "rc" : 0,
             "start" "2013-12-19 12:00:05.242582" ,
             "stderr" "" ,
             "stdout" "two"
         }
     ]
}
1
2
3
4
5
6
##遍历注册变量的结果:
- name: Fail  if  return  code is not 0
   fail:
     msg:  "The command ({{ item.cmd }}) did not have a 0 return code"
   when: item.rc != 0
   with_items:  "`echo`.`results`"

10、with_together遍历数据并行集合

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
示例:
- hosts: webservers
   remote_user: root
   vars:
     alpha: [  'a' , 'b' , 'c' , 'd' ]
     numbers: [ 1,2,3,4 ]
   tasks:
     - debug: msg= "{{ item.0 }} and {{ item.1 }}"
       with_together:
          "{{ alpha }}"
          "{{ numbers }}"
输出的结果为:
ok: [192.168.1.65] => (item=[ 'a' , 1]) => {
     "item" : [
         "a" ,
         1
     ],
     "msg" "a and 1"
}
ok: [192.168.1.65] => (item=[ 'b' , 2]) => {
     "item" : [
         "b" ,
         2
     ],
     "msg" "b and 2"
}
ok: [192.168.1.65] => (item=[ 'c' , 3]) => {
     "item" : [
         "c" ,
         3
     ],
     "msg" "c and 3"
}
ok: [192.168.1.65] => (item=[ 'd' , 4]) => {
     "item" : [
         "d" ,
         4
     ],
     "msg" "d and 4"
}

 

loop模块一般在下面的场景中使用

  1. 类似的配置模块重复了多遍

  2. fact是一个列表

  3. 创建多个文件,然后使用assemble聚合成一个大文件

  4. 使用with_fileglob匹配特定的文件管理


本文转自 lqbyz 51CTO博客,原文链接:http://blog.51cto.com/liqingbiao/1969595
相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
打赏
0
0
0
0
344
分享
相关文章
GitHub 热门开源运维工具 Websoft9:如何实现服务器管理效率翻倍?
Websoft9 提供 200+ 开源应用一键部署,支持容器化隔离、GitOps 自动化和企业级安全防护,助力服务器管理效率提升 80%。
55 1
Ansible与Jenkins:自动化工具的对比
Ansible和Jenkins是自动化领域的两大巨头。Ansible专注于配置管理和任务自动化,采用无代理架构,使用YAML定义配置,具有幂等性和可扩展性。Jenkins则擅长持续集成和持续交付(CI/CD),支持丰富的插件生态系统,适用于自动化构建、测试和部署。两者各有优势,Ansible适合配置管理与大规模部署,Jenkins则在CI/CD方面表现出色。结合使用可创建更强大的自动化工作流,提升团队生产力和软件质量。选择工具时应根据具体需求决定。
运维联盟 SOMA 评测系统正式发布,让你的运维工具跑分更丝滑
通过对特定的业务系统进行故障注入,将不同的运维工具放在一起进行评估和评测。
云资源运维难?阿里云免费工具来帮忙
阿里云推出免费运维工具——云服务诊断,帮助用户提升对云资源的运维效率、降低门槛、减轻负担。其核心功能包括「健康状态」和「诊断」。通过「健康状态」可实时查看云资源是否正常;「诊断」功能则能快速排查网络、配置、安全等问题,并提供修复建议,助您迅速恢复业务。体验评测活动火热进行中,参与即有机会赢取索尼头戴耳机、小米背包等好礼。活动链接:https://developer.aliyun.com/topic/cloud-health。
727 24
自动化运维:使用Ansible实现批量服务器配置
在快速迭代的IT环境中,高效、可靠的服务器管理变得至关重要。本文将介绍如何使用Ansible这一强大的自动化工具,来简化和加速批量服务器配置过程。我们将从基础开始,逐步深入到更复杂的应用场景,确保即使是新手也能跟上节奏。文章将不包含代码示例,而是通过清晰的步骤和逻辑结构,引导读者理解自动化运维的核心概念及其在实际操作中的应用。
自动化运维:使用Ansible进行服务器配置管理
在现代IT架构中,自动化运维已成为提升效率、减少人为错误的关键。本文将介绍如何使用Ansible这一强大的自动化工具来简化和标准化服务器的配置管理过程。通过具体的代码示例和操作步骤,我们将展示如何快速部署应用、管理配置以及自动化日常任务,从而确保环境的一致性和可靠性。
,自动化运维成为现代IT基础设施的关键部分。Puppet是一款强大的自动化运维工具
【10月更文挑战第7天】随着云计算和容器化技术的发展,自动化运维成为现代IT基础设施的关键部分。Puppet是一款强大的自动化运维工具,通过定义资源状态和关系,确保系统始终处于期望配置状态。本文介绍Puppet的基本概念、安装配置及使用示例,帮助读者快速掌握Puppet,实现高效自动化运维。
127 4
HTTPS 证书自动化运维:https证书管理系统- 自动化监控
本文介绍如何设置和查看域名或证书监控。步骤1:根据证书状态选择新增域名或证书监控,线上部署推荐域名监控,未部署选择证书监控。步骤2:查询监控记录详情。步骤3:在详情页查看每日定时检测结果或手动测试。
HTTPS 证书自动化运维:https证书管理系统- 自动化监控
HTTPS 证书自动化运维:https证书管理系统-自动化部署
本指南介绍如何部署Linux服务器节点。首先复制生成的Linux脚本命令,然后将其粘贴到目标服务器上运行。接着刷新页面查看节点记录,并点击“配置证书”选择证书以自动部署。最后,节点部署完成,后续将自动调度,无需人工干预。
HTTPS 证书自动化运维:https证书管理系统-自动化部署