我有一个存放Ansible剧本的仓库。在一本游戏手册中,我将模块和ansible-cmdb结合使用。在接下来用于安装软件的剧本中,我定义了一个类型为dict的变量:packages
packages:
yum:
- epel-release
- yum-utils
...
pip:
- ruamel.yaml
...它描述了用yum和pip安装/卸载的软件包。
以下是packages.yml剧本中我的角色/任务负责人:
---
- name: Display yum packages to install
debug: var=packages.yum
- name: Install yum packages
yum:
name: "{{ packages.yum }}"
state: present聚在一起。
- name: Gather installed packages
ansible.builtin.package_facts:
manager: auto我的ansible.cfg:
[defaults]
fact_caching = jsonfile
fact_caching_connection = cache如果缓存目录为空,则可以工作。如果我在使用模块的情况下使用packages.yml,那么我就不能使用packages.yml剧本。对packages变量的引用实际上引用了ansible_facts.packages
$ ansible-playbook playbooks/packages.yml -e 'target=node1'
Executing playbook packages.yml
- node1 on hosts: node1 -
Display yum packages to install...
node1 ok: {
"changed": false,
"packages.yum": [
{
"arch": "noarch",
"epoch": null,
"name": "yum",
"release": "168.el7.centos",
"source": "rpm",
"version": "3.4.3"
}
]
}
...如果我将yum键更改为yum_install
$ ansible-playbook playbooks/packages.yml -e 'target=node1'
Executing playbook packages.yml
- node1 on hosts: node1 -
Display yum packages to install...
node1 ok: {
"changed": false,
"packages.yum_install": "VARIABLE IS NOT DEFINED!"
}
Install yum packages...
node1 failed | msg: The task includes an option with an undefined variable. The error was: 'dict object' has no attribute 'yum_install'我不明白为什么不能使用默认值/main.yml中定义的包变量。我可以重命名这个变量,但是我想了解这个问题。
早些时候,我没有遇到问题,因为我使用python库从OS获得了一个已安装的包列表,这个列表是插入在custom_facts中的:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import rpm
def _check_installed(module):
ts = rpm.TransactionSet()
mi = ts.dbMatch()
results = {}
for h in mi:
name = h['name']
version = h['version']
release = h['release']
arch = h['arch']
if results.has_key(name):
value = results[name]
value.append(("%s-%s.%s" % (version,release,arch)))
results[name] = value
else:
results[name] = [("%s-%s.%s" % (version,release,arch))]
custom_facts = { "Packages installed": results }
return { 'ansible_facts': { 'custom_facts': custom_facts } }
def main():
module = AnsibleModule(
argument_spec = dict(
),
supports_check_mode = True,
)
data = _check_installed(module)
module.exit_json(**data)
from ansible.module_utils.basic import *
main()来自模块
此模块返回的事实在hostvars主机事实中被添加/更新,并且可以像任何其他主机事实一样以名称引用。它们不需要注册才能使用。
但我既不使用ansible_facts.packages也不使用hostvarstarget.ansible_facts.packages.
发布于 2022-01-18 17:28:54
瓦尔斯目前默认为true;虽然保证setup模块的事实以ansible_作为前缀,但并不是所有模块都是如此。package_facts模块返回的事实没有这个前缀,因此除非关闭此设置,否则它将关闭现有的packages变量。
默认情况下禁用事实注入是开发人员计划要做的事情,但他们首先需要实现一种方法,在使用弃用变量时触发警告,这样就可以针对依赖此功能的人员发出弃用警告。同时,任何没有实际使用注入的vars的人都可以自由地禁用它,并防止随机模块污染其顶级变量命名空间。
https://stackoverflow.com/questions/70758475
复制相似问题