自动化运维-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条件 可为包含的每个任务应用不同条件
变量 导入时变量必须已定义 运行时变量可用,更灵活

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

相关推荐
大树881 天前
金刚石散热越强,管路越先见顶
大数据·运维·服务器·人工智能·ai
摇滚侠1 天前
Linux CentOS7 rpm 安装 MySQL 5.7
linux·运维·mysql
霸道流氓气质1 天前
领域驱动设计(DDD)在 Spring Boot 微服务中的实践指南
运维·spring boot·微服务
Inhand陈工1 天前
基于台达PLC与映翰通IG502的智慧水产养殖精准投喂与远程运维解决方案
运维·人工智能·物联网·阿里云·信息与通信
酣大智1 天前
ARP代理--工作原理
运维·网络·arp·arp代理
shushangyun_1 天前
2026年快消品B2B系统推荐:支持终端门店订货、促销政策自动化的工具?
java·运维·网络·数据库·人工智能·spring·自动化
施努卡机器视觉1 天前
SNK施努卡侧滑门锁上滑轮总成自动化装配线,从零件到组件,全流程精密制造方案
运维·自动化·制造
dayuOK63071 天前
写作卡壳怎么办?我的“5分钟启动法”
人工智能·职场和发展·自动化·新媒体运营·媒体
AC赳赳老秦1 天前
用 OpenClaw 搭建服务器故障应急响应系统,自动处理 80% 常见运维故障
android·运维·服务器·python·rxjava·deepseek·openclaw
java_cj1 天前
深入kube-apiserver认证机制:从Bearer Token到mTLS的完整认证链解析
linux·运维·服务器·云原生·容器·kubernetes