一、剧本
playbook 文件,用于长久保存并且实现批量管理,维护,部署的文件. 类似于脚本存放命令和变量,剧本中存放的时候?模块
剧本yaml格式,yaml格式的文件:空格,冒号.
剧本未来我们批量管理,运维必会的内容.
1.1 剧本格式

# 查看yaml格式语法是否正确
ansible-playbook --syntax-check show.yaml
playbook: show.yaml
#1 . 书写剧本注意以.yml或.yaml结尾
#2 . 执行剧本
ansible-playbook -i hosts 01.show.yml
# cat 01.show.yml
- hosts: all
tasks:
- name: 01 打开冰箱门
shell: echo 01 /tmp/bingxiang.log
- name: 02 把大象放入冰箱
shell: echo 02 /tmp/bingxiang.log
- name: 03 关上冰箱的门
shell: echo 03 /tmp/bingxiang.log
$ ansible-playbook show.yaml
PLAY [ywmonitor] *************************************************************************************************************************
TASK [Gathering Facts] *******************************************************************************************************************
ok: [172.31.0.1]
TASK [01 打开冰箱门] *********************************************************************************************************************
changed: [172.31.0.1]
TASK [02 把大象放入冰箱] *****************************************************************************************************************
changed: [172.31.0.1]
TASK [03 关上冰箱的门] *******************************************************************************************************************
changed: [172.31.0.1]
PLAY RECAP *******************************************************************************************************************************
172.31.0.1 : ok=4 changed=3 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
# 执行的时候如果有奶牛:🐮
# 可以删除软件或修改ansible.cfg配置进行关闭 #nocows = 1去掉注释即可
二、剧本案例
--syntax-check 是语法检查:只检查 YAML 格式和 Ansible 关键字是否正确
ansible-playbook --syntax-check nfs.yaml
2.1 ansible-playbook常用参数
| 参数 | 简写 | 说明 | 示例 |
| --inventory | -i | 指定主机清单文件(Inventory)。如果不指定,默认使用 /etc/ansible/hosts。 |
ansible-playbook -i hosts.ini site.yml |
| --limit | -l | 限制执行的主机范围。可以指定主机名、IP 或组名。 | ansible-playbook -l web_servers site.yml |
| --user | -u | 指定远程连接的用户名。 | ansible-playbook -u admin site.yml |
| --become | -b | 提权执行(相当于 sudo)。通常在 Playbook 中未设置 become: yes 时使用。 |
ansible-playbook -b site.yml |
| --ask-become-pass | -K | 提示输入 sudo 密码。当远程用户需要密码提权时使用。 | ansible-playbook -b -K site.yml |
| --check | -C | 干跑模式。只检查会做什么改变,不实际执行修改。用于测试 | ansible-playbook -C site.yml |
| --diff | 显示文件变化的差异详情。常与 -C 配合使用。 |
ansible-playbook -C --diff site.yml | |
| --verbose | -v | 显示详细输出。-vvv 显示调试信息,-vvvv 显示连接调试信息 |
ansible-playbook -v site.yml |
| --tags | -t | 只执行带有特定标签的任务 | ansible-playbook -t install,config site.yml |
| --skip-tags | 跳过带有特定标签的任务。 | ansible-playbook --skip-tags debug site.yml | |
| --extra-vars | -e | 传入额外变量,优先级最高。支持 JSON 格式或键值对。 | ansible-playbook -e "http_port=8080" site.yml |
# 案例01: 创建目录并分发文件
步骤:
1 . 创建目录/server/files/
2 . /etc/hosts文件发送过去/server/files/
# 中间转换
# 1.创建目录/server/files/
-m file -a 'path=/server/files/ state=directory'
# 2.分发
-m copy -a 'src=/etc/hosts dest=/server/files/
# 剧本编写
cat dist_file.yml
- hosts: all
tasks:
- name: 01 创建目录
file: ptah =/data/files/ stae=directory
- name: 02 分发文件
copy: scr =/etc/hosts dst =/data/files/
# 专业格式的剧本,修改所属
- hosts: all
tasks:
- name: 01 创建目录
file:
path: /data/files/
state: directory
owner: ec2-user
group: ec2-user
- name: 02 分发文件
copy:
src: /etc/hosts
dest: /data/files/
owner: ec2-user
group: ec2-user
案例2:
# 案例: 分发软件包,安装软件包,启动服务
步骤:
1.zabbix-agent软件包(下载)
2.安装软件包
3.配置(略)
4.启动开机自启动
# 第一个里程碑:找出每个步骤的命令
1.下载软件包
wget https://mirrors.tuna.tsinghua.edu.cn/zabbix/zabbix/8.0/release/amazonlinux/2023/noarch/zabbix-release-latest.amzn2023.noarch.rpm
2.安装软件包
yum install -y zabbix-agent-6 .0 .7-1 .el7.x86 _64 .rpm
3.配置略
4.启动
systemctl
# 第2个里程碑-把上面步骤与命令找出对应的ans的模块
1.下载软件包:get_url
2.安装:yum
3.略
4.启动:systemd
# 第3个里程碑:书写剧本
- hosts: monitor
tasks:
- name: 01. 下载软件包/tmp/
get_url:
url: "https://mirrors.tuna.tsinghua.edu.cn/zabbix/zabbix/8.0/release/amazonlinux/2023/noarch/zabbix-release-latest.amzn2023.noarch.rpm"
validate_certs: no # 是否启用ssl证书,默认yes
dest: /tmp/
- name: 02. 安装软件包
yum:
name: /tmp/zabbix-release-latest.amzn2023.noarch.rpm
state: present
disable_gpg_check: no # 包管理模块校验签名
- name: 03. 配置
debug:
msg: "进行配置zabbix-agent"
- name: 04. 启动
systemd:
name: zabbix-agent
案例:nfs服务
# 要求
nfs服务端:在backup上部署nfs服务,共享/backup-nfs目录,all_squash,匿名户:nfsnobody
nfs客户端:web挂载/ans-upload目录挂载nfs服务端共享的/backup-nfs(永久挂载)
步骤:
第1个里程碑-列出流程
服务端流程:
1. 部署nfs-utils,rpcbind
2. 修改配置文件
3. 创建共享目录并改所有者
4. 启动服务rpcbind,nfs(注意顺序)
客户端流程:
1. 安装nfs-utils
2. 挂载与永久挂载
第2个里程碑-根据步骤流程模块
第3个里程碑-书写剧本
服务端流程:
1. 部署nfs-utils
2. 修改配置文件/etc/exports
/backup-nfs 172.16.1.0/24(rw,all_squash)
3. 创建共享目录,改所有者
4.启动服务rpcbind,nfs
客户端:
1.安装nfs-utils
2.挂载与永久挂载
# nfs.yaml
- hosts: backup
tasks:
- name: 01 . 部署nfs-utils,rpcbind
yum:
name: nfs-utils,rpcbind
state: present
- name: 02 . 修改配置文件
lineinfile:
path: /etc/exports
line: "/backup-nfs 172.16.1.0/24(rw,all_squash)"
create: true
- name: 03 . 创建共享目录并改所有者
file:
path: /backup-nfs
owner: ec2-user
group: ec2-user
state: directory
- name: 04 -1. 启动服务rpcbind,nfs(注意顺序)
systemd:
name: rpcbind
enabled: yes
state: started
- name: 04 -2. 启动服务rpcbind,nfs(注意顺序)
systemd:
name: nfs
enabled: yes
state: started
#nfs客户端部署
- hosts: web
tasks:
- name: 01 . 部署nfs-utils
yum:
name: nfs-utils
state: present
- name: 02 . 挂载nfs
mount:
src: 172.16.1.41:/backup-nfs
path: /ans-upload
fstype: nfs
state: mounted
# /etc/fstab
172.16.1.41:/backup-nfs /ans-upload/ nfs defaults 0 0
三、变量
变量无处不在,在ans中大部分地方都可以定义变量.
比较常用的创建变量的地方:剧本中,类似于 功能,共用的变量文件.
3.1 剧本中使用变量
# vars : variable 变量的内容,变量.
# dir就是变量,变量的内容:右边的内容.
# 举例:批量创建目录/data/files
- hosts: ywmonitor
vars:
dir: /data/files # 变量
tasks:
- name: 创建目录
file:
path: "{{ dir }}" # 如果直接是变量需要加引号,如果不是以变量开头就不需要引号,例如:/ss/{{dir}}/ss
state: directory
在剧本play中定义变量应用:
1. 仅仅在当前play生效.
2. 一般用来存放路径,用户名,ip地址,类似于之前使用的脚本.
3. 注意引号使用.
3.2 共用变量:变量文件
# 在同一目录下创建变量文件vars.yml
#cat vars.yml
user: ec2-user
group: ec2-user
dir: /data
file: test.txt
# 编写剧本
# cat test_vars.yml
- hosts: ywmonitor
vars_files: ./vars.yml
tasks:
- name: file
file:
path: "{{ dir}}/{{file}}"
state: touch
owner: "{{ user }}"
group: "{{group}}"
- name: select
debug:
msg: "vars: {{dir}}-{{file}}-{{user}}-{{file}}"
# 结果:
# ansible-playbook test_vars.yml
PLAY [ywmonitor] *************************************************************************************************************************
TASK [Gathering Facts] *******************************************************************************************************************
ok: [172.31.0.1]
TASK [file] ******************************************************************************************************************************
changed: [172.31.0.1]
TASK [select] ****************************************************************************************************************************
ok: [172.31.0.1] => {
"msg": "vars: /data-test.txt-ec2-user-test.txt"
}
PLAY RECAP *******************************************************************************************************************************
172.31.0.1 : ok=3 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
3.2.2 共用变量根据主机组使用变量
xxxx-check.yml
group_vars/
lb/vars.yml #存放lb组的变量
web/vars.yml #存放web组的变量
data/vars.yml #存放xxx组的变量
all/vars.yml #所有主机共用的变量
未来一般使用all分组即可,把所有变量存放在一起,供剧本使用.
# 创建变量vars.yaml存放地址
mkdir group_vars/all/vars.yml
# cat group_vars/all/vars.yml
user: ec2-user
group: ec2-user
dir: /data
file: test1.txt
# 剧本
# cat groupvar.yaml
- hosts: gw
tasks:
- name: " 测试变量内容"
debug:
msg: "{{user}}-{{group}}"
- hosts: ywmonitor
tasks:
- name: "单独测试组是否识别"
debug:
msg: "{{user}}-{{group}}-{{file}}"
# 执行结果显示:
"msg": "ec2-user-ec2-user"
"msg": "ec2-user-ec2-user-test1.txt"
# 如果是gw单独的变量分开来了,那只能gw组可以使用,其余组使用不了
vim group_vars/gw/vars.yml
lbs: test.xc.com
test: test
# groupvars.yml
- hosts: gw
tasks:
- name: " 测试变量内容"
debug:
msg: "{{lbs}}-{{test}}"
- hosts: ywmonitor
tasks:
- name: "单独测试组是否识别"
debug:
msg: "{{user}}-{{group}}-{{file}}"
3.3 register变量 注册变量
本质上就是用来实现脚本中的 反引号功能 ip=`hostname -I`
用户通过命令获取的内容都存放到Register变量中.
# register.yml
- hosts: ywmonitor
tasks:
- name: get date
shell: date +%F
register: result
- name: print result 变量内容
debug:
msg: |
"register变量的全部内容是:{{result}}"
"register变量的全部内容是:{{result.stdout}}"
# msg的竖线: | 表示下面是多行的
# 执行结果ansible-playbook register.yml
PLAY [ywmonitor] *************************************************************************************************************************
TASK [Gathering Facts] *******************************************************************************************************************
ok: [172.31.0.1]
TASK [get date] **************************************************************************************************************************
changed: [172.31.0.1]
TASK [print result 变量内容] *************************************************************************************************************
ok: [172.31.0.1] => {
"msg": "\"register变量的全部内容是:{'changed': True, 'stdout': '2026-05-16', 'stderr': '', 'rc': 0, 'cmd': 'date +%F', 'start': '2026-05-16 19:09:11.905330', 'end': '2026-05-16 19:09:11.908919', 'delta': '0:00:00.003589', 'msg': '', 'stdout_lines': ['2026-05-16'], 'stderr_lines': [], 'failed': False}\"\n\"register变量的全部内容是:2026-05-16\"\n"
}
PLAY RECAP *******************************************************************************************************************************
172.31.0.1 : ok=3 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
register注册变量:
变量.stdout 获取输出即可.
result是json形式数据.
key: value
键: 值
变量: 内容
date +%F
stdout部分是我们想要的内容.
register变量result .
result.stdout #std standard output 标准输出.
3.4 facts 变量 与 Jinja2模板
运行剧本的时候ans会收集每个主机的基本信息,这些信息形成的变量叫做facts变量.
facts变量setup模块获取
template模块与xxx .j2文件
应用场景:
1.进行分发配置文件或文件的时候,需要在文件中使用变量,需要使用jinja2文件 nginx .conf .j2,需要使用template模块进行分发.
2.进行判断
常用fact变量
ansible_hostname #主机名
ansible_memtotal_mb #内存大小(总计) 单位mb
ansible_processor_vcpus #cpu数量
ansible_default_ipv4 .address #默认的网卡ip eth0
ansible_distribution #系统发行版本名字
CentOS Ubuntu Debian
ansible_processor_vcpus
ansible_processor_cores
ansible_date_time .date
找一台机器可以看到全部信息:ansible 172.31.0.1 -m setup
# 1.批量修改系统/etc/motd文件,登录的时候输出系统的基本信息.
输出主机名
输出内存总大小
输出ip地址
发行版本
cpu数
核心数
# templates/motd.j2内容
# cat templates/motd.j2
welcome to oldboy elastic linux system操作需谨慎,删根弹指间.
主机名: {{ ansible_hostname }}
ip地址: {{ ansible_default_ipv4 .address }} # 根据缩进来获取信息
内存大小: {{ ansible_memtotal_mb }}
CPU数量: {{ ansible_processor_vcpus }}
核心总数: {{ ansible_processor_cores }}
发行版本: {{ ansible_distribution }}
# motd.yml剧本编写
- hosts: ywmonitor
# gather_facts: no # 关闭配置:关闭自动收集
tasks:
- name: "分发 motd 文件"
template:
src: templates/motd.j2
dest: /etc/motd
backup: yes
- name: "验证 motd 内容"
command: cat /etc/motd
register: motd_content
changed_when: false # 标记为不改变状态,避免影响幂等性判断
- name: "显示 motd 内容"
debug:
var: motd_content.stdout_lines
# 结果内容:
PLAY [ywmonitor] *************************************************************************************************************************
TASK [Gathering Facts] *******************************************************************************************************************
ok: [172.31.0.1]
TASK [分发 motd 文件] ********************************************************************************************************************
ok: [172.31.0.1]
TASK [验证 motd 内容] ********************************************************************************************************************
ok: [172.31.0.1]
TASK [显示 motd 内容] ********************************************************************************************************************
ok: [172.31.0.1] => {
"motd_content.stdout_lines": [
"welcome to test elastic linux system操作需谨慎,删根弹指间.",
"主机名: monitor",
"ip地址: 172.31.0.1",
"内存大小: 7739",
"",
"CPU数量: 4",
"核心总数: 2",
"发行版本: Amazon"
]
}
PLAY RECAP *******************************************************************************************************************************
172.31.0.1 : ok=4 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
# 温馨提示: template vs copy模块
copy仅仅传输数据,复制文件.
template 传输数据,复制文件的时候,文件中的变量会被解析和运行.
- hosts: all
gather_facts: no
tasks:
- name: 分发motd文件
template:
src: templates/motd.j2
dest: /etc/motd
backup: yes
- name: 分发motd文件
copy:
src: templates/motd.j2
dest: /tmp/motd
backup: yes
关于facts变量实际应用案例:
1. 通过facts变量获取系统的基本信息
2. 通过facts变量获取信息并进行判断
3. 如果不需要可以进行关闭,加速剧本的运行( gather_facts: no)
判断使用:
# 2.根据主机名或ip或其他条件,生成不同的配置文件
/tmp/keepalived.conf
lb01
lb02
配置文件内容
/tmp/keepalived.conf
web01 配置文件内容
state MASTER
/tmp/keepalived.conf
backup 配置文件内容
state BACKUP
- hosts: all
tasks:
- name: 分发配置文件
template:
src: templates/keepalived.conf.j2
dest: /tmp/keepalived.conf
cat templates/keepalived.conf.j2
{% if ansible_hostname "web01" %}
state 主节点
{% elif ansible_hostname "backup" %}
state 备节点
{% endif %}
3.循环
配置文件server .conf web服务器的/tmp/目录下
10 .0.0.5
10 .0.0.6
10 .0.0.7
10 .0.0.8
10 .0.0.9
10 .0.0.10
{% for ip in [1,2,3,4,5,6] %}
10 .0.0.{{ ip }}
{% endfor %}
{% for ip in range(2,11) %}
10 .0.0.{{ ip }}
{%endfor%}
{% for ip in ["lidao","oldwang"] %}
10 .0.0.{{ ip }}
{%endfor%}
浙公网安备 33010602011771号