Ansible学习----Ansible Playbook

Ansible Playbook 是实现批量、可重复管理任务的核心工具。

一、创建 Ansible Inventory(清单)

Inventory 是 Ansible 识别受管主机的核心配置,它定义了 "管理哪些主机",支持静态与动态两种形式,日常操作中以静态清单为主。

1.1 清单核心概念

  • 主机可归属一个或多个组,组通常按主机角色(如 web 服务器、数据库服务器)或地理位置(如东部数据中心、西部数据中心)划分。

  • 静态清单以 INI 或 YAML 格式存储;动态清单从云提供商、LDAP 数据库等外部来源生成。

1.2 静态清单配置规则

  • 组名用方括号[]标识,组内主机以主机名或 IP 地址列出,每行一个条目。

  • 支持 "组嵌套",通过:children后缀实现,例如将usacanada组归入north-america组。

  • 可通过[START:END]语法简化主机列表,如server[01:20].example.com匹配 20 台服务器,192.168.[4:7].[0:255]匹配 4 个网段。

1.3 清单验证与路径设置

  • 默认静态清单路径为/etc/ansible/hosts,但推荐在工作目录中自定义,并通过ansible-navigator run -i 路径指定。

  • 验证命令:ansible-navigator inventory -m stdout --list列出所有主机,--graph 组名查看组内主机,--host 主机名验证单主机是否在清单中。

二、管理 Ansible 配置文件

配置文件控制 Ansible 的行为与连接方式,核心文件包括ansible.cfg(Ansible 核心配置)和ansible-navigator.yml(导航器配置),需掌握优先级与关键参数设置。

2.1 核心配置文件与优先级

  • ansible.cfg优先级:项目目录 > 用户主目录(~/.ansible.cfg) > 系统默认(/etc/ansible/ansible.cfg),Ansible 仅使用最高优先级文件的设置。

  • 查看当前生效配置:执行ansible --versionansible -v,可显示当前使用的配置文件路径。

2.2 关键配置参数

ansible.cfg主要包含[defaults][privilege_escalation]两个 section,核心参数如下:

参数 作用
inventory 指定清单文件路径,如./inventory
remote_user 连接受管主机的用户名,默认与控制节点当前用户一致
ask_pass 是否提示输入 SSH 密码,使用 SSH 公钥时设为false
become 是否自动提权,设为true时默认切换到 root
become_method 提权方式,默认sudo,可选su
become_ask_pass 是否提示输入提权密码,默认false

2.3 导航器配置(ansible-navigator.yml)

  • 格式支持 JSON 或 YAML,用于配置执行环境(如容器镜像)和 Playbook 工件生成。

  • 示例配置:指定容器镜像utility.lab.example.com/ee-supported-rhel8:latest,禁用 Playbook 工件生成(需输入密码时必须禁用)。

2.4 连接与提权优化

  • 推荐提前配置 SSH 免密登录,通过ssh-copy-id 用户名@受管主机分发公钥,避免重复输入密码。

  • 安全最佳实践:不在ansible.cfg全局开启become: true,而是在单个 Play 中按需设置,减少权限滥用风险。

三、编写和执行 Playbook

Playbook 是 YAML 格式的任务集合,一个 Playbook 可包含多个 Play,每个 Play 针对特定主机组执行任务,需掌握格式规则、模块选择与执行命令。

3.1 Playbook 核心概念

  • Play :包含name(描述)、hosts(目标主机组)、tasks(任务列表)三大核心字段,按顺序执行任务。

  • Task :通过 "模块 + 参数" 实现具体操作,如用ansible.builtin.dnf安装软件、ansible.builtin.service管理服务。

  • 幂等性 :多数模块支持幂等(如state: present),重复执行时仅在主机状态不匹配时修改,避免重复操作。

3.2 YAML 格式规则

  • 缩进:仅用空格(不可用 Tab),同级元素缩进一致,子元素比父元素多缩进 2 个空格。

  • 文档标记:开头用---标识文档开始,结尾...可省略;列表项用- 空格开头,如tasks下的多个任务。

  • 字符串:可不加引号,含特殊字符时用单 / 双引号;多行字符串用|保留换行,用>将换行转为空格。

3.3 模块选择与文档查询

  • 模块分类:按功能分为文件(copy/file)、软件(dnf/apt)、系统(service/user)、网络(get_url)等类别,优先使用ansible.builtin内置模块。

  • 文档查询:ansible-navigator doc 模块名查看详细文档,-l列出所有模块,-s显示模块参数摘要;也可访问Ansible 官方文档获取示例。

  • 特殊场景:无对应模块时,可用ansible.builtin.command(无 shell 特性)或ansible.builtin.shell(支持管道 / 变量)执行自定义命令,但需谨慎使用(非幂等)。

3.4 执行与验证命令

操作 命令 说明
语法检查 ansible-navigator run -m stdout 文件名 --syntax-check 仅验证格式,不执行任务
空运行(预演) ansible-navigator run -m stdout 文件名 --check 模拟执行,显示预期变更,不实际修改
执行 ansible-navigator run -m stdout 文件名 实际执行,-v/-vv/-vvv可增加输出详细度
查看结果 PLAY RECAP 输出中显示ok(成功)、changed(变更)、failed(失败)数量

四、实施 Multiple Plays(多 Play)

当需对不同主机组执行不同任务时,可在一个 Playbook 中编写多个 Play,实现 "一次执行,多组管理",需注意远程用户与提权的灵活配置。

4.1 多 Play 编写示例

一个 Playbook 可包含多个 Play,每个 Play 独立设置hoststasks,例如:

yaml

复制代码
---
- name: 配置Web服务器
  hosts: webservers
  tasks:
    - name: 安装httpd
      ansible.builtin.dnf:
        name: httpd
        state: latest
    - name: 启动httpd服务
      ansible.builtin.service:
        name: httpd
        state: started
        enabled: true

- name: 配置数据库服务器
  hosts: db-servers
  tasks:
    - name: 安装mariadb
      ansible.builtin.dnf:
        name: mariadb-server
        state: latest
    - name: 启动mariadb服务
      ansible.builtin.service:
        name: mariadb
        state: started
        enabled: true

4.2 按 Play 配置用户与提权

  • 每个 Play 可单独设置remote_user(覆盖全局配置)和提权参数,例如对数据库服务器使用高权限用户:

    yaml

    复制代码
    - name: 管理数据库配置
      hosts: db-servers
      remote_user: dbadmin
      become: true
      become_user: root
      tasks:
        - name: 修改数据库配置文件
          ansible.builtin.file:
            path: /etc/my.cnf
            owner: root
            group: root

总结

本章核心是 "从配置到执行" 的全流程:通过 Inventory 定义管理范围,用配置文件优化连接与提权,以 Playbook 实现任务自动化,最终通过ansible-navigator验证与执行。

实践建议:

  1. 从简单任务入手,如 "安装软件 + 启动服务",熟悉 YAML 格式与模块参数。

  2. 优先使用幂等模块,避免直接用shell命令,确保 Playbook 可重复执行。

  3. 定期验证清单与配置文件,通过--check预演执行结果,减少生产环境风险。

相关推荐
sulikey3 小时前
从实验出发深入理解Linux目录权限:r、w、x分别控制什么?能否进入目录到底由谁决定?
linux·运维·服务器·ubuntu·centos
楼田莉子3 小时前
C++学习:C++11扩展:constexpr特性
开发语言·c++·学习
懒羊羊不懒@3 小时前
Java基础语法—最小单位、及注释
java·c语言·开发语言·数据结构·学习·算法
qq_398586543 小时前
Threejs入门学习笔记
javascript·笔记·学习
li3714908904 小时前
nginx报400bad request 请求头过大异常处理
java·运维·nginx
久曲健的测试窝4 小时前
Jenkins Share Library教程 —— 开发入门
运维·servlet·jenkins
三坛海会大神5555 小时前
k8s(六)Pod的资源控制器
云原生·容器·kubernetes
菜鸟‍5 小时前
【论文学习】大语言模型(LLM)论文
论文阅读·人工智能·学习
缘的猿5 小时前
Docker 与 K8s 网络模型全解析
docker·容器·kubernetes