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

ansible变量-循环-判断-jinja2模板

1. ✅ansible变量

1.1. 📝主机清单变量-自动修改主机名

  • 1️⃣修改主机清单,定义主机名变量
vim hosts [lb] 172.16.1.5 hostname=lb01.zhubl.xyz 172.16.1.6 hostname=lb02.zhubl.xyz [web] 172.16.1.7 hostname=web01.zhubl.xyz 172.16.1.8 hostname=web02.zhubl.xyz 172.16.1.9 hostname=web03.zhubl.xyz 172.16.1.10 hostname=web04.zhubl.xyz [db] 172.16.1.51 hostname=db01.zhubl.xyz 172.16.1.52 hostname=db02.zhubl.xyz [nfs] 172.16.1.31 hostname=nfs01.zhubl.xyz [bak] 172.16.1.41 hostname=backup.zhubl.xyz [web:vars] password=zhubl0007 [db:vars] password=zhubl0996
  • 2️⃣准备hosts文件
vim ./files/hosts 127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6 172.16.1.5 lb01 lb01.zhubl.xyz 172.16.1.6 lb02 lb02.zhubl.xyz 172.16.1.7 web01 web01.zhubl.xyz 172.16.1.8 web02 web02.zhubl.xyz 172.16.1.9 web03 web03.zhubl.xyz 172.16.1.10 web04 web04.zhubl.xyz 172.16.1.31 nfs01 nfs01.zhubl.xyz 172.16.1.41 backup backup.zhubl.xyz 172.16.1.51 db01 db01.zhubl.xyz 172.16.1.52 db02 db02.zhubl.xyz 172.16.1.61 m01 m01.zhubl.xyz 172.16.1.62 m02 m02.zhubl.xyz
  • 3️⃣编写playbook剧本
- hosts: web:db tasks: - name: 修改主机名 hostname: name: "{{ hostname }}" - name: 查看主机名 debug: msg: "{{ hostname }}" - name: 拷贝hosts文件 copy: src: ./files/hosts dest: /etc/hosts backup: yes - name: 修改用户密码 user: name: zbl password: "{{ password|password_hash('sha512','zbl') }}" state: present - name: 查看用户密码 debug: msg: "{{ password }}"
  • 4️⃣运行playbook剧本
ansible-playbook -i hosts 09.hostname.yml

  • 5️⃣检查
ansible -i hosts all -m shell -a 'hostname'

2. ✅ansible循环

  • 列表变量
fruits: - a - b - c fruits=["a","b","c"] loop/with_items 循环对列表进行取值

2.1. ☀️批量添加用户

  • 1️⃣编写playbook剧本
- hosts: web tasks: - name: groupadd group: name: "{{ item.name }}" gid: "{{ item.gid }}" state: present loop: - { name: "zbl01",gid: "5060" } - { name: "zbl02",gid: "5070" } - { name: "zbl03",gid: "5080" } - { name: "zbl04",gid: "5090" } - name: useradd user: name: "{{ item.name }}" uid: "{{ item.uid }}" group: "{{ item.name }}" state: present loop: - { name: "zbl01",uid: "5060" } - { name: "zbl02",uid: "5070" } - { name: "zbl03",uid: "5080" } - { name: "zbl04",uid: "5090" }
  • 2️⃣运行playbook剧本
ansible-playbook -i hosts 10.useradd.yml

  • 3️⃣检查
ansible -i hosts web -m shell -a 'egrep zbl0[1-4] /etc/passwd'

3. ✅facts变量与条件判断when结合

3.1. 🌏不同的操作系统安装软件包

  • 编写playbook剧本
  • when与facts变量结合
- hosts: web gather_facts: true tasks: - name: yum yum: name: cowsay state: latest when: ansible_distribution is match("Kylin|Rocky") - name: apt apt: name: cmatrix state: latest when: ansible_distribution is match("Ubuntu|Debian")
  • 运行playbook剧本
ansible-playbook -i hosts 11.yum.yml

  • 检查
ansible -i hosts web -m shell -a 'rpm -qa cowsay'

4. ✅register变量与条件判断when结合

  • 编写playbook剧本
- hosts: web:ubt gather_facts: true tasks: - name: register shell: hostnamectl | awk '/Operating System/{print $3}' register: os - name: yum yum: name: cowsay state: latest when: os.stdout is match("Kylin|Rocky") - name: apt apt: name: cmatrix state: latest when: os.stdout is match("Ubuntu|Debian")
  • 运行playbook剧本
ansible-playbook -i hosts 12.when_register.yml

5. ✅j2模板与if条件判断结合

5.1. 🍀部署keepalived服务

  • 使用j2模板发送配置文件到被管理主机上
  • 1️⃣准备j2模板
vim files/keepalived.conf.j2 ! Configuration File for keepalived global_defs { router_id {{ansible_hostname}} } {% if ansible_hostname is match("lb01") %} vrrp_script check_lb.sh { script /server/scripts/check_lb.sh interval 2 weight 1 user root } {% endif %} vrrp_instance lb_vip_3 { {% if ansible_hostname is match("lb01") %} state MASTER priority 100 {% elif ansible_hostname is match("lb02") %} state BACKUP priority 50 {% endif %} interface ens33 virtual_router_id 51 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 10.0.0.3/24 dev ens33 label ens33:1 } {% if ansible_hostname is match("lb01") %} track_script { check_lb.sh } {% endif %} }
  • 2️⃣编写playbook剧本
- hosts: lb gather_facts: true tasks: - name: install yum: name: keepalived state: latest - name: copy template: src: ./files/keepalived.conf.j2 dest: /etc/keepalived/keepalived.conf backup: true - name: start systemd: name: keepalived enabled: yes state: restarted
  • 3️⃣运行playbook剧本
ansible-playbook -i hosts 13.keepalived_j2.yml

  • 4️⃣检查
ansible -i hosts lb -m shell -a 'hostname -I'

6. ✅j2模板与for循环结合

6.1. 🌟分发nfs配置文件(单变量)

  • 1️⃣定义变量列表
vim group_vars/all/vars.yml nfs_dir: - /nfs01/ - /nfs02/ - /nfs03/
  • 2️⃣准备j2模板文件
vim files/exports.j2 {% for dir in nfs_dir %} #共享目录{{ dir }} {{ dir }} 172.16.1.31/24(rw,all_squash) {% endfor %}
  • 3️⃣编写playbook剧本
- hosts: nfs tasks: - name: template template: src: ./files/exports.j2 dest: /tmp/exports
  • 4️⃣运行playbook剧本
ansible-playbook -i hosts 14.export_j2.yml

  • 5️⃣检查
ansible -i hosts nfs -m shell -a 'cat /tmp/exports'

6.2. 🌟分发rsync配置文件(多变量)

  • 1️⃣定义变量列表
vim group_vars/all/vars.yml rsync_dirs: - {module: "data",path: "/data/"} - {module: "blog",path: "/app/code/blog/"} - {module: "backup",path: "/nfs/backup/"}
  • 2️⃣准备j2模板文件
vim files/rsyncd.conf.j2 {% for dir in rsync_dirs %} [{{ dir.module }}] comment = {{ dir.module }} path = {{ dir.path }} {% endfor %}
  • 3️⃣编写playbook剧本
- hosts: bak tasks: - name: rsync template: src: ./files/rsyncd.conf.j2 dest: /tmp/rsyncd.conf
  • 4️⃣运行playbook
ansible-playbook -i hosts 15.rsync_j2.yml

  • 5️⃣检查
ansible -i hosts bak -m shell -a 'cat /tmp/rsyncd.conf'

6.3. 🌟分发nginx配置文件

  • 1️⃣定义变量列表
vim group_vars/all/vars.yml sites: - bird - ba - china
  • 2️⃣准备j2模板文件
vim files/zhubl.xyz.conf.j2 server { listen 80; server_name {{ item }}.zhubl.xyz access_log /var/log/nginx/{{ item }}-access.log main; error_log /var/log/nginx/{{ item }}-error.log notice; root /app/code/{{ item }}/ location / { index index.html } }
  • 3️⃣编写playbook剧本
- hosts: web tasks: - name: copy template: src: ./files/zhubl.xyz.conf.j2 dest: /tmp/{{ item }}.zhubl.xyz.conf loop: "{{ sites }}"
  • 4️⃣运行playbook
ansible-playbook -i hosts 16.nginx_j2.yml

  • 5️⃣检查
ansible -i hosts web -m shell -a 'ls -l /tmp/*.conf'

  • 生成数字序列
{% for ip in range(2,11) %} 10.0.0.{{ ip }} {% endfor %} {% for ip in ["1","2"] %} 10.0.0.{{ ip }} {% endfor %}

7. ✅总结

  • 剧本循环
  • jinja2模板循环
  • 批量修改主机名(主机清单变量)
  • 目标:rsync,nfs,lsync,web,nginx,php
  • 剧本
    • 剧本文件
    • 变量文件
    • 配置文件(jinja2)

http://www.jsqmd.com/news/464611/

相关文章:

  • 5分钟搞定Flink1.19本地部署:用JDK17运行WordCount示例教程
  • 7步掌握 Angular 项目的 Pull Request 评审流程:从提交到合并的完整指南
  • ansible变量-调试-优化
  • docker容器安装与使用
  • 【Gromacs】使用伞形采样研究Her2蛋白聚集的详细操作指南
  • 国产数据库新选择:GBase-8a单机版在Linux下的保姆级安装教程(附常见问题解决)
  • STM32以太网开发实战:DP83848 vs LAN8742选型指南(附CubeMX配置)
  • MATLAB模糊控制器实战:从零搭建智能小费计算系统(附完整代码)
  • Mysql 笔记
  • PyTorch反向传播实战:从计算图到梯度下降的完整代码解析(附可视化训练过程)
  • 从数学推导到代码实现:手把手教你写PyTorch自定义权重初始化
  • 杰理AC701N的板级配置AD的使用
  • Qt信号槽进阶指南:从Qt4到Qt5的信号重载与槽函数优化(避坑大全)
  • 从零到专业:3个AI提示词框架让你工作效率翻倍(含避坑指南)
  • 1为何扣子空间智能体默认不支持短信与邮件发送:技术沙盒、安全合规与插件生态深度解析
  • FPGA开发者的效率神器:3种方法解决Vivado多版本默认启动问题(含拖拽技巧)
  • WinForm程序如何优雅地请求管理员权限?3种方法实测对比(含UAC原理)
  • DIN 75220 标准汽车阳光模拟试验与户外试验对比研究
  • 04. Capture 中 Part Manager 应用场景(二)管理变种 BOM I OrCAD X Capture CIS 设计小诀窍第三季
  • EtherCAT从零到实战:如何用树莓派搭建低成本运动控制原型(附IGH配置指南)
  • SQLyog保姆级教程:从安装到实战操作MySQL数据库(附常见问题解决)
  • 华为云ModelArts实战:5分钟搞定深度学习模型训练(附OBS上传避坑指南)
  • 从路由器转发到代码实现:图解分组交换时延计算全流程
  • 从Shadertoy到Cesium:那些GLSL移植踩过的坑(烟雾效果调试实录)
  • 实时美颜滤镜卡顿怎么办?美颜sdk滤镜特效开发优化方案
  • 从修车工视角看OBD:揭秘4S店不会告诉你的10个诊断仪使用技巧
  • 项目日程规划工具有哪些?2026年热门产品推荐与测评
  • MMDVM盒子pi-star系统4G网卡配置全攻略:从识别到路由优化
  • OpenClaw 如何与硬件结合?Voice Agent 走进物理世界的硬核经验分享丨活动回顾,Physical AI Camp 北京站
  • SystemVerilog约束调试指南:当randomize()失败时我们该检查什么?