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" -
多行字符串:
-
竖线
|:保留换行符YAMLdebug: msg: | Example Company 123 Main Street -
大于号
>:换行符转为空格,删除行首空白YAMLdebug: msg: > This is an example of a long string
-
(2)字典(映射/哈希)
-
缩进格式(推荐):
YAMLuser: name: laogao uid: 1088 state: absent -
内联格式(不推荐,可读性差):
YAMLuser: {name: laogao, uid: 1088, state: absent}
(3)列表(序列/数组)
-
缩进格式(推荐):
YAMLyum: name: httpd firewalld -
内联格式(不推荐):
YAMLyum: name: [httpd, firewalld]
3. 注释
-
用
#标识,#右侧为注释内容 -
若左侧有内容,
#前需加空格YAML# 单行注释 Some data # 行尾注释
四、Vim 编辑器配置(优化 YAML 编辑体验)
1. 编辑配置文件
Bash
vim ~/.vimrc
2. 添加配置(二选一)
-
全局生效:
Plainset ai ts=2 -
仅 YAML 文件生效:
Plainautocmd 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