【自动化部署】Ansible循环

ops/2024/12/21 14:06:36/

文章目录

  • 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/ops/143772.html

相关文章

推送本地仓库到远程git仓库

目录 推送本地仓库到远程git仓库1.1修改本地仓库用户名1.2 push 命令1.3远程分支查看 推送本地仓库到远程git仓库 删除之前的仓库中的所有内容,从新建库,同时创建一个 A.txt 文件 清空原有的远程仓库内容,重新创建一个新的仓库,…

InnoDB和MyISAM引擎优缺点和区别

nnoDB和MyISAM是MySQL数据库中常用的两种存储引擎。它们各自具有不同的特性和优势,适用于不同的应用场景。 一、InnoDB引擎: 1、它有如下特性: 1)、支持事务(ACID) 2)、支持外键约束(FOREIGN KEY const…

基于开源 AI 智能名片 S2B2C 商城小程序的智慧零售仓储管理创新策略研究

摘要:本文深入探讨在智慧零售蓬勃发展的背景下,仓储管理面临的新挑战。随着消费者对线上购物时效要求的不断攀升,前置仓、门店仓等新型仓储模式应运而生,在带来配送时间缩短优势的同时,也引发了运营成本增加、运营难度…

Ansible 批量管理华为 CE 交换机

注:本文为 “Ansible 管理华为 CE 交换机” 相关文章合辑。 使用 CloudEngine - Ansible 批量管理华为 CE 交换机 wsf535 IP 属地:贵州 2018.02.05 15:26:05 总体介绍 Ansible 是一个开源的自动化运维工具,AnsibleWorks 成立于 2012 年&a…

dolphinscheduler服务注册中心源码解析(二)基于zookeeper实现注册中心源码解析

1.概述 DolphinScheduler的架构遵循分布式设计,其核心包括多个组件,每个组件负责特定的功能,这样可以避免单点故障并提供可扩展性。 Master节点:负责管理调度任务的调度流程、协调任务的执行和状态监控。Master节点还负责任务的调度调度策略的选择(例如负载均衡)以及资源…

【LuaFramework】LuaFramework_UGUI_V2框架学习

GitHub - jarjin/LuaFramework_UGUI_V2: 基于tolua的热更新框架V2 旧版本是Unity 5.0,这个是新版本支持更高版本的 导入工程后先清除wrap 然后重新生成wrap,你会发现有个报空null,框架的问题总结下所有的框架wrap相关报错问题和修复方法&…

c# 后台任务自动执行

如果有些任务需要在后台自动执行,且时不时需要添加一个任务,且按照优先级顺序执行,那么可以参考本文的方法。 后台任务类 定义一个后台任务类BackgroundTaskThread,其中Start方法是用来启动任务的,循环查询是否有添加…

Spring Boot 技术详解:核心特性、运行方式与应用实践

1.为什么要用SpringBoot Spring Boot 是一个用于创建独立的、生产级别的基于 Spring 的应用程序的框架。它通过简化配置和依赖管理,使开发者能够快速上手并构建应用程序。以下是使用 Spring Boot 的一些主要原因: 自动配置:Spring Boot 会根…