在Ansible中,它的配置文件是一个名为ansible.cfg
的配置文件,ansible.cfg配置文件是以ini格式存储配置数据的。但是ansible.cfg配置文件可以存放在不同的目录,但只有一个可用,在运行Ansible命令时,Ansible将会按照预先设定的顺序查找配置文件,检查到哪个就用哪个。
Ansible预先设定的优先级顺序如下:
ANSIBLE_CFG
:首先,Ansible命令会先检查环境变量,及这个环境变量将指向的配置文件;./ansible.cfg
:其次,将会检查当前目录下的ansible.cfg配置文件;~/.ansible.cfg
:再次,将会检查当前用户home目录下的.ansible.cfg
配置文件;/etc/ansible/ansible.cfg
:最后,将会检查在安装Ansible时自动生产的配置文件。 几乎所有的配置项都可以通过Ansible的playbook或环境变量来重新赋值,所以当你怎么都不知道这个变量在哪里定义的时候,不妨去看看环境变量里看看。根据我这么多年的运维经验来说,我建议使用~/.ansible.cfg
作为配置文件使用,这样就可以实现每个用户都有自己独自的配置文件,不污染其它用户正常使用Ansible,同时也方便进行选项配置。
配置文件分段说明
ansible.cfg的配置默认分为八段:
配置参数说明
defaults配置
配置项 | 说明 | 默认值 |
---|---|---|
inventory |
ansible inventory文件路径 | /etc/ansible/hosts |
library | ansible模块文件路径 | /usr/share/my_modules/ |
remote_tmp | ansible远程主机脚本临时存放目录 | ~/.ansible/tmp |
local_tmp | ansible管理节点脚本临时存放目录 | ~/.ansible/tmp |
forks |
ansible执行并发数 | 5 |
poll_interval | ansible异步任务查询间隔 | 15 |
sudo_user | ansible sudo用户 | root |
ask_sudo_pass | 运行ansible是否提示输入sudo密码 | True |
ask_pass | 运行ansible是否提示输入密码 | True |
transport | ansible远程传输模式 | smart |
remote_port | 远程主机SSH端口 | 22 |
module_lang | ansible模块运行默认语言环境 | C |
gathering | facts信息收集开关定义 | smart |
roles_path |
ansible role存放路径 | /etc/ansible/roles |
timeout | ansible SSH连接超时时间 | 10 |
remote_user |
ansible远程认证用户 | root |
log_path | ansible日志记录文件 | /var/log/ansible.log |
module_name | ansible默认执行模块 | command |
executable | ansible命令执行shell | /bin/sh |
hash_behaviour | ansible主机变量重复处理方式 | replace |
private_role_vars | 默认情况下,角色中的变量将在全局变量范围中可见。 为了防止这种情况,可以启用以下选项,只有tasks的任务和handlers得任务可以看到角色变量 | yes |
vault_password_file | 指定vault密码文件路径 | 无 |
ansible_managed | 定义的一个Jinja2变量,可以插入到Ansible配置模版系统生成的文件中 | Ansible managed |
display_skipped_hosts | 开启显示跳过的主机 | True |
error_on_undefined_vars | 开启错误,或者没有定义的变量 | False |
action_plugins | ansible action插件路径 | 无 |
cache_plugins | ansible cache插件路径 | 无 |
callback_plugins | ansible callback插件路径 | 无 |
connection_plugins | ansible connection插件路径 | 无 |
lookup_plugins | ansible lookup插件路径 | 无 |
inventory_plugins | ansible inventory插件路径 | 无 |
vars_plugins | ansible vars插件路径 | 无 |
filter_plugins | ansible filter插件路径 | 无 |
terminal_plugins | ansible terminal插件路径 | 无 |
strategy_plugins | ansible strategy插件路径 | 无 |
fact_caching | 定义ansible facts缓存方式 | memory |
fact_caching_connection | 定义ansible facts缓存路径 | 无 |
privilege_escalation配置
配置项 | 说明 | 默认值 |
---|---|---|
become | 是否开启become模式 | True |
become_method | 定义become方式 | sudo |
become_user | 定义become方式 | root |
become_ask_pass | 是否定义become提示密码 | False |
在Ansible中描述主机的默认方法是将它们列在一个文本文件中,这个文本文件叫作inventory文件。Ansible Inventory 是包含静态 Inventory 和动态 Inventory 两部分的,静态 Inventory 指的是在文件中指定的主机和组,动态 Inventory 指通过外部脚本获取主机列表,并按照 ansible 所要求的格式返回给 ansilbe 命令的。这部分一般会结合 CMDB 资管系统、云计算平台等获取主机信息。此博文主要介绍静态Inventory的配置定义方法。默认的文件路径为 /etc/ansible/hosts。除默认文件外,你还可以同时使用多个 inventory 文件。如果需要使用非默认的Inventory文件,在执行Ansible命令时使用-i参数指定Inventory文件。
Inventory配置文件遵循的是INI文件风格,中括号表示组名,其支持将同一个主机加入到不同的组中,此外若主机没有使用默认的SSH的22端口,还可以在主机名字或者IP后面加上冒号来指定,#号为注释行
示例(编辑/etc/ansible/hosts文件):
# 直接跟主机IP及其他端口
192.168.111.120
192.168.111.120:2333
# 使用主机hostname及其他端口
ansible-node1
ansible-node1:2333
# 主机分组
[webserver]
192.168.111.120
ansible-node1:2333
# 连续主机
[dbserver]
192.168.111.[100:200] # 表示192.168.111.100--192.168.111.200之间的所有主机
ansible-node[10:20]:2333 # 表示ansible-node10:2333--ansible-node20:2333之间的所有主机
在工作中,通常会遇到非标准化的需求配置,考虑安全的问题,通常会把企业内部的80端口修改为其他的端口,这个就可以在Inventory中定义,然后在后续的playbook使用
示例(编辑/etc/ansible/hosts文件):
[dbserver]
# 自定义http_port的端口为80,配置maxRequestsPerChild(最大请求数)为801
192.168.111.120 http_port=808 maxRequestsPerChild=801
# 自定义http_port的端口为303,配置maxRequestsPerChild(最大请求数)为909
ansible-node1 http_port=303 maxRequestsPerChild=909
Ansible支持定义组的变量,主要是针对大量的机器的变量定义需求,赋予指定组内所有主机在playbook中可用的变量,等同于逐一给该组下的所有主机赋予同一个变量
示例(编辑/etc/ansible/hosts文件):
[groupserver]
192.168.111.120
ansible-node1
[groupserver:vars]
# 定义groupserver组中所有主机ntp_server的值为ntp1.aliyun.com
ntp_server=ntp1.aliyun.com
# 定义groupserver组中所有主机nfs_server的值为nfs.aliyun.com
nfs_server=nfs.aliyun.com
Inventory中,组还可以包含其他的组(嵌套),并且也可以向组中的主机指定变量,不过这些变量只能在playbook中使用,在ansible中不支持,组与组之间可以相互调用,并且可以向组中的主机指定变量
[groupserver]
192.168.111.120
ansible-node1
[groupserver:vars]
# 定义groupserver组中所有主机ntp_server的值为ntp1.aliyun.com
ntp_server=ntp1.aliyun.com
# 定义groupserver组中所有主机nfs_server的值为nfs.aliyun.com
nfs_server=nfs.aliyun.com
通过设置下面的参数,可以控制 ansible 与远程主机的交互方式
参数 | 默认值 | 参数说明 |
---|---|---|
ansible_ssh_host | 主机名 | ssh目标主机名或者IP |
ansible_ssh_port | 22 | ssh目标端口 |
ansible_ssh_user | root | ssh登录使用的用户名 |
ansible_ssh_pass | none | ssh认证使用的密码(这种方式并不安全,我们强烈建议使用 --ask-pass 或 SSH 密钥) |
ansible_sudo_pass sudo | none | sudo密码(这种方式并不安全,我们强烈建议使用 --ask-sudo-pass) |
ansible_sudo_exe | /usr/bin | sudo 命令路径(适用于1.8及以上版本) |
ansible_connection | smart | 与主机的连接类型.比如:local, ssh 或者 paramiko. Ansible 1.2 以前默认使用 paramiko.1.2 以后默认使用 ‘smart’,‘smart’ 方式会根据是否支持 ControlPersist, 来判断’ssh’ 方式是否可行. |
ansible_ssh_private_key_file | none | ssh 使用的私钥文件.适用于有多个密钥,而你不想使用 SSH 代理的情况. |
ansible_shell_type | sh | 目标系统的shell类型.默认情况下,命令的执行使用 ‘sh’ 语法,可设置为 ‘csh’ 或 ‘fish’. |
ansible_python_interpreter | /usr/bin | 目标主机的 python 路径。适用于的情况: 系统中有多个 Python, 或者命令路径不是"/usr/bin/python",比如 *BSD, 或者 /usr/bin/python 不是 2.X 版本的 Python。我们不使用 “/usr/bin/env” 机制,因为这要求远程用户的路径设置正确,且要求 “python” 可执行程序名不可为 python以外的名字(实际有可能名为python26)。 |
#第一步:通过远程连接greg用户进入控制节点control
[kiosk@foundation0 ~]$ ssh greg@control
#第二步:安装所需的软件包
[greg@control ~]$ sudo yum -y install ansible
--检查软件是否安装成功
[greg@control ~]$ ansible --version
ansible 2.8.0
#第三步:先创建清单目录
[greg@control ~]$ mkdir /home/greg/ansible
--后编辑清单文件
[greg@control ~]$ vim /home/greg/ansible/inventory
[dev]
node1
[test]
node2
[prod]
node3
node4
[balancers]
node5
[webservers:children]
prod
#第四步:创建配置文件
[greg@control ~]$ cp /etc/ansible/ansible.cfg /home/greg/ansible/
[greg@control ~]$ vim /home/greg/ansible/ansible.cfg
inventory = /home/greg/ansible/inventory
roles_path = home/greg/ansible/roles
host_key_checking = False
#第五步:检查
[greg@control ~]$ cd ansible/
[greg@control ansible]$ ansible-inventory --graph
@all:
|--@balancers:
| |--node5
|--@dev:
| |--node1
|--@test:
| |--node2
|--@ungrouped:
|--@webservers:
| |--@prod:
| | |--node3
| | |--node4
[greg@control ansible]$ ansible all -m ping
node3 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/libexec/platform-python"
},
"changed": false,
"ping": "pong"
}
node5 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/libexec/platform-python"
},
"changed": false,
"ping": "pong"
}
node4 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/libexec/platform-python"
},
"changed": false,
"ping": "pong"
}
node2 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/libexec/platform-python"
},
"changed": false,
"ping": "pong"
}
node1 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/libexec/platform-python"
},
"changed": false,
"ping": "pong"
}