Ansible 核心配置与任务管理:主机清单、剧本,任务的导入、配置并行

发布于:2025-09-04 ⋅ 阅读:(21) ⋅ 点赞:(0)

Ansible 核心配置与任务管理:主机清单、剧本,任务的导入、配置并行

一、Ansible 主机清单表述方式

主机清单(Inventory)用于定义 Ansible 管理的目标主机 / 主机组,支持精确匹配、通配符、组运算等多种表述方式,满足不同场景下的主机选择需求。

表述格式

功能说明

示例

单主机(IP / 主机名)

指定单个受控主机,支持 IP、短主机名、FQDN

- hosts: node1(短主机名)

- hosts: node1.example.com(FQDN)

- hosts: 172.16.30.10(IP 地址)

全量主机

匹配所有受控主机

- hosts: all(官方推荐)- hosts: '*'(通配符等效)

通配符匹配

通过 * 匹配符合规则的主机 / 主机名

- hosts: '*.example.com'(匹配所有 example.com 域名的主机)

- hosts: '172.16.30.*'(匹配 172.16.30 网段所有主机)

- hosts: 'web*'(匹配以 web 开头的主机 / 主机组)

序列匹配

通过 [起始-结束] 匹配连续序列

- hosts: node[1-5](匹配 node1 到 node5)

- hosts: node[a-d](匹配 nodea 到 noded)

主机组运算

对多个主机组进行 “并集、交集、差集” 运算

- hosts: net:webserver(并集:net 组和 webserver 组所有主机)

- hosts: net:&webserver(交集:同时在 net 组和 webserver 组的主机)

- hosts: net:!node1(差集:net 组所有主机,排除 node1)

二、Ansible 并行执行配置(forks 与 serial)

并行执行控制 Ansible 同时连接的受控主机数量,核心通过 forks 全局参数和 serial Play 级参数实现,适配不同场景下的资源占用与执行效率需求。

2.1 forks 全局参数

  • 作用:定义 Ansible 最大同时连接的受控主机数,控制全局并行度。
  • 默认值:5(即默认同时连接 5 台主机执行任务)。
  • 执行逻辑

若 Play 包含 10 台主机,forks=5 时,先同时对前 5 台主机执行所有任务,完成后再对后 5 台主机执行任务,所有主机完成当前 Play 后,才进入下一个 Play

  • 调整建议
    • Linux 受控主机:可适当调大(如 10-20),因任务在受控端执行,控制端资源占用低;
    • 网络设备:需调小(如 2-5),因网络设备连接资源有限,避免并发过高导致连接失败。
  • 配置方式

在 /etc/ansible/ansible.cfg 中修改 forks = 10(全局生效),或执行 Playbook 时临时指定:ansible-playbook --forks 10 playbook.yml。

2.2 serial Play 级参数

  • 作用:在单个 Play 内拆分主机组,按批次执行任务,优先级高于 forks,解决 “多主机执行时 handlers 触发不及时” 等问题。
  • 执行逻辑

若 serial=2,Play 会先选择 2 台主机执行完所有任务,再选择下一批 2 台,直到所有主机执行完成。

  • 配置位置:与 hosts 同层级,属于 Play 的一级参数。
  • 示例
- name: 按批次执行任务

  hosts: all

  serial: 2 # 每批次 2 台主机

  tasks:

    - name: 安装 httpd

      yum:

        name: httpd

        state: present

三、Ansible notify 与 handlers(状态触发机制)

notify(通知器)和 handlers(处理器)用于实现 “任务状态变化后触发后续操作”,避免无意义的重复执行(如仅配置文件修改后才重启服务)。

3.1 核心逻辑

  1. 触发条件:仅当带有 notify 的任务执行后状态为 changed=true(即产生实际变化,如文件修改、软件安装),才会触发 handlers;若任务状态为 changed=false(无变化),则不触发。
  2. 执行时机:默认情况下,handlers 会在当前 Play 的所有普通任务执行完毕后统一执行;若多个任务触发同一个 handlers,仅执行 1 次。
  3. 失败处理:若普通任务执行失败,默认不执行 handlers;若需强制执行,可在执行 Playbook 时添加参数:ansible-playbook --force-handlers playbook.yml。

3.2 示例

---
- name: 配置 Nginx 并触发重启

  hosts: web_servers

  tasks:

    - name: 拷贝 Nginx 配置文件

      copy:

        src: nginx.conf

        dest: /etc/nginx/nginx.conf

      notify: 重启 Nginx 服务 # 配置文件变化时触发 handlers

    - name: 启动 Nginx 服务(首次执行)

      service:

        name: nginx

        state: started

  handlers: # 定义处理器,仅被 notify 触发

    - name: 重启 Nginx 服务

      service:

        name: nginx

        state: restarted

四、Ansible 包含与导入(模块化管理)

通过 “导入 / 包含” 功能将 Playbook、任务拆分到独立文件,实现代码复用与结构清晰,核心分为 “导入 Playbook”“导入任务”“包含任务” 三类场景。

4.1 核心区别:导入(import)vs 包含(include)

功能类型

语法

加载时机

动态性支持

适用场景

导入 Playbook

import_playbook: 文件名.yml

解析阶段(静态)

不支持

复用完整的 Play 集合(如基础环境配置)

导入任务

import_tasks: 文件名.yml

解析阶段(静态)

不支持

复用固定逻辑的任务(如标准安装步骤)

包含任务

include_tasks: 文件名.yml

执行阶段(动态)

支持

按条件 / 变量动态加载任务(如多环境适配)

4.2 实战示例:模块化管理 Playbook 与任务

场景需求

创建 3 个文件:repo.yml(配置 YUM 仓库)、web.yml(安装 httpd 任务)、httpd.yml(主 Playbook,导入前两者),实现 “先配仓库、再装服务” 的完整流程。

1. 配置 YUM 仓库(repo.yml)
---

- name: 配置 RHEL9 YUM 仓库

  hosts: all

  tasks:

    - name: 创建 BaseOS 仓库

      yum_repository:

        file: server # 仓库配置文件名(/etc/yum.repos.d/server.repo)

        name: BaseOS # 仓库 ID

        description: RHEL9 BaseOS

        baseurl: http://ansible.example.com/rhel9/BaseOS

        enabled: yes # 启用仓库

        gpgcheck: no # 关闭 GPG 校验
        
    - name: 创建 AppStream 仓库

      yum_repository:

        file: server

        name: AppStream

        description: RHEL9 AppStream

        baseurl: http://ansible.example.com/rhel9/AppStream

        enabled: yes

        gpgcheck: no
2. 安装 httpd 任务(web.yml)
---

# 独立任务文件,无 hosts 字段,仅包含任务列表

    - name: 安装 httpd 软件包

      yum:

        name: httpd

        state: present # 确保软件已安装
3. 主 Playbook(httpd.yml)
---

# 1. 导入 repo.yml 完整 Playbook(配置 YUM 仓库)

- name: 导入 YUM 仓库配置

  import_playbook: repo.yml # 静态导入,解析阶段加载

# 2. 定义主 Play:安装并启动 httpd

- name: 部署 httpd 服务

  hosts: all

  tasks:

# 导入 web.yml 任务(安装 httpd)

    - name: 导入 httpd 安装任务

      import_tasks: web.yml # 静态导入任务

# 直接定义任务:启动并设置 httpd 开机自启

    - name: 启动 httpd 服务并设置开机自启

      service:

        name: httpd

        state: started # 确保服务运行

        enabled: yes # 确保开机自启

4.3 执行与验证

  1. 执行主 Playbook:ansible-playbook httpd.yml
  2. 验证结果:
    • 检查 YUM 仓库:在受控主机执行 yum repolist,确认 BaseOS 和 AppStream 仓库已加载;
    • 检查 httpd 服务:在受控主机执行 systemctl status httpd,确认服务已启动且开机自启。

五、总结

  1. 主机清单:灵活运用 “精确匹配、通配符、组运算”,快速定位目标主机;
  2. 并行配置:forks 控制全局并发,serial 实现批次执行,平衡效率与资源;
  3. 状态触发:notify+handlers 仅在任务变化时执行后续操作,减少冗余;
  4. 模块化管理:通过 import_playbook/import_tasks/include_tasks 拆分代码,提升复用性与可维护性。

网站公告

今日签到

点亮在社区的每一天
去签到