【51CTO.com快译】Ansible是一种功用很弱小的工具,可以跨效劳器、云、网络和容器等更多系统自动化管理各种平台。
您常常只需重用现有的角色和集合,就可以自动执行想要完成的操作。还有许多模块可供选择,可以在剧本中运用它们。
但是当您末尾开发和测试更复杂的剧本时,最终需求一些缺点排查办法。比如反省Ansible义务流、确认变量的数据类型,甚至在某个特定点暂停以反省它们的值。
本文讨论的一些技巧仅适用于经过命令行执行Ansible。其他技巧从Ansible Tower运转时也适用。
1. 你的Ansible环境和参数假设您需求剖析为什么某内容在剧本中没有按预期运转,最好先反省您的Ansible环境。
您在运转Ansible二进制文件和Python的哪些版本和途径?
假设您添加了剧本所需的操作系统包或Python模块,Ansible解释器会“看到”它们吗?
可以经过多种不同的方式获取这些基本信息。从命令行运转ansible --version命令。
> ansible --version
ansible 2.9.10
config file = /etc/ansible/ansible.cfg
configured module search path = ['/home/admin/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules']
ansible python module location = /usr/lib/python3.6/site-packages/ansible
executable location = /usr/bin/ansible
python version = 3.6.8 (default, Mar 18 2021, 08:58:41) [GCC 8.4.1 20200928 (Red Hat 8.4.1-1)]
可以经过运转其他Ansible命令来获取异样的信息,比如运用--version选项的ansible-playbook或ansible-config。
在Ansible Tower中,假设运用VERBOSITY 2(更详细)或更高版本执行作业模板,可显示该信息。
除了Ansible和Python二进制文件的版本和位置之外,细心反省用于模块的途径总是坏事,包括执行能否运用了不是默许的ansible.cfg文件(即不是/etc/ansible /ansible.cfg)。
要调查来自自定义ansible.cfg文件的选项,可以从命令行执行以下操作:
> ansible-config dump --only-changed
DEFAULT_BECOME(/home/admin/ansible/ansible.cfg) = True
DEFAULT_BECOME_USER(/home/admin/ansible/ansible.cfg) = root
DEFAULT_FORKS(/home/admin/ansible/ansible.cfg) = 10
DEFAULT_HOST_LIST(/home/admin/ansible/ansible.cfg) = ['/home/admin/ansible/inventory']
DEFAULT_ROLES_PATH(/home/admin/ansible/ansible.cfg) = ['/home/admin/ansible/roles']
HOST_KEY_CHECKING(/home/admin/ansible/ansible.cfg) = False
望文生义,这将列出与默许参数不同的参数。
2. 以详细形式运转下一步是在调试形式下运转剧本,以获取有关义务和变量中所发作状况的更多详细信息。
您可以从命令行添加-v(或-vv、-vvv、-vvvv、-vvvvv)。最高的详细级别有时能够含有太多信息,因此最好在屡次执行中逐渐添加详细级别,直至取得所需信息。
排查衔接成绩时级别4有所协助,级别5适用于排查WinRM成绩。
在Tower中,您可以从作业模板定义中选择VERBOSITY级别。
留意:记得在处置成绩后禁用调试形式,由于详细信息仅对排查缺点有用。
此外,在调试形式下,除非您在义务中运用no_log选项,否则会显示某些变量(比如密码)的值,因此完成后删除输入。
3.运用调试来显示变量假设您很清楚成绩能够出在哪里,可以运用更精准的办法:仅显示您需求查看的变量。
(...)
- name: Display the value of the counter
debug:
msg: "Counter={{ counter }} / Data type={{ counter | type_debug }}"
(...)
TASK [Display the value of the counter]
***************************************************************************
ok: [node1] => {
"msg": "Counter=42 / Data type=AnsibleUnicode"
}
这就是为什么我无法加大计数。过滤器type_debug显示,数据类型是text,而不是我以为的int。
4. 确保变量有适宜的内容和数据类型可以运用assert模块来确认:变量有预期的内容/类型,假设出了岔子,就促使义务失败。
下列剧本表明了这点:
---
- name: Assert examples
hosts: node1
gather_facts: no
vars:
var01: 13
tasks:
- debug:
msg: "Parameter 01 is {{ (param01 | type_debug) }}"
(责任编辑:admin)