Ansible配置文件

2023-03-17 11:16:40 浏览数 (1)

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配置 配置项说明默认值inventoryansible inventory文件路径/etc/ansible/hostslibraryansible模块文件路径/usr/share/my_modules/remote_tmpansible远程主机脚本临时存放目录~/.ansible/tmplocal_tmpansible管理节点脚本临时存放目录~/.ansible/tmpforksansible执行并发数5poll_intervalansible异步任务查询间隔15sudo_useransible sudo用户rootask_sudo_pass运行ansible是否提示输入sudo密码Trueask_pass运行ansible是否提示输入密码Truetransportansible远程传输模式smartremote_port远程主机SSH端口22module_langansible模块运行默认语言环境Cgatheringfacts信息收集开关定义smartroles_pathansible role存放路径/etc/ansible/rolestimeoutansible SSH连接超时时间10remote_useransible远程认证用户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
代码语言:javascript复制
#第一步:通过远程连接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"
}

0 人点赞