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

ansible变量-调试-优化

1. ✅ansible变量

1.1. 📝列表变量

fruits: - "苹果" - "香蕉" - "火龙果" python中需要写在一行 fruits = ["苹果","香蕉","火龙果"] 列表搭配着循环使用

1.2. 🔐字典变量

  • 字典dict 服务器信息,一组相关的内容
rsync_server: ip: "172.16.1.41" module: blog bak_dir: /nfs/backup/blog/ user: www userid: 1999 password: "rsync_backup:1"
  • 编写playbook剧本
- hosts: nfs vars: nfs_server: ip: "10.0.0.31" dir: "/nfs/backup/blog/" user: - "zhu" - "zbl" user_id: - { name: "zhu01",uid: "1000" } - { name: "zhu02",uid: "1001" } tasks: - name: print debug: msg: | nfs服务器ip: {{ nfs_server.ip }} nfs服务器目录: {{ nfs_server.dir }} nfs服务器用户: {{ nfs_server.user }} - name: print debug: msg: | nfs服务器ip: {{ nfs_server.ip }} nfs服务目录: {{ nfs_server.dir }} nfs服务器用户: {{ item.name }} nfs服务器用户id: {{ item.uid }} loop: "{{ nfs_server.user_id }}"
  • 运行playbook
ansible-playbook -i hosts 19.nfs_info.yml

2. ✅handlers

  • 触发器:模块状态变化(分发配置文件,文件内容变化),然后触发handlers内容
  • 问题:分发配置文件后,服务是启动还是重启?
  • 需求:配置文件变化或为变化,变化后需要重启服务
#notify+handlers 1.分发配置 2.启动服务(正常) 3.重启服务(配置变化后)
1.编写playbook剧本 [root@m02 /server/ans/playbooks]# vim 20.handlers.yml - hosts: nfs tasks: - name: 分发配置文件 template: src: ./files/exports.j2 dest: /tmp/exports notify: - 重启服务 handlers: - name: 重启服务 systemd: name: nfs state: reloaded 2.运行playbook剧本 [root@m02 /server/ans/playbooks]# ansible-playbook -i hosts 20.handlers.yml

3. ✅ansible目录规范roles结构

roles/ └── role_name/ # 角色名称 ├── defaults/ # 默认变量(优先级最低) │ └── main.yml ├── vars/ # 内部变量(优先级高于 defaults) │ └── main.yml ├── tasks/ # 任务列表 │ └── main.yml ├── handlers/ # 处理器(如重启服务) │ └── main.yml ├── templates/ # Jinja2 模板文件 ├── files/ # 静态文件(如配置文件) ├── meta/ # 元数据(依赖关系等) │ └── main.yml └── README.md # 可选:角色说明文档 └── group_vars/all/main.yml #共享变量 └── hosts #主机清单 └── ansible.cfg #ansible配置文件 └── top.yml #主剧本(运行此剧本)

4. ✅ansible部署rsync服务

  • 1️⃣创建roles目录结构
mkdir -p rsync_server/{files,tasks,handlers,templates}

  • 2️⃣在group_vars/all/main.yml中定义变量列表
rsync_server: ip: "172.16.1.41" module: blog bak_dir: /nfs/backup/blog/ user: www userid: 1999 password: "rsync_backup:1"
  • 3️⃣在tasks目录下编写playbook
- name: 1.安装rsync软件包 yum: name: rsync state: latest tags: - install - name: 2.修改配置文件 template: src: rsyncd.conf.j2 dest: /etc/rsyncd.conf backup: yes notify: restart_rsyncd - name: 3.添加www虚拟用户 user: name: "{{ rsync_server.user }}" uid: 1999 shell: /sbin/nologin create_home: no state: present - name: 4.创建/nfs/backup/blog/备份目录,修改所有者 file: path: "{{ rsync_server.bak_dir }}" owner: "{{ rsync_server.user }}" group: "{{ rsync_server.user }}" state: directory - name: 5.添加密码文件,权限为600 lineinfile: path: /etc/rsyncd.passowrd line: "{{ rsync_server.password }}" owner: root group: root mode: '0600' create: yes - name: 6.启动rsyncd服务 systemd: name: rsyncd enabled: yes state: started
  • 4️⃣在templates目录下创建rsyncd.conf.j2模板文件
##rsyncd.conf start## fake super = yes uid = {{ rsync_server.user }} gid = {{ rsync_server.user }} use chroot = no max connections = 2000 timeout = 600 pid file = /var/run/rsyncd.pid lock file = /var/run/rsync.lock log file = /var/log/rsyncd.log ignore errors read only = false list = false #hosts allow = 10.0.0.0/24 #hosts deny = 0.0.0.0/32 auth users = rsync_backup secrets file = /etc/rsync.password ##################################### [{{ rsync_server.module }}] comment = path path = {{ rsync_server.bak_dir }}
  • 5️⃣在handlers目录下编写handlers
- name: restart_rsyncd systemd: name: rsyncd state: restarted
  • 6️⃣在roles目录下编写主top.yml主playbook
- hosts: bak roles: - rsync_server
  • 7️⃣运行主playbook
ansible-playbook top.yml

  • 8️⃣检查
ansible bak -m shell -a 'systemctl status rsyncd'

5. ✅ansible部署nfs服务

  • 1️⃣创建roles目录结构
mkdir -p rsync_server/{files,tasks,handlers,templates}

  • 2️⃣在group_vars/all/main.yml中定义变量列表
nfs_server: ip: "172.16.1.31" nfs_dir: /nfs/blog/uploads/ user: www userid: 1999
  • 3️⃣在nfs_server/templates目录下创建exports.j2模板文件
{{ nfs_server.nfs_dir }} 172.16.1.0/24(rw,all_squash,anonuid=1999,anongid=1999)
  • 4️⃣编写playbook剧本
- name: 1.安装rpcbind,nfs-utils软件包 yum: name: rpcbind,nfs-utils state: latest - name: 2.修改配置文件 template: src: exports.j2 dest: /etc/exports backup: yes notify: reload_nfs - name: 3.添加www虚拟用户 user: name: "{{ nfs_server.user }}" uid: "{{ nfs_server.userid }}" shell: /sbin/nologin create_home: no state: present - name: 4.创建共享目录,修改所有者 file: path: "{{ nfs_server.nfs_dir }}" owner: "{{ nfs_server.user }}" group: "{{ nfs_server.user }}" state: directory - name: 5.启动rpcbind服务 systemd: name: "{{ item }}" enabled: yes state: started loop: - rpcbind - nfs-utils
  • 5️⃣在roles编写top.yml主剧本
- hosts: nfs roles: - role: nfs_server
  • 6️⃣运行playbook
ansible-playbook top.yml

  • 7️⃣检查
ansible nfs -m shell -a 'showmount -e'

6. ✅ansible调试功能

6.1. 🔍语法检查

ansible-playbook -C top.yml -C 模拟运行剧本,检查错误,register变量无法使用 --syntax-check 语法检查,不运行

6.2. ☀️显示执行详细过程

ansible-playbook -vvv top.yml

6.3. 🎯tag标签

  • 在剧本中定义标签,运行的时候指定标签
- name: 1.安装rsync软件包 yum: name: rsync state: latest tags: - install - name: 2.修改配置文件 copy: src: rsyncd.conf dest: /etc/rsyncd.conf backup: yes tags: - config notify: restart_rsyncd - name: 3.添加www虚拟用户 user: name: www uid: 1999 shell: /sbin/nologin create_home: no state: present tags: - config - name: 4.创建/nfs/backup/blog/备份目录,修改所有者 file: path: "{{ bak_dir }}" owner: www group: www state: directory tags: - config - name: 5.添加密码文件,权限为600 : path: /etc/rsyncd.passowrd line: "rsync_backup:1" owner: root group: root mode: '0600' create: yes tags: - config - name: 6.启动rsyncd服务 systemd: name: rsyncd enabled: yes state: started tags: - start
  • 查看剧本中的标签
ansible-playbook -i hosts --list-tags top.yml

  • 运行指定标签
ansible-playbook -i hosts -t config top.yml

  • 排除指定标签,运行其他的
ansible-playbook -i hosts --skip-tags install top.yml

7. ✅ansible优化

7.1. 🚀性能优化

  • 1️⃣配置文件目录的优化(roles)
  • 2️⃣关闭facts变量
  • 3️⃣主机清单优化
  • 4️⃣管理并发数优化
[defaults] host_key_checking = False deprecation_warnings = False interpreter_python=/usr/bin/python3 gathering = explicit inventory = ./hosts forks = 10 [inventory] [privilege_escalation] [paramiko_connection] [ssh_connection] [persistent_connection] [accelerate] [selinux] [colors] [diff]

7.2. 🔐安全优化

7.2.1. vault加密/解密

  • vault加密,敏感信息加密(主机清单⽂件中有密码,剧本中有敏感信息)
ansible-vault encrypt 文件(剧本,主机清单文件) #1.加密 ansible/ansible-playbook --ask-vault-pass xxxx #2.运行 ansible-vault decrypt 文件(剧本,主机清单文件) #3.解密

7.2.2. 配置sudo

  • 安全
    • 配置sudo⽤⼾ ans ALL=(ALL) NOPASSWD: ALL
    • 配合vpn,jumpserver⼀起使⽤
    • ⽤⼾--->vpn---->jumpserver(跳板机)---->ansible
    • ⽤⼾的密码,进⾏加密( hash, ansible-vault)
  • 所有被管理节点上添加ansible用户,设置密码
  • 所有被管理节点上配置ansible sudo权限ans ALL=(ALL) NOPASSWD: ALL
  • 管理端与被管理端密钥认证:分发密钥发到ans⽤⼾.
  • 管理端: ansible.cfg配置,通过ans⽤⼾连接,远程连接端⼝号, 使⽤sudo.
  • 管理端
1.添加ans用户 ansible all -m shell -a 'echo "ans ALL=(ALL) NOPASSWD: ALL" >>/etc/sudoers' ansible all -m shell -a 'useradd ans' ansible all -m shell -a 'echo zhubl996 |passwd --stdin ans' 2.修改ansible配置文件 vim /etc/ansible/ansible.cfg [defaults] sudo_user = ans ##被管理端上具有sudo权限的用户 nopasswd: ALL remote_user = ans ##被管理端使用的用户,不指定默认是当前用户/root remote_port = 22 ##被管理端ssh端口号 host_key_checking = False log_path = /var/log/ansible.log [inventory] [privilege_escalation] become=True ##开启sudo功能 become_method=sudo ##使用sudo命令 become_user=root ##普通用户切换为root [paramiko_connection] [ssh_connection] [persistent_connection] [accelerate] [selinux] [colors] [diff] 3.重新分发密钥给ans普通用户. ssh-copy-id ans@172.16.1.7 ...所有节点都要分发密钥. 4.测试 ansible all -m ping
  • 被管理端
连接到某一台机器修改ssh配置文件关闭root远程登录功能. 修改/etc/ssh/sshd_config sed PermitRootLogin=no

8. ✅总结

  • 主机清单
  • ansible模块
  • ansible剧本(变量,判断,循环)
  • ansible roles
  • 调试 -C/tags,ignore_errors
  • jinja2模板文件
  • 优化
  • 最终目标:书写各种服务的剧本(通过变量控制剧本)相当于变量就是剧本的入口

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

相关文章:

  • 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()失败时我们该检查什么?
  • 2026年机床选购指南:5大品牌对比帮你省下10万预算
  • 从Java全栈到Vue3实战:一次真实技术面试的深度剖析
  • 避坑指南:CLion Remote SSH安装Backend时网络卡顿的5种应急方案