文章目录
- Ansible循环
- 1. `with_items`
- 2. `with_list`
- 3. `with_flattened`
- 4. `with_together`
- 5. `with_cartesian` 和 `with_nested`
- Ansible 配置模板与效率优化
- 一、配置模板
- 1. 准备配置模板文件
- 2. 修改 inventory 主机清单配置文件
- 3. 编写 playbook
- 二、Ansible 执行效率优化
- 1. 加大 forks 值
- 2. 修改执行策略
- 3. 开启 SSH 长连接
- 4. 开启 Pipelining 特性
- 5. 关闭 Facts 信息收集
- 6. 使用 Ansible 异步执行任务
Ansible循环
1. with_items
- 用法:用于遍历一个简单的列表或字典列表。
- 行为:当处理嵌套列表时,会将嵌套列表“拉平”并逐个处理元素。
- 示例:
或- debug:msg: "{{item}}"with_items:- 1- 2- 3
- debug:msg: "{{item.test1}}"with_items:- { test1: a, test2: b }- { test1: c, test2: d }
2. with_list
- 用法:用于遍历列表。
- 行为:只处理最外层的列表项,不会“拉平”嵌套列表。在Ansible 2.5及以后的版本中,推荐使用
loop
代替with_list
。 - 示例:
- debug:msg: "{{item}}"with_list:- [1, 2, 3]- [a, b] # 这个嵌套列表不会被拉平
3. with_flattened
- 用法:用于遍历列表,包括嵌套列表。
- 行为:会将所有嵌套列表“拉平”并逐个处理元素。
- 示例:
- debug:msg: "{{item}}"with_flattened:- [1, 2, 3]- [a, b] # 这个嵌套列表会被拉平
4. with_together
- 用法:用于将两个列表的元素“对齐合并”。
- 行为:第一个列表的每个元素会与第二个列表中相同位置的元素合并输出。如果第二个列表的元素不足,则输出
null
。 - 示例:
- debug:msg: "{{item}}"with_together:- [1, 2, 3]- [a, b, c]
5. with_cartesian
和 with_nested
-
用法:用于生成两个或多个列表的笛卡尔积(所有可能的组合)。
-
行为:
with_cartesian
和with_nested
功能相同,可以互换使用。 -
示例:
- debug:msg: "{{item}}"with_cartesian:- [a, b, c]- [test1, test2]
或
- debug:msg: "{{item[0]}},{{item[1]}}"with_nested:- "{{test}}"- "{{demo}}"
-
with_items
和with_flattened
在处理嵌套列表时有不同行为,前者拉平,后者不拉平。 -
with_list
只处理最外层列表,建议使用loop
代替。 -
with_together
用于对齐合并两个列表。 -
with_cartesian
和with_nested
用于生成笛卡尔积。
Ansible 配置模板与效率优化
一、配置模板
1. 准备配置模板文件
- 创建一个
.j2
文件(例如config.j2
),作为配置模板文件。 - 在模板文件中使用
{{ 变量名 }}
格式引用主机变量、组变量、自定义变量以及 facts 信息字段变量。
示例 config.j2
文件:
[mysqld]
user={{ mysql_user }}
port={{ mysql_port }}
datadir={{ mysql_datadir }}
2. 修改 inventory 主机清单配置文件
- 编辑
/etc/ansible/hosts
文件,设置主机变量和组变量。
示例 /etc/ansible/hosts
文件:
[mysql_servers]
db1 ansible_host=192.168.1.10 mysql_user=mysqluser mysql_port=3306 mysql_datadir=/var/lib/mysql
db2 ansible_host=192.168.1.11 mysql_user=mysqluser mysql_port=3306 mysql_datadir=/var/lib/mysql[mysql_servers:vars]
mysql_version=5.7
3. 编写 playbook
- 编写一个 playbook 文件,使用
template
模块将模板文件应用到远程主机。
示例 deploy_config.yml
文件:
- name: Deploy MySQL Configurationhosts: mysql_serverstasks:- name: Template MySQL Configuration Filetemplate:src: config.j2dest: /etc/my.cnf
二、Ansible 执行效率优化
1. 加大 forks 值
[defaults]
forks = 20
2. 修改执行策略
- 将默认策略从
linear
改为free
,使得节点执行完一个任务后不等待其它节点即可继续执行剩余任务。
[defaults]
strategy = free
3. 开启 SSH 长连接
[ssh_connection]
ssh_args = -C -o ControlMaster=auto -o ControlPersist=60m
4. 开启 Pipelining 特性
- 修改
/etc/ansible/ansible.cfg
文件,启用 Pipelining 特性。 - 远程主机需要禁用
requiretty
,编辑/etc/sudoers
文件,注释掉Defaults requiretty
。
[defaults]
pipelining = True
5. 关闭 Facts 信息收集
- 在 playbook 中使用
gather_facts: false
禁用 facts 信息收集。
示例 deploy_config.yml
文件:
- name: Deploy MySQL Configurationhosts: mysql_serversgather_facts: falsetasks:- name: Template MySQL Configuration Filetemplate:src: config.j2dest: /etc/my.cnf
6. 使用 Ansible 异步执行任务
- 在 playbook 中使用
async
和poll
参数异步执行任务,并注册任务 ID。 - 使用
async_status
模块检查异步任务状态。
示例 async_task.yml
文件:
- name: Run Asynchronous Taskhosts: mysql_serverstasks:- name: Start Asynchronous Taskasync: 3600 # 后台任务3600秒还未完成,则任务失败poll: 0 # 不检查后台任务执行状况command: /path/to/long_running_commandregister: job_id- name: Wait for Asynchronous Task to Completeasync_status:jid: "{{ job_id.ansible_job_id }}"register: job_resultuntil: job_result.finishedretries: 300 # 每3秒检查一次,共等待900秒delay: 3