一、Ansilbe Playbook剧本
Ansible Playbook 的核心作用是通过声明式 YAML 文件实现自动化配置管理、应用部署和基础设施编排。它采用基础设施即代码(IaC)方式确保环境一致性,具备幂等性(可安全重复执行)、良好的可复用性以及跨平台支持特性。这种方案能显著提升运维效率(例如实现批量部署分钟级完成),有效减少人工错误,同时支持版本控制和审计追踪。它适用于云环境、服务器集群及网络设备等场景的标准化运维管理。
1.YAML
YAML是一种轻量级的人类可读数据序列化格式,采用直观的缩进结构和键值对表示方式。它支持常见数据类型如字符串、数字、布尔值、列表以及嵌套对象,广泛应用于配置文件和数据交换场景。YAML的主要优势在于其简洁易读的语法、出色的跨语言兼容性,以及通过注释提升代码可维护性的特性。
2.配置VIM编辑器
bash
vim ~/.vimrc
#设置自动缩进和扩展制表符,缩进宽度为2空格
set ai et ts=2
#可视化当前编辑行
set cursorline
#可视化当前编辑列
set cursorcolumn
二、Playbook基础语法
1.ping模块
bash
vim ping.yml
---
- name: test ping #剧本名称
hosts: all #作用主机(组)
tasks: #任务
- name: ping #任务1名成
ping: #所用模块
ansible-playbook --syntax-check ping.yml #检查文件语法
ansible-playbook ping.yml #执行剧本
2.file模块
bash
---
- name: test file
hosts: test
tasks:
- name: create dir
file: #file模块
path: /tmp/test/ #创建路径
state: directory #创建类型为目录
mode: '0755' #目录权限
3.copy模块
bash
---
- name: test | and >
hosts: test
tasks:
- name: test | #任务1
copy: #使用copy模块
dest: /tmp/test.txt #目标文件
content: | #追加文本
hello nihao!
hahahaha
- name: test >
copy:
dest: /tmp/test.txt
content: >
nihao xxxx
xxxxxxxxxx
4.user模块
bash
---
- name: create user
hosts: test
tasks:
- name: add user
user:
name: one
uid: 1011
group: test
password: "{{'123'|password_hash('sha512')}}"
state: present
- name: delete user
hosts: test
tasks:
- name: del user
user:
name: two
state: absent
remove: true
5.yum模块
bash
---
- name: manage packages
tasks:
- name: install pkg
yum:
name:
- nginx
- vsftpd
state: present
- name: update pkg
yum:
name: '*' #所有软件
state: latest #软件版本更新
二、Ansible变量
1.facts变量
在Ansible中,facts变量是由目标主机自动采集的系统信息,包含网络配置、硬件参数和系统版本等数据。通过内置的setup模块获取后,这些信息会以JSON格式存储,并可通过全局变量ansible_facts访问。这些数据常用于条件判断和动态配置任务。
默认情况下,Playbook执行时会自动收集facts数据。此外,用户还可以通过/etc/ansible/facts.d/目录添加自定义facts。要查看完整的facts信息,可以使用命令"ansible -m setup 主机名",这有助于实现基于主机特性的差异化运维操作。
2.查看facts变量
常用参数:
filter:用于过滤指定信息
bash
ansible test -m setup -a "filter=ansible_bios_version"
bash
---
- name: copy file with facts
hosts: webservers
tasks:
- name: use facts
copy:
content: "hostname: {{ ansible_hostname }}\nbios_version: {{ ansible_bios_version }}"
dest: /tmp/facts.txt
3.Ansible自定义变量
定义位置:
Inventory文件中定义变量
Inventory文件组的变量
Inventory文件主机的变量
剧本中组的变量
剧本中主机的变量
vars定义的变量
vars_files导入的变量
注册变量
roles中单独定义的变量
block中定义的变量
任务中定义的变量
命令行定义的变量
三、Ansible Playbook进阶
1.错误处理机制
当playbook中有多个任务时,一旦中间某个任务出现错误,后续任务都会终止执行。使用ignore_errors可以应用与tasks级别作用与忽略指定任务,也可以作用于全局所有任务。
bash
---
- name: test error
hosts: test
#ignore_errors: true 全局级
tasks:
- name: start nginx
service:
name: nginx
state: started
enabled: true
ignore_errors: true #任务级
- name: touch file
file:
path: /tmp/test.txt
state: touch
2.触发执行任务
使用handlers定义任务组 这些任务仅在收到notify通知时才会执行,即使收到多次notify,handlers任务也只执行一次,只有当主任务状态为changed时才会触发handlers,handlers会在所有常规任务完成后统一执行。
bash
---
- name: Handlers
hosts: test
tasks:
- name: nginx # 任务名称
template: # 使用template模块
src: nginx.conf.j2 # 源模板文件
dest: /etc/nginx/nginx.conf # 目标路径
owner: root # 文件属主
group: root # 文件属组
mode: 0644 # 文件权限
notify: # 触发条件:当文件内容变化时
- restart nginx # 调用名为"restart nginx"的handler
# Handlers定义(仅在notify触发时执行)
handlers:
# Handler1:重启Nginx服务
- name: restart nginx # handler名称(需与notify对应)
service: # 使用service模块
name: nginx # 服务名称
state: restarted # 操作类型:重启
enabled: yes # 设置开机自启
3.when条件判断
满足某些条件时才执行任务,多任务时使用and或者or进行连接,表达逻辑关系。
bash
---
- name: test when
hosts: test
tasks:
- name: modify /etc/motd
copy:
src: motd
dest: /etc/motd
when: > #多条件合并成1行
ansible_distribution == "Rocky"
and
ansible_distribution_major_version == "8.6"
4.register注册变量
Ansible的register指令是捕获任务结果的核心机制,它能将命令输出和模块返回值存储为变量,用于后续任务的动态判断。该指令在实现幂等性操作和流程控制方面发挥着重要作用,常见应用场景包括服务状态检测、文件存在性校验以及API响应处理。使用时需注意结合when条件判断和debug模块,灵活调用注册变量中的数据。
bash
---
- name: test register
hosts: test
ignore_errors: true
tasks:
- name: started nginx
service:
name: nginx
state: started
register: result
- name: debug out
debug:
msg: "nginx started error"
when: result.failed
4.block任务块
可以通过block关键字,将多个任务组合在一起。
rescue:block中的任务都执行成功则rescue中的任务不执行。
always:always中的任务总会执行。
bash
---
- name: test block
hosts: web
tasks:
block:
- name: install nginx
package:
name: nginx
state: present
register: install_result
- name: start nginx
service:
name: nginx
state: started
enabled: yes
register: service_result
rescue:
- name: error
debug:
msg: "Nginx部署失败!安装状态码:{{ install_result.rc|default('未执行') }} 服务状态码:{{ service_result.rc|default('未执行') }}"
always:
- name: end
debug:
msg: "执行完毕"
5.loop循环
相当于Shell中的for循环,变量名固定为item。
bash
---
- name: create users # 描述此Playbook的主要功能
hosts: web # 目标主机组
tasks:
- name: test loop # 任务名称
user: # 使用user模块管理用户账户
name: "{{item.iname}}" # 用户名:从循环变量获取
password: "{{item.ipass|password_hash('sha512')}}" # 密码:使用sha512加密
state: present # 确保用户存在
loop: # 循环结构:批量处理多个用户
- {"iname":"one", "ipass":"123456"}
- {"iname":"two", "ipass":"654321"}