配置文件详解

配置文件中大多数都是注释行默认配置项。文件遵循INI格式,分为几个类别的配置,下面会分别介绍。
在那之前,先看一下配置文件存放的位置,以及如何从官网获取配置文件模板。

配置文件的位置

Ansible只有一个配置文件ansible.cfg。配置文件可以存在于多个位置,按下面的顺序查找到的第一个生效:

  • ANSIBLE_CONFIG (环境变量指定)
  • ansible.cfg (当前命令执行目录)
  • ~/.ansible.cfg (用户家目录下)
  • /etc/ansible/ansible.cfg

只有最先找到的配置文件会生效。另外环境变量的优先级比配置文件高,而且可以一个一个单独设置。每个配置项对应的环境变量的名称,可以在下面的官方文档中查到:
https://docs.ansible.com/ansible/latest/reference_appendices/config.html#common-options
另外每个变量的默认值也是在这里查。

还有命令行参数指定的方式,这个是优先级比上面的配置方式高。不过playbook中指定的设置优先级更高,不会被命令行参数覆盖。

获取配置文件模板

Ansible安装后,默认会在/etc/ansible/目录下生成配置文件。但是如果是通过pip或者是源码安装的话,就没有这个文件,需要手动创建。可以到官方的github上去下一个最新的:

$ mkdir /etc/ansible
$ cd /etc/ansible
$ wget https://raw.githubusercontent.com/ansible/ansible/devel/examples/ansible.cfg

[defaults]

定义常规的连接类配置:

[defaults]

# some basic default values...

#inventory      = /etc/ansible/hosts  # 定义Inventory,用于定义主机列表配置
#library        = /usr/share/my_modules/  # 自定了lib库存放目录
#module_utils   = /usr/share/my_module_utils/
#remote_tmp     = ~/.ansible/tmp  # 临时文件远程主机存放目录
#local_tmp      = ~/.ansible/tmp  # 临时文件本地存放目录
#plugin_filters_cfg = /etc/ansible/plugin_filters.yml
#forks          = 5  # 默认开启的并发数
#poll_interval  = 15  # 默认轮询时间间隔
#sudo_user      = root  # 默认sudo用户
#ask_sudo_pass = True  # 是否需要sudo密码
#ask_pass      = True  # 是否需要密码
#transport      = smart
#remote_port    = 22
#module_lang    = C
#module_set_locale = False

# additional paths to search for roles in, colon separated
#roles_path    = /etc/ansible/roles  # 默认下载的Roles存在的目录

# uncomment this to disable SSH key host checking
#host_key_checking = False  # 首次连接是否需要检查key认证,建议放开注释设为False

# SSH timeout
#timeout = 10  # 默认超时时间

# logging is off by default unless this path is defined
# if so defined, consider logrotate
#log_path = /var/log/ansible.log  # 执行日志存放目录

# default module name for /usr/bin/ansible
#module_name = command  # 默认执行模块

# set plugin path directories here, separate with colons
#action_plugins     = /usr/share/ansible/plugins/action  # 各类插件的存放目录
#become_plugins     = /usr/share/ansible/plugins/become
#cache_plugins      = /usr/share/ansible/plugins/cache
#callback_plugins   = /usr/share/ansible/plugins/callback
#connection_plugins = /usr/share/ansible/plugins/connection
#lookup_plugins     = /usr/share/ansible/plugins/lookup
#inventory_plugins  = /usr/share/ansible/plugins/inventory
#vars_plugins       = /usr/share/ansible/plugins/vars
#filter_plugins     = /usr/share/ansible/plugins/filter
#test_plugins       = /usr/share/ansible/plugins/test
#terminal_plugins   = /usr/share/ansible/plugins/terminal
#strategy_plugins   = /usr/share/ansible/plugins/strategy

# if set to a persistent type (not 'memory', for example 'redis') fact values
# from previous runs in Ansible will be stored.  This may be useful when
# wanting to use, for example, IP information from one group of servers
# without having to talk to them in the same playbook run to get their
# current IP information.
#fact_caching = memory  # getfact 缓存的主机信息存放方式

# retry files
# When a playbook fails a .retry file can be created that will be placed in ~/
# You can enable this feature by setting retry_files_enabled to True
# and you can change the location of the files by setting retry_files_save_path

#retry_files_enabled = False
#retry_files_save_path = ~/.ansible-retry  # 错误重启文件存放目录

上面这些配置多数都保持默认即可。只有一项host_key_checking = False可以放开注释。

[privilege_escalation]

处于安全考虑,有时候不希望直接以root用户直接部署应用,这时候就需要给普通用户sudo权限,这部分配置主要就是针对sudo用户提权的配置:

[privilege_escalation]
#become=True  # 是否sudo
#become_method=sudo  # sudo方式
#become_user=root  # sudo后变为root用户
#become_ask_pass=False  # sodu后是否验证密码

[paramiko_connection]

这部分功能不常用了,了解下把:

[paramiko_connection]

# uncomment this line to cause the paramiko connection plugin to not record new host
# keys encountered.  Increases performance on new host additions.  Setting works independently of the
# host key checking setting above.
#record_host_keys=False  # 不记录新主机的key以提升效率

# by default, Ansible requests a pseudo-terminal for commands executed under sudo. Uncomment this
# line to disable this behaviour.
#pty=False  # 禁用sudo功能

[ssh_connection]

Ansible默认使用ssh连接主机,这里是SSH连接的一些配置:

# Enabling pipelining reduces the number of SSH operations required to
# execute a module on the remote server. This can result in a significant
# performance improvement when enabled, however when using "sudo:" you must
# first disable 'requiretty' in /etc/sudoers
#
# By default, this option is disabled to preserve compatibility with
# sudoers configurations that have requiretty (the default on many distros).
#
#pipelining = False  # 管道加速功能,需配合requiretty使用方可生效

这块的配置项也不多,多数还是保持默认即可。

[accelerate]

Ansible连接加速相关配置:

[accelerate]
#accelerate_port = 5099  # 加速连接端口
#accelerate_timeout = 30  # 命令执行超时时间,单位秒
#accelerate_connect_timeout = 5.0  # 连接超时时间,单位秒

# The daemon timeout is measured in minutes. This time is measured
# from the last activity to the accelerate daemon.
#accelerate_daemon_timeout = 30  # 上一个活动连接的时间,单位分数

# If set to yes, accelerate_multi_key will allow multiple
# private keys to be uploaded to it, though each user must
# have access to the system via SSH to add a new key. The default
# is "no".
#accelerate_multi_key = yes

这里的配置项在提供Ansible连接速度时会涉及,多数还是保持默认

[selinux]

selinux几乎不会用,配置上还是保持默认:

# Set this to yes to allow libvirt_lxc connections to work without SELinux.
#libvirt_lxc_noseclabel = yes

[colors]

输出结果颜色的设置。原本的配置已经很好了,几乎不用修改,保持默认:

[colors]
#highlight = white
#verbose = blue
#warn = bright purple
#error = red
#debug = dark gray
#deprecate = purple
#skip = cyan
#unreachable = red
#ok = green
#changed = yellow
#diff_add = green
#diff_remove = red
#diff_lines = cyan

Inventory 配置详解

Inventory是Ansible管理主机的配置文件,默认位置是/etc/ansible/hosts,这个在ansible.cfg配置文件的开头有定义。
另外在ansible命令行中可以使用-i参数来指定要使用的Inventory文件。
注释:使用#来写注释内容。

定义主机和组

写在中括号中的内部表示组名。主机名可以是IP地址也可以是Hostname。主机名可以出现多次,这样可以写到多个组里。
如果主机使用了非默认的SSH端口,则可以在主机名后加冒号指定SSH端口号。
配置示例::

# 配置示例

# 可以用IP地址
192.168.1.1

# 也可以使用Hostname
www.ansible.com
docs.ansible.com:2222

# 使用中括号表示一个分组的开始,主机与主机之间可以有空行不影响分组
[webservers]
web1.ansible.com

# 用[10:20]表示连续的数组,包括10和20
web[10:20].ansible.com

[dbservers]
db-a.ansible.com
# 也可以用中括号处理连续的字母
db-[b:f].ansible.com

自定义变量

对于一些非标准化的配置需求,可以在Inventory配置中进行设置。这样可以满足对于主机的一些个性化设置要求。
Ansible支持多种方式修改或自定义变量,Inventory是其中的一种修改方式。

定义主机变量
在定义主机时可以同时定义主机变量:

[webserverrs]
web1.ansible.com http_port=8000  # 自定义http_port的端口号为8000

定义组变量
还可以定义组变量,同时对一组主机修改或自定义变量:

[groupservers]
web1.ansible.com
web2.ansible.com

[groupservers:vars]
http_port=8000

Default groups
Ansible还定义好了两个默认组:

  • all: 包含所有主机
  • ungrouped: 包含没有组的所有主机

组的嵌套

Inventory中的组还可以包含其他的组,就是嵌套。嵌套时要在大组的名字后加上:children,表示嵌套的成员是组名而不是主机名:

[apache]
httpd1.ansible.com
httpd2.ansible.com

[nginx]
ngx1.ansible.com
ngx2.ansible.com

[webservers:children]
apache
nginx

[webservers:vars]
ntp_server=ntp1.aliyun.com

对于嵌套的组也是可以设置组变量的,这个和普通的组变量一样。

多重变量定义

变量除了可以在Inventory中定义,还可以独立于Inventory文件之外单独定义到一个配置文件中。
下面是设置变量的各种途径,按优先级顺序排列:

  1. command line values (eg “-u user”)
  2. role defaults
  3. inventory file or script group vars
  4. inventory group_vars/all
  5. playbook group_vars/all
  6. inventory group_vars/*
  7. playbook group_vars/*
  8. inventory file or script host vars
  9. inventory host_vars/*
  10. playbook host_vars/*
  11. host facts / cached set_facts
  12. play vars
  13. play vars_prompt
  14. play vars_files
  15. role vars (defined in role/vars/main.yml)
  16. block vars (only for tasks in block)
  17. task vars (only for the task)
  18. include_vars
  19. set_facts / registered vars
  20. role (and include_role) params
  21. include params
  22. extra vars (always win precedence)

https://docs.ansible.com/ansible/latest/user_guide/playbooks_variables.html#ansible-variable-precedence

比较常用的是如下4种:

  • Inventory配置文件
  • Playbook中vars定义的区域
  • Roles中vars目录下的文件(roles/X/vars/main.yml)
  • group_vars和hosts_vars目录下的文件

单独定义vars配置文件,比如有个主机foosball,同时属于raleigh和webservers组,那么变量定义在以主机名或组名定义的如下3个文件中都有效:

  • /etc/ansible/group_vars/raleigh
  • /etc/ansible/group_vars/webservers
  • /etc/ansible/host_vars/foosball

用于SSH连接的参数

Ansible基于SSH连接Inventory中指定远程主机时,还内置了一些参数,用于指定连接时的交互方式,下面列举了比较常用的参数:

  • ansible_ssh_host: 指定连接主机
  • ansible_ssh_port: 指定SSH连接端口,默认22
  • ansible_ssh_user: 指定SSH连接用户
  • ansible_ssh_pass: 指定SSH连接密码
  • ansible_ssh_private_key_file: 指定私钥文件

连接要用到连接插件,插件会用到自己的变量,比如上面的这几个就是。下面的几个是通用的连接变量,这些变量插件也是可以识别的,效果是一样的。

下面3个是通用的连接用的变量:

  • ansible_host
  • ansible_port
  • ansible_user

这里的3个是通用的,优先级上应该会被上面的专用的覆盖掉。

SSH插件一共有哪些变量,这些变量的设置方式和对应的名称,包括默认值、环境变量、所有对应的变量名,可以查官方文档:
https://docs.ansible.com/ansible/latest/plugins/connection/ssh.html#ssh-connection

所有的连接查看,看这里:
https://docs.ansible.com/ansible/latest/plugins/connection.html?highlight=ansible_ssh_host

验证变量的值

把设备设置的参数打印出来,进行验证。

local
指定使用连接插件为locol,这样执行时不会连接到远程主机,而是直接在ansible程序的主机上运行。这个效果可以用hostname来验证:

$ ansible HOST -m command -a "hostname" -c local

指定连接为local后,执行command模块的hostname命令,就是在当前的ansible主机上运行,返回的结果也是当前ansible主机的主机名。

echo
然后再用echo命令把参数的值打印出来:

$ ansible HOST -m command -a "echo {{VAR_KEY}}" -c local