ansible-playbook的使用
ansible-playbook的使用
- 一、playbook 的核心元素
- 二、playbook 使用示例
- 2.1 基础模块使用
- 2.2 触发式重启(Handlers)
- 2.3 变量化模替代静态复制
- 2.4 单参数循环(loop)
- 2.5 多场景循环(单参数 / 多参数)
- 2.6 模板渲染系统信息(结合 Facts)
- 2.7 debug 模块 + Facts 变量
- 总结
一、playbook 的核心元素
hosts
:playbook配置文件中用的主机
name
:play 的描述性名称(可选,用于日志和输出展示)
tasks
:任务列表
vars
: 变量
templates
:包含模板语法的文本文件
handlers
:由特定条件触发的任务————通过notify触发
roles
:用于层次性、结构化地组织playbook。roles 能够根据层次型结构自动装载变量文件、tasks以及handlers等
二、playbook 使用示例
2.1 基础模块使用
软件安装与服务启动
- 用 yum 模块安装 redis(state: latest 确保安装最新版本)
- 用 service 模块启动 redis 服务
[root@dns-nfs-prom-ansible playbooks]# vim redis_first.yaml
- hosts: LBremote_user: roottasks:- name: install redisyum: name=redis state=latest- name: start redisservice: name=redis state=started# 执行
[root@dns-nfs-prom-ansible playbooks]# ansible-playbook redis_first.yaml PLAY [LB] ************************************************************************************************************TASK [Gathering Facts] ***********************************************************************************************
ok: [192.168.168.133]
ok: [192.168.168.132]TASK [install redis] *************************************************************************************************
ok: [192.168.168.133]
ok: [192.168.168.132]TASK [start redis] ***************************************************************************************************
changed: [192.168.168.133]
changed: [192.168.168.132]PLAY RECAP ***********************************************************************************************************
192.168.168.132 : ok=3 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
192.168.168.133 : ok=3 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
2.2 触发式重启(Handlers)
- 用 copy 模块将控制节点的 /playbooks/redis.conf 复制到目标节点的 /etc/redis/redis.conf,并设置所有者为 redis
- 通过 notify + handlers 实现 “配置文件修改后自动重启 redis”
- 给 “复制配置” 任务加了 tags: configfile,支持后续仅执行该任务(如 ansible-playbook -t configfile redis_second.yaml)
[root@dns-nfs-prom-ansible playbooks]# vim redis_second.yaml
- hosts: LBremote_user: roottasks:- name: install redisyum: name=redis state=latest- name: copy config filecopy: src=/playbooks/redis.conf dest=/etc/redis/redis.conf owner=redisnotify: restart redistags: configfile - name: start redisservice: name=redis state=startedhandlers:- name: restart redisservice: name=redis state=restarted
2.3 变量化模替代静态复制
将 redis_second.yaml 中的 copy 模块替换为 template 模块,并用变量管理模板路径
- 定义变量 rediscf: /playbooks/redis.conf(模板文件路径)和 redis_port: 63790(可在模板中引用)
- 用 template 模块渲染模板文件
[root@dns-nfs-prom-ansible playbooks]# vim redis_three.yaml
- hosts: LBremote_user: rootvars:- rediscf: /playbooks/redis.conf- redis_port: 63790tasks:- name: install redisyum: name=redis state=latest- name: copy config filetemplate: src={{ rediscf }} dest=/etc/redis/redis.conf owner=redisnotify: restart redistags: configfile - name: start redisservice: name=redis state=startedhandlers:- name: restart redisservice: name=redis state=restarted
2.4 单参数循环(loop)
关闭 Facts 收集(gather_facts: false,减少执行时间),用 loop 循环遍历列表,批量安装 net-tools、tree、vim 三个软件
[root@dns-nfs-prom-ansible playbooks]# vim loop.yaml
- hosts: LBgather_facts: falsetasks: - name: install softwareyum:name: "{{ item }}"state: presentloop:- net-tools- tree- vim
2.5 多场景循环(单参数 / 多参数)
演示两种常见的循环场景,同样关闭 Facts 收集:
- 单参数循环(关闭服务):用 with_items 遍历 crond、rsyslog,批量停止两个系统服务
- 多参数循环(创建用户):用 “键值对” 列表({name: ‘user03’, uid: ‘8880’}),批量创建带指定 UID 的用户
[root@dns-nfs-prom-ansible playbooks]# vim with_item.yaml
- hosts: LBgather_facts: falsetasks: - name: 关闭多个服务systemd:name: "{{ item }}" # 使用这个格式来遍历state: stoppedwith_items: # 与模块并列#- nginx # 变量的值前使用"-"- crond- rsyslog- name: 批量创建用户user:name: "{{ item.name }}" # 多参数遍历写法uid: "{{ item.uid }}"state: presentwith_items:- { name: 'user03', uid: '8880' } # 变量名不可全数字,也不能数字开头,符号最好只包含_或-- { name: 'user04', uid: '9990' } # 冒号后同样要空一格
2.6 模板渲染系统信息(结合 Facts)
用 template 模块将 hello.j2 模板渲染为 /etc/hello 文件,并开启备份
核心逻辑:模板 + Facts 收集系统信息
- hello.j2 模板中引用了 Ansible 自动收集的 Facts 变量(如 ansible_hostname 主机名、ansible_memtotal_mb 总内存),无需手动定义变量
- backup: yes:若目标文件已存在且内容有变化,会自动生成备份文件(如 /etc/hello.2024-05-20@10:30:00~),便于回滚
[root@dns-nfs-prom-ansible playbooks]# cat hello.yaml
- hosts: alltasks:- name: template hellotemplate:src: ./hello.j2dest: /etc/hellobackup: yes # backup选项会同时生成一个备份文件(包含当前时间)[root@dns-nfs-prom-ansible playbooks]# cat hello.j2
--------------WELCOME TO YOUR SERVER!!!---------------
hostname: {{ ansible_hostname }}
{{ ansible_default_ipv4.interface }}.ip: {{ ansible_default_ipv4.address }}
内存大小: {{ ansible_memtotal_mb }}MB
发行版本: {{ ansible_distribution }} {{ ansible_distribution_version }}
cpu数量: {{ ansible_processor_vcpus }}
cpu核心数: {{ ansible_processor_cores }}[root@dns-nfs-prom-ansible playbooks]# ansible-playbook hello.yaml# LB 中查看
[root@LB ~]# cat /etc/hello
--------------WELCOME TO YOUR SERVER!!!---------------
hostname: LB
ens33.ip: 192.168.168.133
内存大小: 736MB
发行版本: Rocky 9.4
cpu数量: 1
cpu核心数: 1
2.7 debug 模块 + Facts 变量
开启 Facts 收集(gather_facts: True,默认开启,可省略),用 debug 模块打印两类变量:
- 自定义变量:打印 file: /etc/home 和 dir: /root
- Facts 变量:打印网卡 ens33 的 IP、DNS 服务器地址、MAC 地址
Facts 变量的三种引用方式(以 IP 为例):
字典嵌套
:ansible_facts[“ens33”][“ipv4”][“address”](最规范,兼容所有场景);点号简写
:ansible_ens33.ipv4.address(更简洁,推荐日常使用);列表引用
:ansible_all_ipv4_addresses(获取所有 IPv4 地址,返回列表)
[root@dns-nfs-prom-ansible playbooks]# vim facts.yaml
- hosts: LBgather_facts: Truevars:file: /etc/homedir: /roottasks:- name: print varsdebug:msg: 定义的变量:{{ file }}和{{ dir }}- name: print vars2debug:#msg: ip地址为{{ ansible_facts["ens33"]["ipv4"]["address"] }}msg: ip地址为{{ ansible_ens33.ipv4.address }}#msg: ip地址为{{ ansible_all_ipv4_addresses }}- name: print vars3debug:msg: dns地址为{{ ansible_dns.nameservers }}- name: print vars4debug:msg: mac地址为{{ ansible_ens33.macaddress }}[root@dns-nfs-prom-ansible playbooks]# ansible-playbook facts.yaml PLAY [LB] ************************************************************************************************************TASK [Gathering Facts] ***********************************************************************************************
ok: [192.168.168.133]
ok: [192.168.168.132]TASK [print vars] ****************************************************************************************************
ok: [192.168.168.133] => {"msg": "定义的变量:/etc/home和/root"
}
ok: [192.168.168.132] => {"msg": "定义的变量:/etc/home和/root"
}TASK [print vars2] ***************************************************************************************************
ok: [192.168.168.133] => {"msg": "ip地址为192.168.168.133"
}
ok: [192.168.168.132] => {"msg": "ip地址为192.168.168.132"
}TASK [print vars3] ***************************************************************************************************
ok: [192.168.168.133] => {"msg": "dns地址为['114.114.114.114']"
}
ok: [192.168.168.132] => {"msg": "dns地址为['114.114.114.114']"
}TASK [print vars4] ***************************************************************************************************
ok: [192.168.168.133] => {"msg": "mac地址为00:0c:29:7f:cb:d2"
}
ok: [192.168.168.132] => {"msg": "mac地址为00:0c:29:25:d8:36"
}PLAY RECAP ***********************************************************************************************************
192.168.168.132 : ok=5 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
192.168.168.133 : ok=5 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
总结
Ansible Playbook 是 Ansible 实现自动化任务编排的核心文件,采用 YAML
格式编写,用于定义一系列任务、变量、条件和执行逻辑,实现对被管理节点的批量配置、部署或操作
相比临时命令(Ad-hoc),Playbook 更适合复杂场景(如多步骤任务、依赖关系控制、动态配置),且支持版本化管理(可存入 Git 等仓库)