写点什么

一文解析 Ansible 配置管理文件

  • 2022 年 7 月 20 日
  • 本文字数:2555 字

    阅读完需:约 8 分钟

一文解析Ansible配置管理文件

本文将介绍 Ansible 项目配置管理部分,配置文件为 ansible.cfg。


首先,本例中 ansible.cfg 的存储路径为/hoem/feng/ansible.cfg,即位于当前 Ansible 项目目录中。这样做的好处如下:

1)ansible.cfg 的配置只对当前项目有效,在实际使用时,你可以根据自己的使用习惯进行私人定制。

2)当前目录下的 ansible.cfg 文件与 Ansible 全局配置文件(/etc/ansible/ansible.cfg)、其他 Ansible 项目中的 ansible.cfg 都不会冲突。Ansible 读取配置文件的优先级由高到低依次为:ANSIBLE_CONFIG(系统环境变量)、ansible.cfg(位于当前目录中)、.ansible.cfg(位于家目录中)、/etc/ansible/ansible.cfg。


关于 ansible.cfg 文件的使用,有以下几条建议:

1)依据 anisble.cfg 最佳实践,准备一份通用版 ansible.cfg 文件并将其作为模板。

2)在 Ansible 项目目录中先复制通用版的 ansible.cfg。

3)根据具体项目在通用版 ansible.cfg 的基础上进行定制,不必一开始就准备一份大而全的配置文件,可以在项目调试过程中根据需求随时动态添加相关内容。


接下来使用 ansible-config 命令行工具查看 ansible.cfg 文件中使用的配置项:

[root@ansible feng]#ansible-config view[defaults]inventory = ./xlsx_inventory.pylibrary = ./libraryroles_path = ./roles
module_name = commandgathering = explicitcallback_enabled = timer
string_conversion_action = 'ignore'allow_world_readable_tmpfiles=True
command_warning = FalseHost_key_checking = falseretry_files_enabled = falsedeprecation_warnings = False
复制代码

上述代码所示是一个常用的 ansible.cfg 模板,如果使用的不是动态 inventory,可以将 xlsx_inventory.py 改成自己的 inventory 文件名字。下面对该文件中涉及的配置进行详细介绍。

1. inventory = ./xlsx_inventory.py 这条配置的作用是定义 Ansible 默认查找 ansible inventory 文件的位置。如果没有添加这条配置,则 Ansible 会默认使用按照优先级顺序找到的第一个 inventory 文件,如果不打算使用默认 inventory 文件,则需要在使用 Ansible 命令时显式指定 inventory 文件的路径:

[root@ansible feng]#ansible all -i xlsx_inventory.py -m ping
复制代码


添加下面这条配置后再执行 Ansible 命令时,就可以省略-i xlsx_inventory.py 选项了:

[root@ansible feng]#ansible all -m ping
复制代码


  1. library = ./library 这条配置的作用是定义 Ansible 自定义模块的存放目录。如果没有这条配置,自定义模块的目录名只能为 library,且为当前 Ansible 项目目录,这是 Ansible 语法约定的。使用这条配置后,则可以将目录名改成任意名字,存放在任意指定位置。


  1. roles_path = ./roles 这条配置的作用是定义 Ansible Roles 的存放目录。如果没有这条配置,Ansible Roles 的目录名只能为 roles,且为当前 Ansible 项目目录,这是 Ansible 语法约定的。使用这条配置后,则可以将目录名改成任意名字,存放在任意指定位置。


  1. module_name = command 这条配置的作用是定义使用 Ansible 命令行工具时默认使用的 Ansible 模块。使用 Ansible 命令不加-m 选项,则 Ansible 默认使用这条配置设定的模块,系统默认值为 command,大家可以根据自己的使用习惯进行配置。


有些用户喜欢将 Ansible 命令行默认使用的模块由 command 换成 shell,因为他们认为 shell 比 command 适用性广,在使用 shell 模块时,参数项可以直接使用所有的 Linux shell 命令,无论 shell 命令中是否包含管道符(|),但是 Ansible 默认使用的 command 模块更贴合 Ansible 的功能特性。


Ansible 默认选择 command 模块而非 shell 的原因是 command 不通过系统的 shell 运行,因此使用 command 执行 tasks 时,执行结果不会受到被管主机用户环境的影响,相对更安全。正因为如此,用户特定的环境变量(如 $HOME)无法通过 command 使用,类似的还有一些流操作(stream operation),如<、>、|、&等也无法使用。所以,如果需要使用被管主机的用户环境变量、命令或需要用到流操作时,那么只能选 shell,其他情况建议一律选 command。


  1. gathering = explicit 这条配置的作用是定义 gather_facts 的使用模式。gather_facts 有 3 种使用模式,即 implicit、explicit、smart,默认是 implicit 模式。3 种使用模式的作用如下。

  • implicit 模式:这种模式下 gather_facts 默认开启,且禁用 fact cache。如果想关闭 gather_facts,需要在 Playbook 中显式指定 gather_facts = False。

  • explicit 模式:这种模式下 gather_facts 默认关闭,且启用 fact cache。如果想开启 gather_facts,则需要在 Playbook 中显式指定 gather_facts = True。

  • smart 模式:这种模式下 gather_facts 默认开启,且启用 fact cache。这种模式与 implicit 模式的不同点在于,前者在 Playbook 运行过程中,每个主机的 fact 信息只采集一次。


如果需要禁用 gather_facts 的任务远多于需要启用 gather_facts 的任务,且大多数情况下编写 Playbook 时都会在 play 的配置选项里加上一条 gather_facts = False,那么建议选用 explicit 模式。


默认情况下 Ansible 采集 fact 信息的时间开销还是很可观的,任务量少的时候尤为明显。如果想要优化这部分的时间开销,除了使用 explicit 模式外,还可使用 gather_subset 配置项。这个配置项可以与 implicit 模式配合使用,从而做到在启用 gather_facts 的同时又降低采集 fact 信息的时间开销。


  1. callback_enabled = timer 这条配置的作用是统计每个 play 的执行时间。在实际使用 Ansible 的过程中,如果遇到 Playbook 执行速度慢,想要查找耗时较多的 play,来有针对性地优化 Ansible 的执行时间时,这条配置会很有帮助。


  1. string_conversion_action = 'ignore'这条配置的作用是处理 Ansible 模块传参时的类型转换模式。Ansible Playbooks 在模块传参的时候,会默认将非 string 类型的数据强制转换成 string 类型,这个功能会在需要传 list 或 dict 等类型的参数时出现问题,并且抛出如下警告。使用 string_conversion_action 参数可以解决这个强制转换并报警的问题。


  1. allow_world_readable_tmpfiles = True 这条配置的作用是将在被管理端生成的临时目录设为全局可读,适用于 become_user 为非 root 且未提权的用户场景。


  1. 4 个常用的配置项

4 个常用的配置项为 command_warningshost_key_checkingretry_files_enabled deprecation_warnings,分别代表命令行错误警告、首次连接被管主机时的 SSH key 检查、执行失败时自动生成 retry 文件、版本遗弃功能警告。这几个配置项通常均默认设置为 false。

发布于: 刚刚阅读数: 5
用户头像

InfoQ签约作者 2018.11.30 加入

热爱生活,收藏美好,专注技术,持续成长

评论

发布
暂无评论
一文解析Ansible配置管理文件_ansible_穿过生命散发芬芳_InfoQ写作社区