当前位置: 首页 > news >正文

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 等仓库)

http://www.dtcms.com/a/395941.html

相关文章:

  • Zabbix7 监控USG6300E 并发IPv4会话数
  • Qt中使用多线程的范式
  • c语言10:指针加减指针的那些事儿
  • 数据库成为突破口:勒索软件攻击始于暴露的Oracle服务器
  • PT100铂电阻高精度原理图设计,已量产(温度传感器)
  • 推荐 6 个本周 yyds 的 GitHub 项目。
  • 内存释放机制以及栈和堆(c++)
  • PCL基础:点云体积计算,若需更精确的体积估算,可采用 Alpha Shape 或 Marching Cubes 等方法重建表面后再进行积分计算。
  • OSPF实验-20250922
  • Python控制流概述
  • 【LLM学习】【Ollama】四、MCP
  • 5G RedCap模组:轻量化5G技术的商业化实现
  • 深入探索卷积神经网络:从基础到高级架构(二)
  • 什么是DeepSeek-V3.1-Terminus版本?
  • 【C语言代码】堵车问题
  • A Survey of Zero-Shot Learning: Settings, Methods, and Applications
  • Windows连接Linux做开发的安装和配置
  • 【C++】lambda表达式类型相关问题
  • HTML应用指南:利用GET请求获取全国大疆限飞区域shp图层信息
  • Nginx进阶(二)
  • VSCode+WSL+cpolar:打造跨平台的随身Linux开发舱
  • Redis高可用方案:主从复制、哨兵与集群
  • STM32_03_库函数
  • SGP30气体传感器详解 (STM32)
  • stm32 BootLoader之检查栈顶地址是否合法(否则无法跳转到APP程序)
  • PyTorch 神经网络工具箱学习总结
  • 容器化 Spring Boot 应用程序
  • python 打包单个文件
  • Python自学21 - Python处理图像
  • 比特浏览器的IP适配性