Ansible 配置文件详解
配置文件优先级
Ansible 读取配置文件时,优先级顺序如下:
- ANSIBLE_CONFIG 环境变量:可以指定一个配置文件路径,该文件将覆盖其他所有配置文件。
- ansible.cfg 文件:在当前运行
ansible
命令的目录下查找。如果不存在,则继续查找用户主目录中的.ansible.cfg
文件。 - 全局配置文件:位于
/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
- inventory: 指定清单文件
./hosts
。 - remote_user: 远程登录用户为
ansibleuser
。 - ask_pass: 禁用 SSH 密码提示。
- become: 启用权限提升。
- become_method: 使用
sudo
提升权限。 - become_user: 提升到
admin
用户。 - become_ask_pass: 禁用权限提升时的密码提示。
相关配置解决方案
Localhost 配置
- 如果
localhost
未写入清单文件,Ansible 运行时不会按配置文件进行。 解决方法:
localhost
写入清单。在运行 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
```
清单文件
hosts
:[dbservers] db1.example.com db2.example.com
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
运行 Playbook:
ansible-playbook install_mysql.yml
本文由mdnice多平台发布
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。