第八篇:Ansible流程控制、调试、roles
流程控制⭐⭐⭐⭐
handlers触发器⭐⭐⭐⭐
- 应用场景:主要用于处理一些需要在配置变化后执行的操作(配置文件发生变化,重启对应的服务)
- 只用notify上面的模块发生变化(changed: True),才会触发通知执行对应的handlers
- handlers必须放在剧本最后
没有使用handlers

--- - hosts: nfs tasks: - name: 分发配置文件 copy: src: /etc/exports dest: ./exports - name: 重启服务 systemd: name: nfs state: reloaded # 不管配置文件有没有修改,都会执行重启服务
使用了handlers

--- - hosts: nfs tasks: - name: 测试 copy: src: ./exports_01 dest: /exports - name: 分发配置文件 copy: src: ./exports dest: /etc/exports backup: yes notify: - 重启服务 handlers: - name: 重启服务 systemd: name: nfs state: reloaded # 只有第二个copy才能触发通知
when判断⭐⭐
- 用于给ansible的模块设置是否运行条件
- when条件一般与facts变量或regisger变量一起使用
- 不符合条件的机器会显示skipping
when中使用的符号
条件符号 | == != > >= < <= |
逻辑运算 | and or not |
is match() |
用于检查某个变量是否与指定的正则表达式模式匹配 ansible_hostname is match("web|backup") |
is not match() |
用于检查某个变量是否不与指定的正则表达式模式匹配 ansible_hostname is not match("web|backup") |
- 案例:如果系统是centos,则安装sl、cowsay,如果系统是ubuntu,则安装cmatrix

--- - hosts: all tasks: - name: CentOS下载sl cowsay yum: name: sl,cowsay state: installed when: ansible_distribution == "CentOS" - name: Ubantu下载cmatrix apt: name: cmatrix state: installed when: ansible_distribution == "Ubuntu"
循环⭐⭐⭐⭐
- 两类循环(用法相同):
- with_*:with_items
- loop
批量创建文件,批量添加用户,批零启动或重启服务
批量启动服务rpcbind、nfs服务

--- - hosts: nfs tasks: - name: 批量启动rpcbind、nfs服务 systemd: name: "{{ item }}" state: restarted loop: - rpcbind - nfs
批量创建多个用户

--- - hosts: all tasks: - name: user: name: "{{ item.name }}" uid: "{{ item.uid }}" state: present loop: - { name: yuan,uid: 2020 } - { name: xiaojiang,uid: 2024 }
剧本调试⭐⭐
检查语法与单步执行
# -C(--check ):模拟运行(一些变量可能会报错,因为-C没有真正运行剧本) # ---syntax-check:只做语法检查,不运行 # --step:单步运行(以一个task为一步)
tags标签
- 加上标签进行分类
- 运行剧本时指定或排除特地标签:
- --list-tags:显示剧本中所有的tags标签
- -t:指定运行的标签(多个标签通过","分割)
- --skip-tags:排除不运行的标签(多个标签通过","分割)

--- - hosts: all tasks: - name: create a directory file: path: /opt/ state: directory owner: root group: root mode: 755 tags: - create - directory - name: create user user: name: yuanxiaojiang uid: 2026 state: present tags: - user
忽略错误
--- - hosts: all tasks: - name: 尝试安装某个软件包 apt: name: some_package state: present ignore_errors: yes # 如果安装失败,继续执行后面的任务
ignore_errors: true
true/false
yse/no
roles
jinja2模板⭐⭐⭐
- 应用场景:
- 在分发文件时,需要在文件中使用变量,需要使用jinja2文件与template模板
- 进行判断
- 进行循环
基本使用⭐⭐
# 1. 创建包含变量的模板文件 [root@m01 /server/scripts/playbook]# cat ./templates/motd.j2 主机名: {{ ansible_hostname }} ip地址: {{ ansible_default_ipv4.address }} 内存大小: {{ ansible_memtotal_mb }} CPU数量: {{ ansible_processor_vcpus }} 核心总数: {{ ansible_processor_cores }} 发行版本: {{ ansible_distribution }} # 2. 发送模板文件替代/etc/motd [root@m01 /server/scripts/playbook]# cat change_moth.yaml --- - hosts: web tasks: - name: 分发/motd文件 template: src: templates/motd.j2 dest: /etc/motd backup: yes
判断
--- - name: Jinja2 Conditional Example hosts: localhost gather_facts: no vars: is_production: false tasks: - name: Print message based on environment debug: msg: > {% if is_production %} This is a production environment. {% else %} This is not a production environment. {% endif %}
循环
配置文件 server.conf web服务器的/tmp/目录下 10.0.0.2 10.0.0.4 10.0.0.6 10.0.0.8 {% for ip in [2,4,6,8] %} 10.0.0.{{ ip }} {% endfor %} {% for ip in range(2,10,2) %} 10.0.0.{{ ip }} {%endfor%}
include文件包含
include:是一种动态包含其他任务或文件的机制,使得剧本可以更模块化和可维护
Roles⭐⭐⭐
roles:规范剧本目录结构的标准
roles官网:https://docs.ansible.com/ansible/latest/playbook_guide/playbooks_reuse_roles.htmlVault(加密)
ansible-vault:用于加密/解密指定的文件(hosts文件、变量文件)
# 进行加密 ansible-vault encrypt # 加密文件 # 进行使用 ansible --ask-vault-pass ansible-playbook --ask-vault-pass # 彻底解密 ansible-vault decrypt # 解密文件
Ansible优化⭐⭐⭐
提高Ansible性能⭐⭐⭐
# ssh连接速度优化,关闭UseDNS,GSSAPIAuthentication # ansible不运行交互式的命令 # 自建本地yum仓库,然后使用ansible的yum模块安装 # 调整ansible并发数量( ansible.cfg文件中 forks=5 ) # 给ansible中的facts配置缓存 gather_facts = True # 指定在执行playbook时是否自动收集目录主机中的系统信息 fact_caching = jsonfile # 选择缓存方式{jsonfile:json文件缓存,yaml:yaml文件缓存,redis:redis缓存} fact_caching_connection = /path/to/cache/facts # 指定缓存文件的路径 fact_caching_timeout = 86400 # 缓存失效时间,单位为秒 # 给主机进行分组操作和管理 # 不使用facts变量则关闭gather_facts 剧本中:gather_facts=no 配置文件中:gathering=explicit # 关闭控制ssh主机密钥检查配置选项(ansible配置文件中host_key_checking = False)
提高Ansible安全
# 配置sudo用户ans # 使用ssh密钥认证进行身份校验 host_key_checking = True # 用户的密码进行加密(hash、ansible-vault) # 用户---->vpn---->jms(跳板机)---->ansible
配置sudo⭐⭐⭐
配置之后,只有配置文件中指定的设置root权限的用户才能进行批量操作
# 被管理端 # 创建用户ans并设置密码 useradd ans # 给ans用户设置root权限 egrep '^ans' /etc/sudoers ans ALL=(ALL) NOPASSWD:ALL # 管理端 [root@m01 ~]# egrep -v '^$|#' /etc/ansible/ansible.cfg [defaults] sudo_user = ans # 指定执行需要提升权限的操作时使用的用户(当使用sudo命令时,ansible会使用此用户进行切换为root用户,默认时root) remote_port = 22 # 指定与目标主机建立SSH连接时使用的端口(默认时22端口) remote_user = ans # 指定与目标主机建立SSH连接时使用的用户名(默认时root用户) host_key_checking = False log_path = /var/log/ansible.log [privilege_escalation] become=True # 指定是否需要提升权限 become_method=sudo # 指定提升权限的方法 become_user=root # 指定提升权限后要切换到用户 # 测试 ansible all -i hosts -m ping
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 25岁的心里话
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现