Ansible Playbook 编写与运行

Ansible Playbook 编写与运行

一、实验环境准备

1. 目录创建

Bash 复制代码
mkdir web && cd web

2. 配置文件编写(ansible.cfg)

Bash 复制代码
vim ansible.cfg

文件内容:

TOML 复制代码
[defaults]
remote_user = laogao
inventory = ./inventory

[privilege_escalation]
become = True
become_user = root
become_method = sudo
become_ask_pass = False

3. 清单文件编写(inventory)

Bash 复制代码
vim inventory

文件内容(列出受管节点):

Plain 复制代码
controller
node1
node2
node3
node4

二、Playbook 核心概念

1. 定义与优势

  • ad hoc 命令:适用于一次性简单任务,无法复用
  • Playbook :YAML 格式文本文件,包含一个或多个按序执行的 play
  • 核心价值:将复杂手动操作转化为可重复、可预测的自动化流程,支持多任务串联

2. 基本结构

  • Play :针对指定主机执行的任务集合,包含 name(描述)、hosts(目标主机)、tasks(任务列表)等属性
  • Task :单个执行单元,包含 name(描述)、模块名及模块参数

三、YAML 语法规范

1. 基础规则

  • 缩进:仅使用空格,同级元素缩进一致,子元素比父元素多缩进
  • 分隔符:键值对用 : 分隔,: 后必须加空格
  • 起始与结束:第一行需写 --,最后一行 ... 可省略
  • 可读性:允许添加空白行分隔内容

2. 常用数据类型

(1)字符串
  • 单行字符串:可省略引号,含空格时也可直接书写(如 this is a string

  • 引号包裹:支持单引号 'string' 或双引号 "string"

  • 多行字符串:

    • 竖线 |:保留换行符

      YAML 复制代码
      debug:
        msg: |
          Example Company
          123 Main Street
    • 大于号 >:换行符转为空格,删除行首空白

      YAML 复制代码
      debug:
        msg: >
          This is an example
          of a long string
(2)字典(映射/哈希)
  • 缩进格式(推荐):

    YAML 复制代码
    user:
      name: laogao
      uid: 1088
      state: absent
  • 内联格式(不推荐,可读性差):

    YAML 复制代码
    user: {name: laogao, uid: 1088, state: absent}
(3)列表(序列/数组)
  • 缩进格式(推荐):

    YAML 复制代码
    yum:
      name:
        httpd
        firewalld
  • 内联格式(不推荐):

    YAML 复制代码
    yum:
      name: [httpd, firewalld]

3. 注释

  • # 标识,# 右侧为注释内容

  • 若左侧有内容,# 前需加空格

    YAML 复制代码
    # 单行注释
    Some data # 行尾注释

四、Vim 编辑器配置(优化 YAML 编辑体验)

1. 编辑配置文件

Bash 复制代码
vim ~/.vimrc

2. 添加配置(二选一)

  • 全局生效:

    Plain 复制代码
    set ai ts=2
  • 仅 YAML 文件生效:

    Plain 复制代码
    autocmd FileType yaml set ai ts=2

3. 配置说明

  • ai(autoindent):自动缩进
  • ts=2(tabstop):Tab 键转为 2 个空格

五、Playbook 编写示例(内网 Web 服务部署)

1. 编写 Playbook 文件

Bash 复制代码
vim playbook.yaml

2. 文件内容

YAML 复制代码
--
# 第一个 Play:部署内网 Web 服务
- name: Enable intranet services
  hosts: node1
  tasks:
    # 任务1:安装最新版 httpd 和 firewalld
    - name: latest version of httpd and firewalld installed
      yum:
        name:
          httpd
          firewalld
        state: latest

    # 任务2:创建测试 HTML 页面
    - name: test html page is installed
      copy:
        content: "Welcome laogao WebSite!\n"
        dest: /var/www/html/index.html

    # 任务3:启用并启动 firewalld 服务
    - name: firewalld enabled and running
      service:
        name: firewalld
        enabled: true
        state: started

    # 任务4:防火墙放行 HTTP 服务
    - name: firewalld permits access to httpd service
      firewalld:
        service: http
        permanent: true
        state: enabled
        immediate: yes

    # 任务5:启用并启动 httpd 服务
    - name: httpd enabled and running
      service:
        name: httpd
        enabled: true
        state: started

# 第二个 Play:测试 Web 服务可用性
- name: Test intranet web server
  hosts: localhost
  become: no
  tasks:
    - name: connect to intranet web server
      uri:
        url: http://node1
        return_content: yes
        status_code: 200

六、Playbook 运行与调试

1. 基本运行命令

Bash 复制代码
ansible-playbook playbook.yaml
  • 第二次执行时,任务状态全为绿色(幂等性:重复执行无副作用)

2. 语法检查(不执行任务)

Bash 复制代码
ansible-playbook playbook.yaml --syntax-check

3. 空运行(模拟执行,不实际操作)

Bash 复制代码
ansible-playbook playbook.yaml -C

4. 提高输出详细程度

Bash 复制代码
# 显示任务结果(常用)
ansible-playbook playbook.yaml -v

# 显示任务结果和配置
ansible-playbook playbook.yaml -vv

# 包含主机连接信息
ansible-playbook playbook.yaml -vvv

# 显示连接插件详情及执行脚本
ansible-playbook playbook.yaml -vvvv

七、特权升级配置(Playbook 内指定)

可在 Play 中覆盖 ansible.cfg 的提权设置:

YAML 复制代码
- name: Enable intranet services
  hosts: node1
  remote_user: laogao  # SSH 连接用户
  become: true         # 启用特权升级
  become_method: sudo  # 提权方式
  become_user: root    # 目标提权用户
  tasks:
    # 任务内容...

八、Ad Hoc 命令与 Playbook 转换示例

1. Ad Hoc 命令(创建用户)

Bash 复制代码
ansible -m user -a "name=newbie uid=4000 state=present" node1

2. 转换为 Playbook(newuser.yaml)

Bash 复制代码
vim newuser.yaml

文件内容:

YAML 复制代码
--
- name: Configure important user consistently
  hosts: node1
  tasks:
    - name: newbie exists with UID 4000
      user:
        name: newbie
        uid: 4000
        state: present

3. 运行 Playbook

Bash 复制代码
ansible-playbook newuser.yaml
相关推荐
坚持学习前端日记2 分钟前
认证模块文档
java·服务器·前端·数据库·spring
每日出拳老爷子9 小时前
【远程协助】内网 IT 运维远程协助系统的最小可用架构
运维·服务器·远程工作·流媒体·视音频
CheungChunChiu9 小时前
Linux 内核动态打印机制详解
android·linux·服务器·前端·ubuntu
西***634710 小时前
打破部署桎梏!编码器两大核心架构(NVR/PoE)深度解析
服务器·音视频·视频编解码
Love Song残响11 小时前
深入解析TCP/IP协议栈:从底层到应用层
网络·tcp/ip·php
线束线缆组件品替网12 小时前
IO Audio Technologies 音频线缆抗干扰与带宽设计要点
网络·人工智能·汽车·电脑·音视频·材料工程
布谷歌13 小时前
开发笔记:如何消除秘钥数据对RPC负荷、日志、系统安全的伤害?
网络·笔记·网络协议·rpc
heartbeat..13 小时前
零基础学 SQL:DQL/DML/DDL/DCL 核心知识点汇总(附带连接云服务器数据库教程)
java·服务器·数据库·sql
咒法师无翅鱼13 小时前
【西电计网学习笔记】网络层【RIP,OSPF,ARP,ICMP,IGMP,逻辑寻址(ABCD四类)】
网络
Ares-Wang13 小时前
网络》》以太网交换安全
网络·安全