在每个剧本目录中加载 ansible.cfg

Load ansible.cfg in each playbook dir

我正在寻找在根 playbook_dir 加载本地 ansible.cfg 的解决方案。 这是我的剧本架构文件夹:

ansible
├── deploy_manager
│   ├── ansible.cfg
│   ├── deploy_manager.yml
│   ├── environments
│   │   ├── demo
│   │   │   ├── group_vars
│   │   │   │   └── demo.yml
│   │   │   ├── inventory.yml
│   │   │   └── vars
│   │   │       └── vault.yml
│   │   ├── int
│   │   │   ├── group_vars
│   │   │   │   └── int.yml
│   │   │   ├── inventory.yml
│   │   │   └── vars
│   │   │       └── vault.yml
│   │   └── prod
│   │       ├── group_vars
│   │       │   └── prod.yml
│   │       ├── inventory.yml
│   │       └── vars
│   │           └── vault.yml
│   ├── README.md
│   └── roles
│       ├── create_instance
│       │   └── tasks
│       │       └── main.yml

当我使用 ansible-playbook cli 执行剧本时,我在当前目录中有一个 ansible.cfg,所以 ansible.cfg 被加载了。

当我从 AWX 执行剧本时,项目在 tmp/cev039fj/awx_1900_tw78u5vh/project 中。 /tmp/ cev039fj/awx_1900_tw78u5vh 中没有 ansible.cfg,因此加载的是 /etc/ansible/ansible.cfg。 我在每个带有不同参数的剧本目录中都有一个 ansible.cfg,所以当 AWX 启动剧本时,我如何设置剧本目录 ansible.cfg 的 ANSIBLE_CONFIG 路径?

我用 ANSIBLE_CONFIG 设置做了一些测试,但没有成功。

你有什么想法吗?

谢谢

编辑:

我已经打开 awx 问题 github https://github.com/ansible/awx/issues/10398 这是 AWX 的限制,它仅将 ansible 配置加载到根项目,因为剧本是在项目的根目录下执行的。 通常,我在当前目录 playbook 中执行 playbook,这就是为什么我的特定 ansible.cfg 没有问题。 我提出了两个建议来解决这个问题,我会post最后点在这里完成

好的,我知道 ansible-runner 不会尊重您在此处的 callback_plugins 设置。它会尝试尊重回调插件的用户设置,并将自己的设置附加到列表的末尾。

https://github.com/ansible/ansible-runner/blob/4926a6afda13e768f55010f46509d2888e83e9a7/ansible_runner/config/_base.py#L242

但问题是您没有设置环境变量 ANSIBLE_CALLBACK_PLUGINS。您为同一件事设置配置文件设置。要与之结合,它必须读取配置文件。它没有。

但是,AWX 确实会在某些情况下读取配置文件,因此它不会破坏用户设置。这是错误的地方。这需要移到 ansible-runner 中,以便它可以负责正确覆盖现有的用户设置。否则,Ansible 核心需要添加一些语法来表示“列表值设置的现有值”。

我们可以通过其他 1 种方法解决此问题 - 我们可以将 ansible-runner 回调插件放在集合中的预期位置。参见 ansible/ansible-runner#482。这避免了 ansible-runner 更改 ANSIBLE_CALLBACK_PLUGINS 设置的需要,它只引用标准输出回调插件。但是,它仍然需要设置 ANSIBLE_STDOUT_CALLBACK 设置。

您还设置了标准输出回调设置。这对我来说没有多大意义。只能有 1 个标准输出回调插件,因为这决定了写入标准输出的内容。我考虑过将它们分层的想法,但它们会踩到彼此的脚趾。相反,我认为您应该考虑将您的插件作为“普通”回调插件而不是标准输出回调插件。如果这样做,您仍然可以通过更改 AWX_TASK_ENV 设置来启用它,而无需 ansible-runner 破坏它。您不能使用配置文件执行此操作 - 这是我们的错误。