ansible配置文件详解
1、/etc/ansible有以下三个文件或者目录生成
- /etc/ansible/Hosts
- 主机清单配置文件
- /etc/ansible/ansible.cfg
- Ansible主配置文件
- /etc/ansible/Roles
- 角色定义目录
2、ansible配置文件优先级
在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,同时也方便进行选项配置。
3、主配置文件解析
配置文件分段说明
ansible.cfg的配置默认分为八段:
- [defaults]:通用配置项
- [inventory]:与主机清单相关的配置项
- [privilege_escalation]:特权升级相关的配置项
- [paramiko_connection]:使用paramiko连接的相关配置项,Paramiko在RHEL6以及更早的版本中默认使用的ssh连接方式
- [ssh_connection]:使用OpenSSH连接的相关配置项,OpenSSH是Ansible在RHEL6之后默认使用的ssh连接方式
- [persistent_connection]:持久连接的配置项
- [accelerate]:加速模式配置项
- [selinux]:selinux相关的配置项
- [colors]:ansible命令输出的颜色相关的配置项
- [diff]:定义是否在运行时打印diff(变更前与变更后的差异)
配置参数说明
- defaults配置
配置项说明默认值
inventory
ansible inventory文件路径/etc/ansible/hostslibraryansible模块文件路径/usr/share/my_modules/remote_tmpansible远程主机脚本临时存放目录~/.ansible/tmplocal_tmpansible管理节点脚本临时存放目录~/.ansible/tmpforks
ansible执行并发数5poll_intervalansible异步任务查询间隔15sudo_useransible sudo用户rootask_sudo_pass运行ansible是否提示输入sudo密码Trueask_pass运行ansible是否提示输入密码Truetransportansible远程传输模式smartremote_port远程主机SSH端口22module_langansible模块运行默认语言环境Cgatheringfacts信息收集开关定义smartroles_path
ansible role存放路径/etc/ansible/rolestimeoutansible SSH连接超时时间10remote_user
ansible远程认证用户rootlog_pathansible日志记录文件/var/log/ansible.logmodule_nameansible默认执行模块commandexecutableansible命令执行shell/bin/shhash_behaviouransible主机变量重复处理方式replaceprivate_role_vars默认情况下,角色中的变量将在全局变量范围中可见。 为了防止这种情况,可以启用以下选项,只有tasks的任务和handlers得任务可以看到角色变量yesvault_password_file指定vault密码文件路径无ansible_managed定义的一个Jinja2变量,可以插入到Ansible配置模版系统生成的文件中Ansible manageddisplay_skipped_hosts开启显示跳过的主机Trueerror_on_undefined_vars开启错误,或者没有定义的变量Falseaction_pluginsansible action插件路径无cache_pluginsansible cache插件路径无callback_pluginsansible callback插件路径无connection_pluginsansible connection插件路径无lookup_pluginsansible lookup插件路径无inventory_pluginsansible inventory插件路径无vars_pluginsansible vars插件路径无filter_pluginsansible filter插件路径无terminal_pluginsansible terminal插件路径无strategy_pluginsansible strategy插件路径无fact_caching定义ansible facts缓存方式memoryfact_caching_connection定义ansible facts缓存路径无 - privilege_escalation配置 配置项说明默认值become是否开启become模式Truebecome_method定义become方式sudobecome_user定义become方式rootbecome_ask_pass是否定义become提示密码False
4、主机清单(Inventory)
在Ansible中描述主机的默认方法是将它们列在一个文本文件中,这个文本文件叫作inventory文件。Ansible Inventory 是包含静态 Inventory 和动态 Inventory 两部分的,静态 Inventory 指的是在文件中指定的主机和组,动态 Inventory 指通过外部脚本获取主机列表,并按照 ansible 所要求的格式返回给 ansilbe 命令的。这部分一般会结合 CMDB 资管系统、云计算平台等获取主机信息。此博文主要介绍静态Inventory的配置定义方法。默认的文件路径为 /etc/ansible/hosts。除默认文件外,你还可以同时使用多个 inventory 文件。如果需要使用非默认的Inventory文件,在执行Ansible命令时使用-i参数指定Inventory文件。
4.1 定义主机和组
Inventory配置文件遵循的是INI文件风格,中括号表示组名,其支持将同一个主机加入到不同的组中,此外若主机没有使用默认的SSH的22端口,还可以在主机名字或者IP后面加上冒号来指定,#号为注释行
示例(编辑/etc/ansible/hosts文件):
代码语言:javascript复制# 直接跟主机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之间的所有主机
4.2 定义主机变量
在工作中,通常会遇到非标准化的需求配置,考虑安全的问题,通常会把企业内部的80端口修改为其他的端口,这个就可以在Inventory中定义,然后在后续的playbook使用
示例(编辑/etc/ansible/hosts文件):
代码语言:javascript复制[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
4.3 定义组变量
Ansible支持定义组的变量,主要是针对大量的机器的变量定义需求,赋予指定组内所有主机在playbook中可用的变量,等同于逐一给该组下的所有主机赋予同一个变量
示例(编辑/etc/ansible/hosts文件):
代码语言:javascript复制[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
4.4 定义组嵌套和组变量
Inventory中,组还可以包含其他的组(嵌套),并且也可以向组中的主机指定变量,不过这些变量只能在playbook中使用,在ansible中不支持,组与组之间可以相互调用,并且可以向组中的主机指定变量
代码语言:javascript复制[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
4.5 Inventory参数说明
通过设置下面的参数,可以控制 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)。 |
5、练习
- 安装 ansible 的软件包
- 创建名为/home/student/ansible/inventory的静态清单文件, 以满足以下需求:
- node1 是 dev 主机组的成员
- node2 是 test 主机组的成员
- node3 是 prod 主机组的成员
- prod 组是 webservers 主机组的成员
- 创建名为/home/student/ansible/ansible.cfg的配置文件, 以满足以下要求:
- 主机清单文件为/home/student/ansible/inventory
- playbook 中使用的角色的位置包括/home/student/ansible/roles
#第一步:通过远程连接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"
}