【自动化部署】Ansible循环

server/2024/12/21 13:11:04/

文章目录

  • 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_cartesianwith_nested

  • 用法:用于生成两个或多个列表的笛卡尔积(所有可能的组合)。

  • 行为with_cartesianwith_nested功能相同,可以互换使用。

  • 示例

    - debug:msg: "{{item}}"with_cartesian:- [a, b, c]- [test1, test2]
    

    - debug:msg: "{{item[0]}},{{item[1]}}"with_nested:- "{{test}}"- "{{demo}}"
    
  • with_itemswith_flattened在处理嵌套列表时有不同行为,前者拉平,后者不拉平。

  • with_list只处理最外层列表,建议使用loop代替。

  • with_together用于对齐合并两个列表。

  • with_cartesianwith_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 值

  • 修改 /etc/ansible/ansible.cfg 文件,增加 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 中使用 asyncpoll 参数异步执行任务,并注册任务 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

http://www.ppmy.cn/server/151947.html

相关文章

三格电子——新品IE103转ModbusTCP网关

型号:SG-TCP-IEC103 产品概述 IE103转ModbusTCP网关型号SG-TCP-IEC103,是三格电子推出的工业级网关(以下简称网关),主要用于IEC103数据采集、DLT645-1997/2007数据采集,IEC103支持遥测和遥信,可…

常用消息中间件介绍

在消息中间件这个领域,确实有不少专业且强大的选择,它们各自都有着独特的优势和适用场景。 1. Apache Kafka: • Kafka以其高吞吐量、低延迟和分布式架构著称,非常适合处理大数据量、实时性要求高的场景。 • 它支持发布/订阅模式…

学习go中的Resty, 比标准库net/http更加方便友好

Resty 是 Go 语言中一个轻量级、简洁易用的 HTTP 客户端库。它的目标是提供一个简洁且易于使用的 API,以便进行常见的 HTTP 请求(如 GET、POST、PUT、DELETE 等)。如果你在 Go 项目中需要进行 HTTP 请求,可以考虑使用 Resty&#…

数据结构之旅:红黑树如何驱动 Set 和 Map

一、红黑树 1、定义 红黑树是一种二叉搜索树,在每个节点上增加一个存储位表示结点的颜色(红色或者黑色)。通过对任何一条从根到叶子的路径上各个结点着色方式的限制,红黑树确保不会有一条路径比其他路径长出两倍,因而这种树是一种接近平衡的…

人脸修复与增强腾讯开源项目GFPGAN介绍

GFPGAN 简述 GFPGAN (Generative Facial Prior GAN) 是一种基于生成对抗网络(GAN)的面部图像修复与增强模型。它由腾讯 ARC Lab 的研究团队开发,目的是以高效和高质量的方式修复低分辨率、受损或老化的人脸图像,同时保留其真实感和…

智能编排,精准掌控:Agent编排如何实现精细化权限控制

Agent编排产品以其灵活的接口调用和直观的图表展示功能,为企业的快速功能集成和数据可视化提供了极大的便利。然而,在企业中系统对接和数据共享的安全问题至关重要,许多用户在使用传统的Agent编排产品时,仍然面临以下问题 接口暴…

探索 OpenTofu:开源基础设施即代码工具

引言 在现代云计算和 DevOps 实践中,基础设施即代码(IaC)已经成为不可或缺的一部分。它使得基础设施的管理更加自动化、可重复和可维护。HashiCorp 的 Terraform 是这一领域的领先工具,但随着时间的推移,开源社区也开始关注其许可证的变更。OpenTofu 作为 Terraform 的一…

【已解决】启动此实时调试器时未使用必需的安全权限。要调试该进程,必须以管理员身份运行此实时调试器。是否调试该进程?

【已解决】启动此实时调试器时未使用必需的安全权限。要调试该进程,必须以管理员身份运行此实时调试器。是否调试该进程? 目录一、前言二、具体原因三、解决方法 目录 报错截图 一、前言 进行应用程序开发时,需要对w3wp进行附加调试等场景&#xff…