Ansible 配置文件详解

配置文件优先级

Ansible 读取配置文件时,优先级顺序如下:

  1. ANSIBLE_CONFIG 环境变量:可以指定一个配置文件路径,该文件将覆盖其他所有配置文件。
  2. ansible.cfg 文件:在当前运行 ansible 命令的目录下查找。如果不存在,则继续查找用户主目录中的 .ansible.cfg 文件。
  3. 全局配置文件:位于 /etc/ansible/ansible.cfg,这是最后一个被读取的配置文件。

这个优先级顺序确保了灵活性,用户可以根据需要自定义配置文件的位置和内容。

配置文件示例

Ansible 配置文件 ansible.cfg 的示例:

[defaults]
inventory = ./inventory
remote_user = testuser
ask_pass = false
deprecation_warnings = false

[privilege_escalation]
become = true
become_method = sudo
become_user = root
become_ask_pass = false

配置文件参数说明

  • inventory: 指定清单文件的路径,例如 ./inventory
  • remote_user: 在受管主机上登录的用户名,如果未指定,使用当前用户的名称。
  • ask_pass: 是否提示输入 SSH 密码。默认为 false,使用 SSH 公钥身份验证。
  • deprecation_warnings: 是否显示弃用功能的警告信息,false 表示不显示。
  • become: 是否启用权限提升,例如切换为 root 用户。
  • become_method: 权限提升的方法,默认为 sudo,也可以选择 su
  • become_user: 切换到的用户,通常为 root
  • become_ask_pass: 是否提示输入权限提升的密码,默认为 false

SSH 无密码验证配置

在主控机上进行以下操作:

# 生成 SSH 密钥对
ssh-keygen
# 将公钥复制到受控主机
ssh-copy-id -i /root/.ssh/id_rsa.pub 远程用户@受控主机

提示:远程用户必须在受控主机上存在,并且具有适当的权限。

sudo 配置

可以在受控主机上的 /etc/sudoers.d 目录创建一个文件,例如为普通用户 testuser 提权:

testuser ALL=(ALL) NOPASSWD:ALL

注意:如果不写 NOPASSWD,配置文件中 become_ask_pass 无论设置什么,都会提示你输入密码。

示例

假设你在 CentOS 系统上有以下配置:

[defaults]
inventory = ./hosts
remote_user = ansibleuser
ask_pass = false

[privilege_escalation]
become = true
become_method = sudo
become_user = admin
become_ask_pass = false
  1. inventory: 指定清单文件 ./hosts
  2. remote_user: 远程登录用户为 ansibleuser
  3. ask_pass: 禁用 SSH 密码提示。
  4. become: 启用权限提升。
  5. become_method: 使用 sudo 提升权限。
  6. become_user: 提升到 admin 用户。
  7. become_ask_pass: 禁用权限提升时的密码提示。

相关配置解决方案

  1. Localhost 配置

    • 如果 localhost 未写入清单文件,Ansible 运行时不会按配置文件进行。
    • 解决方法

      1. localhost 写入清单。
      2. 在运行 Ansible 的目录下建立变量目录 host_vars,创建名为 localhost 的文件,内容为:

        ansible_connection: smart

提示:远程用户必须在受控主机上存在,并且具有适当的权限。

sudo 配置

可以在受控主机上的 /etc/sudoers.d 目录创建一个文件,例如为普通用户 testuser 提权:

testuser ALL=(ALL) NOPASSWD:ALL

注意:如果不写 NOPASSWD,配置文件中 become_ask_pass 无论设置什么,都会提示你输入密码。


### 详细举例

#### 举例 1: 配置文件路径示例

目录结构:

/home/user/

├── ansible_project/
│   ├── ansible.cfg
│   └── inventory
└── .ansible.cfg

- 如果设置了 `ANSIBLE_CONFIG=/etc/ansible/ansible.cfg` 环境变量,Ansible 将优先读取该文件。
- 如果未设置环境变量,但在当前目录 `/home/user/ansible_project/` 下存在 `ansible.cfg`,将读取该文件。
- 如果以上两者都不存在,Ansible 将读取用户主目录 `/home/user/.ansible.cfg` 下的配置文件。
- 最后,如果前面三者都不存在,将读取全局配置文件 `/etc/ansible/ansible.cfg`。

#### 举例 2: 完整配置文件和Playbook示例

1. **配置文件 `ansible.cfg`**:
[defaults]
inventory = ./hosts
remote_user = deploy
ask_pass = false
deprecation_warnings = false

[privilege_escalation]
become = true
become_method = sudo
become_user = root
become_ask_pass = false
```
  1. 清单文件 hosts

    [dbservers]
    db1.example.com
    db2.example.com
  2. Playbook install_mysql.yml

    ---
    - hosts: dbservers
      become: yes
      tasks:
        - name: Install MySQL
          yum:
            name: mysql-server
            state: present
        - name: Start MySQL service
          service:
            name: mysqld
            state: started
            enabled: true
  3. 运行 Playbook

    ansible-playbook install_mysql.yml

本文由mdnice多平台发布


逼格高的汤圆
7 声望2 粉丝