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
相关推荐
M1582276905516 小时前
TCP转LORA产品说明及应用案例
网络·网络协议·tcp/ip
旖旎夜光16 小时前
Linux(13)(中)
linux·网络
来可电子CAN青年16 小时前
CAN总线远距离传输老断网?Fx灯不闪别慌,这几招让你的通信“稳如泰山”!
网络
独行soc16 小时前
2026年渗透测试面试题总结-18(题目+回答)
android·网络·安全·web安全·渗透测试·安全狮
云小逸16 小时前
【nmap源码解析】Nmap OS识别核心模块深度解析:osscan2.cc源码剖析(1)
开发语言·网络·学习·nmap
自不量力的A同学17 小时前
Solon AI v3.9 正式发布:全能 Skill 爆发
java·网络·人工智能
一方热衷.17 小时前
在线安装对应版本NVIDIA驱动
linux·运维·服务器
m0_6948455717 小时前
tinylisp 是什么?超轻量 Lisp 解释器编译与运行教程
服务器·开发语言·云计算·github·lisp
*小海豚*17 小时前
在linux服务器上DNS正常,但是java应用调用第三方解析域名报错
java·linux·服务器
ESBK202517 小时前
第四届移动互联网、云计算与信息安全国际会议(MICCIS 2026)二轮征稿启动,诚邀全球学者共赴学术盛宴
大数据·网络·物联网·网络安全·云计算·密码学·信息与通信