Ansible 使用介绍
环境信息
- Centos 7
- ansible-core 2.16
- Docker image python:3.12.3
安装
ansible-core
版本及 Python 版本支持对应关系
ansible-core Version | Control Node Python | Target Python / PowerShell |
---|---|---|
2.16 | Python 3.10 - 3.12 | Python 2.7 Python 3.6 - 3.12 Powershell 3 - 5.1 |
为了环境部署方便灵活,可以选择使用 python:3.12.3
的 Docker 镜像,以其为基础环境安装 ansible-core 2.16
或者直接使用 ansible
镜像启动。
docker run --rm -it python:3.12.3 bash |
Ansible 配置说明
Ansible 主配置文件为 /etc/ansible/ansible.cfg
,其中的配置都可以被 ansible-playbook
或者命令行参数覆盖。
ansible 默认会读取环境变量
ANSIBLE_CONFIG
指定的配置文件,当前路径下的ansible.cfg
,以及用户家目录下的.ansible.cfg
,以及/etc/ansible/ansible.cfg
作为配置文件,已第一个找到的为准
常用配置说明
配置项 | 说明 | 示例 |
---|---|---|
inventory |
指定 inventory (主机列表)文件的路径,默认为 /etc/ansible/hosts |
|
remote_user |
(未指定用户时)连接远程主机时使用的用户 | |
remote_port |
连接远程主机时使用的(默认)端口 | |
host_key_checking |
默认启用。检查主机密钥可以防止服务器欺骗和中间人攻击。 如果主机重新安装并且在 know_hosts 中拥有不同的密钥,ansible 会提示确认密钥。如果要禁用此行为,可以配置为 False |
|
ask_pass |
默认为 False。当设置为 True 时,ansible 要求输入远端服务器的密码,即使配置了免密登录 | |
log_path |
日志文件,默认 /var/log/ansible.log |
|
pattern |
当没有给出 pattern 时的默认 pattern ,默认值是 * 即所有主机 |
配置示例
[defaults] |
Inventory 配置说明
默认的 inventory 配置文件路径为 /etc/ansible/hosts
,主要用来配置 Managed Hosts 列表 [3]
在命令行中,可以使用选项 -i <path>
指定不同的 inventory
或者可以在 ansible
配置文件 ansible.cfg
中使用指令 inventory
指定 inventory
文件位置。
命令行中可以使用
-i <path1> -i <path2> ...
指定多个inventory
inventory
文件支持多种格式,最常见的是 INI
和 YAML
格式。
- Ansible 默认创建了 2 个组:
all
: 包含所有主机ungrouped
: 包含所有不在其他组(all
除外)中的所有主机。任何一个主机都会至少在 2 个组中,要么 在
all
和某个组中,要么 在all
和ungrouped
组。
- 一个主机可以包含在多个组中
parent/child
组,child
组被包含在parent
组中。- INI 配置格式中,使用
:children
后缀配置parent
- YAML 配置格式中,使用
children:
配置parent
- 任何在
child
组中的主机自动成为parent
组中的一员 - 一个组可以包括多个
parent
和child
组,但是不能形成循环关系 - 一个主机可以在多个组中,但是在运行时,只能有一个实例存在,Ansible 会自动将属于多个组的主机合并。
- 任何在
- INI 配置格式中,使用
- 主机范围匹配。如果有格式相似的主机,可以通过范围格式使用一条指令来添加多台主机。
- INI 配置格式中,使用以下格式
[webservers]
www[01:50].example.com
# 指定步长增长
www[01:50:2].example.com
db-[a:f].example.com - YAML 配置格式中,使用以下格式
...
webservers:
hosts:
www[01:50].example.com:
## 指定步长增长
www[01:50:2].example.com:
db-[a:f].example.com:范围格式 的第一项和最后一项也包括在内。即匹配
www01
和www50
- INI 配置格式中,使用以下格式
Inventory 多配置文件支持
在主机数量较多,或者组织结构较复杂的情况下,使用单个 Inventory 配置文件会导致主机管理较为复杂。将单个 Inventory 配置文件按照项目或者组织或其他规则进行分割会显著降低维护复杂度。
Inventory 多配置文件支持,可以使用以下方法之一
- 按照项目或者组织或其他规则将主机分割到多个配置中,命令行中可以使用
-i <path1> -i <path2> ...
指定多个inventory
- 按照项目或者组织或其他规则将主机分割放置在多个文件中,并将所有文件统一放置在一个单独的目录中(如
/etc/ansible/inventory/
),在命令行中使用选项-i /etc/ansible/inventory/
或者在 Ansible 配置文件(ansible.cfg
)中使用指令inventory
配置目录。注意事项: Ansible 使用字典顺序加载配置文件,如果在不同的配置文件中配置了
parent groups
和child groups
,那么定义child groups
的配置要先用定义parent groups
的文件加载,否则 Ansible 加载配置会报错:Unable to parse /path/to/source_of_parent_groups as an inventory source
[4] - 使用
group_vars
和host_vars
目录分别存储组变量和主机变量 [7]注意事项: 组变量和主机变量必须使用 YAML 格式,合法的文件扩展名包括:
.yaml
、yml
、.json
或者无文件扩展名
INI 格式的 Inventory
主机列表中的主机可以单独出现,也可以位于某个或者多个 组([]
开头的行)中
ansible-demo1.local |
连接主机使用的常用配置说明 [6]
配置项 | 说明 | 示例 |
---|---|---|
ansible_host |
远程主机地址 | |
ansible_port |
远程主机端口 | |
ansible_user |
连接远程主机的 ssh 用户 Ansible 默认使用 control node 上执行 ansible 的用户名来连接远程主机 [9] |
|
ansible_password |
连接远程主机的 ssh 用户密码,建议使用 key 连接 | |
ansible_ssh_private_key_file |
连接远程主机的 ssh 私钥文件路径 | |
ansible_become ansible_sudo ansible_su |
用户权限提升 | |
ansible_become_method |
用户权限提升(escalation)的方式 | |
ansible_become_user ansible_sudo_user ansible_su_user |
用户权限提升(escalation)后的用户 | |
ansible_become_password ansible_sudo_password ansible_su_password |
sudo 密码(这种方式并不安全,强烈建议使用 --ask-sudo-pass ) |
|
ansible_become_exe ansible_sudo_exe ansible_su_exe |
设置用户权限提升(escalation)后的可执行文件 | |
ansible_connection |
与主机的连接类型.比如:local , ssh 或者 paramiko Ansible 1.2 以前默认使用 paramiko 。1.2 以后默认使用 smart ,smart 方式会根据是否支持 ControlPersist , 来判断 ssh 方式是否可行. |
|
ansible_shell_type |
目标系统的 shell 类型.默认情况下,命令的执行使用 sh 语法,可设置为 csh 或 fish . |
|
ansible_python_interpreter |
目标主机的 python 路径 系统中有多个 Python, 或者命令路径不是 /usr/bin/python |