首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >变量名称*包*与anisble_facts.packages的冲突

变量名称*包*与anisble_facts.packages的冲突
EN

Stack Overflow用户
提问于 2022-01-18 15:48:13
回答 1查看 553关注 0票数 1

我有一个存放Ansible剧本的仓库。在一本游戏手册中,我将模块ansible-cmdb结合使用。在接下来用于安装软件的剧本中,我定义了一个类型为dict的变量:packages

代码语言:javascript
复制
packages:
  yum:
    - epel-release
    - yum-utils
...
  pip:
    - ruamel.yaml
...

它描述了用yum和pip安装/卸载的软件包。

以下是packages.yml剧本中我的角色/任务负责人:

代码语言:javascript
复制
---
- name: Display yum packages to install
  debug: var=packages.yum

- name: Install yum packages
  yum:
    name: "{{ packages.yum }}"
    state: present

聚在一起。

代码语言:javascript
复制
- name: Gather installed packages
  ansible.builtin.package_facts:
    manager: auto

我的ansible.cfg:

代码语言:javascript
复制
[defaults]
fact_caching            = jsonfile
fact_caching_connection = cache

如果缓存目录为空,则可以工作。如果我在使用模块的情况下使用packages.yml,那么我就不能使用packages.yml剧本。对packages变量的引用实际上引用了ansible_facts.packages

代码语言:javascript
复制
$ 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

代码语言:javascript
复制
$ 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中的:

代码语言:javascript
复制
#!/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.

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-01-18 17:28:54

瓦尔斯目前默认为true;虽然保证setup模块的事实以ansible_作为前缀,但并不是所有模块都是如此。package_facts模块返回的事实没有这个前缀,因此除非关闭此设置,否则它将关闭现有的packages变量。

默认情况下禁用事实注入是开发人员计划要做的事情,但他们首先需要实现一种方法,在使用弃用变量时触发警告,这样就可以针对依赖此功能的人员发出弃用警告。同时,任何没有实际使用注入的vars的人都可以自由地禁用它,并防止随机模块污染其顶级变量命名空间。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70758475

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档