第八篇: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

# 不管配置文件有没有修改,都会执行重启服务
/server/scripts/playbook/nouse_handlers.yaml
复制代码

使用了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才能触发通知
/server/scripts/playbook/use_handler.yaml
复制代码

  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"
/server/scripts/playbook/when.yaml
复制代码

  循环⭐⭐⭐⭐

  • 两类循环(用法相同):
    • with_*:with_items
    • loop

批量创建文件,批量添加用户,批零启动或重启服务

批量启动服务rpcbind、nfs服务

复制代码
---
- hosts: nfs
  tasks:
    - name: 批量启动rpcbind、nfs服务
      systemd:
        name: "{{ item }}"
        state: restarted
      loop:
        - rpcbind
        - nfs
/server/scripts/playbook/systemed_loop.yaml
复制代码

批量创建多个用户

复制代码
---
- hosts: all
  tasks:
    - name:
      user:
        name: "{{ item.name }}"
        uid: "{{ item.uid }}"
        state: present
      loop:
        - { name: yuan,uid: 2020 }
        - { name: xiaojiang,uid: 2024 }
/server/scripts/playbook/create_user_loop.yaml
复制代码

剧本调试⭐⭐

  检查语法与单步执行

# -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
/server/scripts/playbook/tags.yaml
复制代码

  忽略错误

复制代码
---  
- 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.html

  Vault(加密)

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
复制代码

 

posted @   猿小姜  阅读(8)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 25岁的心里话
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示