技术

Ansible配置

2025/11/29
4
0
cp /etc/yum.repo.d/backup/r* /etc/yum.repo.d/
mv /etc/yum.repo.d/rocky-lan.repo /etc/yum.repo.d/backup
sed -e 's|^mirrorlist=|#mirrorlist=|g' \
    -e 's|^#baseurl=http://dl.rockylinux.org/$contentdir|baseurl=https://mirrors.aliyun.com/rockylinux|g' \
    -i.bak \
    /etc/yum.repos.d/rocky*.repo

dnf makecache

常规优化

指纹免密
  • 有配置文件

sed -e 's|;host_key_checking=True|host_key_checking=False|g' -i.bak /etc/ansible/ansible.cfg
  • 无配置文件

cat >> /etc/ansible/ansible.cfg << EOF
[defaults]
host_key_checking=False
EOF
  • 生成配置文件模板

ansible-config init --disabled -t all > ansible.cfg.template

剧本

Ansible剧本(Playbook)采用YAML格式编写,其核心是定义一系列“任务”(tasks),并指定这些任务在哪些目标主机(hosts)上执行。YAML格式对缩进和语法有严格要求,以下是其基本格式规则和核心组成部分:

一、YAML基础规则(必须遵守)

  1. 缩进:使用空格(不能用Tab)缩进,缩进量一致(通常2或4个空格),用于表示层级关系。

  2. 键值对:格式为 key: value(冒号后必须有空格)。

  3. 列表:用 - 开头表示列表项(- 后必须有空格),通常用于定义任务、变量等集合。

  4. 注释:用 # 开头,单行注释。

  5. 字符串:可加引号('"),也可不加;但包含特殊字符(如冒号、空格)时必须加引号。

二、Playbook核心组成部分

一个完整的Playbook至少包含 hoststasks,其他部分为可选增强功能。基本结构如下:

- name: 剧本名称(描述当前剧本的作用)
  hosts: 目标主机或组(必填,如all、webservers)
  gather_facts: 是否收集主机信息(可选,默认yes)
  become: 是否提权(可选,yes/no,如sudo)
  vars: 定义变量(可选,可在tasks中引用)
    变量名1: 变量值1
    变量名2: 变量值2
  tasks: 任务列表(必填,核心部分)
    - name: 任务1名称(描述任务作用)
      模块名: 模块参数(如command、copy、yum等)
        参数1: 值1
        参数2: 值2
      notify: 触发处理程序(可选,任务执行后通知handlers)
    - name: 任务2名称
      模块名: ...
  handlers: 处理程序(可选,用于响应notify触发的操作,如重启服务)
    - name: 处理程序名称(需与notify的值一致)
      模块名: ...
  roles: 引用角色(可选,用于拆分复杂任务)
    - 角色名1
    - 角色名2

三、各部分详解

  1. hosts(必填)
    指定任务执行的目标主机或主机组(在 inventory 文件中定义)。
    示例:hosts: webservers(执行到webservers组)、hosts: all(执行到所有主机)。

  2. tasks(必填)
    定义具体要执行的任务,每个任务用 - name: ... 开头,包含一个Ansible模块(如 yumcopyservice 等)及参数。
    示例:安装nginx并启动:

    tasks:
      - name: 安装nginx
        yum:
          name: nginx
          state: present  # present表示安装,absent表示卸载
      - name: 启动nginx服务并设置开机自启
        service:
          name: nginx
          state: started  # started表示启动,stopped表示停止
          enabled: yes    # 开机自启
    
  3. vars(可选)
    定义变量,可在tasks中通过 {{ 变量名 }} 引用,简化重复值的维护。
    示例:

    vars:
      package_name: nginx
      service_name: nginx
    tasks:
      - name: 安装{{ package_name }}
        yum:
          name: "{{ package_name }}"
          state: present
    
  4. handlers(可选)
    用于处理“任务执行后需要触发的操作”(如配置文件修改后重启服务),需通过 notify 在tasks中触发(notify 的值需与handler的 name 一致)。
    示例:修改nginx配置后重启:

    tasks:
      - name: 修改nginx配置文件
        copy:
          src: ./nginx.conf
          dest: /etc/nginx/nginx.conf
        notify: 重启nginx  # 触发名为“重启nginx”的handler
    handlers:
      - name: 重启nginx  # 与notify的值一致
        service:
          name: nginx
          state: restarted
    
  5. become(可选)
    控制是否提权执行任务(如需要root权限时),become: yes 等价于 sudo
    示例:

    become: yes  # 所有任务以root权限执行
    tasks:
      - name: 创建/root/test目录(需要root权限)
        file:
          path: /root/test
          state: directory
    
  6. gather_facts(可选)
    控制是否在任务执行前收集主机信息(如IP、操作系统版本等),默认 yes;若不需要可设为 no 提高效率。
    示例:gather_facts: no

  7. roles(可选)
    引用“角色”(roles),用于拆分复杂剧本(将任务、变量、模板等按功能模块化)。
    示例:roles: - webserver(引用webserver角色)

四、完整示例

一个安装并启动nginx的简单Playbook:

- name: 安装并启动nginx服务
  hosts: webservers
  gather_facts: no
  become: yes  # 提权为root
  vars:
    nginx_conf: ./nginx.conf  # 本地配置文件路径
  tasks:
    - name: 安装nginx
      yum:
        name: nginx
        state: present
    - name: 推送自定义nginx配置
      copy:
        src: "{{ nginx_conf }}"
        dest: /etc/nginx/nginx.conf
      notify: 重启nginx  # 配置变化时触发重启
    - name: 确保nginx服务启动并开机自启
      service:
        name: nginx
        state: started
        enabled: yes
  handlers:
    - name: 重启nginx
      service:
        name: nginx
        state: restarted

总结

Ansible Playbook的核心是通过YAML格式定义“在哪些主机上执行哪些任务”,结合变量、处理程序、角色等功能可实现复杂的自动化部署。编写时需严格遵守YAML缩进规则,确保语法正确。