自动化运维-ansible中对于大项目的管理

自动化运维-ansible中对于大项目的管理

一、引用主机清单

在Playbook中引用主机时,hosts 字段指定的目标必须与Ansible主机清单中定义的标识符完全匹配。如果清单中配置的是主机名,则在Playbook中使用IP地址或其他别名将无法匹配,导致任务被跳过

错误示例

inventory 中配置

playbook 中配置

发现报错,直接跳过该任务

主机清单引用方式大全

方式 示例 说明
单台主机 hosts: node1 指定清单中的具体主机名
hosts: node1.example.com 使用FQDN(前提是清单里如此定义)
hosts: 172.16.30.10 使用IP地址(前提是清单里如此定义)
所有主机 hosts: all 定位到清单中的所有主机
hosts: '*' 通配符,同样代表所有主机
主机组 hosts: net 定位到net组中的所有主机
模式匹配 hosts: '*.example.com' 匹配所有以.example.com结尾的主机
hosts: '172.16.30.*' 匹配172.16.30.0/24网段的所有主机
hosts: 'web*' 匹配所有名称以web开头的主机
hosts: node[ 1-5 ] 匹配node1, node2, ..., node5
hosts: node[ a-d ] 匹配nodea, nodeb, nodec, noded
集合操作 hosts: net:webserver 并集 :属于net webserver组的主机
hosts: net:&webserver 交集 :同时属于net webserver组的主机
hosts: net:!node1 差集 :属于net组但排除 node1主机

二、配置并行执行

1. 使用 forks 控制并发连接数

Ansible默认同时只能处理5台主机 (由ansible.cfg中的forks参数控制)

流程如下

  • 一个Play中如果有10台主机,forks=5
  • Ansible会先在前5台主机上执行完所有任务
  • 然后再在剩下的5台主机上执行所有任务

对不同的受控主机

  • Linux受控主机 :任务主要在受控端运行,控制节点负载较轻,可适当增加forks值以加速执行
  • 网络设备 :模块多在控制节点运行,负载较高,不宜设置过高的forks
2. 使用 serial 进行并行执行

默认情况下,一个Play中所有主机必须全部完成一个任务,才会进入下一个任务。如果中间某台主机任务失败,整个Play会中止,导致已成功主机的Handlers也无法触发

执行流程:

  1. 在最先的2台主机(设定 serial=2)上执行Play,安装httpd,成功后触发handler重启服务
  2. 这2台处理完毕后,再在接下来的2台主机上执行相同的Play
  3. 依此类推,直到所有批次完成
  4. 即使某一批次失败,也只影响该批次,已成功的批次已正常执行了Handler

serial 也可以指定百分比(如 serial: "20%") 或列表(如 serial: [1, 5, 10],表示第一批1台,第二批5台,剩余全部10台一批)

示例

yaml 复制代码
[student@master ansible] vim b.yml
# playbook内容如下
---
- name: test2
  hosts: node1,node2,node3,node4
  serial: 2
  tasks:
    - name: test21
      debug:
        msg: wil

三、包含与导入

为了提升Playbook的模块化和可重用性,可以将任务或整个Playbook分解到不同文件中

1. 导入(import_*) - 静态预处理

解析Playbook时,Ansible会将导入的文件内容直接复制到当前位置。适用于逻辑简单、结构固定的场景

  • import_playbook: 导入另一个Playbook文件
  • import_tasks: 导入任务文件

示例

配置 playbook , repo.yml

yaml 复制代码
[student@master ansible] vim repo.yml
# playbook内容如下
---
- name: repo
  hosts: all
  tasks:
    - name: baseos
      yum_repository:
        name: baseos
        description: rhel9-baseos
        baseurl: http://ansible.example.com/rhel9/BaseOS
        enabled: yes
        gpgcheck: no

    - name: appstream
      yum_repository:
        name: appstream
        description: rhel9-appstream
        baseurl: http://ansible.example.com/rhel9/AppStream
        enabled: yes
        gpgcheck: no

配置 taskshttp.yml

yaml 复制代码
[student@master ansible] vim http.yml
# tasks内容如下
---
  - name: install http
    yum: 
      name: httpd
      state: installed

配置 playbook , install1.yml

yaml 复制代码
[student@master ansible] vim install1.yml
# playbook内容如下
---
- name: import-repo
  import_playbook: repo.yml
- name: install h
  hosts: node1
  tasks:
    - import_tasks: http.yml
    - name: start httpd
      service:
        name: httpd
        state: started
        enabled: yes
2. 包含(include_*) - 动态执行

Play运行期间 遇到include_*语句时,才会处理导入的文件内容。更灵活,支持与循环结合使用

  • include_tasks: 动态包含任务文件

示例

配置 tasks , vsftp.yml

yaml 复制代码
[student@master ansible] vim vsftp.yml
# tasks内容如下
---
  - name: install vsftpd
    yum: 
      name: vsftpd
      state: installed

配置 playbook , install2.yml

yaml 复制代码
[student@master ansible] vim install2.yml
# playbook内容如下
---
- name: install ftp
  hosts: node1
  tasks:
    - include_tasks: vsftp.yml

    - name: start vsftpd
      service:
        name: vsftpd
        state: started
        enabled: yes
导入 vs. 包含 关键区别
特性 导入 (import_*) 包含 (include_*)
处理时机 解析时(静态) 运行时(动态)
循环 不支持 支持与loop一起使用
条件触发 对所有导入任务应用单个 when条件 可为包含的每个任务应用不同条件
变量 导入时变量必须已定义 运行时变量可用,更灵活

最佳实践: 优先使用导入 ,除非你需要循环包含依赖于运行时变量的动态功能。

相关推荐
运维栈记9 小时前
自动化运维利器:MCP Server + 阿里云
运维·自动化
Rinleren9 小时前
DevOps 工具链:CI/CD 概念解析 + Git 版本控制 + GitLab 仓库 + Jenkins 自动化全教程
自动化·gitlab·jenkins
namekong89 小时前
ubuntu 通过下面几种方式查看系统 重启时间/开机时间:
linux·运维·ubuntu
九河云10 小时前
物流仓储自动化升级:物道供应链 AGV 机器人实现分拣效率提升 60%
人工智能·科技·物联网·机器人·自动化
Yyyy48210 小时前
LVS、Nginx、HAProxy 的区别
运维·nginx·lvs
_dindong10 小时前
Linux系统编程:线程概念
linux·运维·笔记·学习
夏天是冰红茶10 小时前
使用Docker将PyQt深度学习项目打包成镜像
运维·docker·容器
落日漫游11 小时前
InnoDB:MySQL高性能事务引擎详解
运维·sql
龙门吹雪11 小时前
Docker 安装 canal 详细步骤
运维·docker·容器·canal·mysql binlog 日志·增量数据订阅消费
椒盐螺丝钉11 小时前
TypeScript类型兼容性
运维·前端·typescript