gpt4 book ai didi

variables - 在 include_role 中检测到更改时通知处理程序或注册 ansible 变量?

转载 作者:行者123 更新时间:2023-12-04 11:34:15 25 4
gpt4 key购买 nike

经过大量搜索,我得出的结论是 ansible(我使用的是目前最新的稳定版 v2.5.3)很可能不支持注册来自 include_role 的变量或通知。和 import_role声明。

有一个类似的问题here其中一个答案中的建议是:Each individual task within your include file can register variables, and you can reference those variables elsewhere .

但是,如果我遵循这个建议,那么我需要在我包含的所有角色中添加额外的不必要的代码,只是因为我可能需要在特殊服务器中的解决方法。事情很快就会失控并变得困惑,尤其是在嵌套角色包含的情况下(即当包含的角色包含更多包含的角色时)。此外,如果我使用 ansible-galaxy 的角色,我会想坚持上游版本(将角色视为外部库),这意味着理想情况下我不想更改角色的代码,因为它听起来不太直观必须维护一个人必须使用的所有角色的分支(否则外部角色/库几乎失去意义)。

那么,当一个人想要重用来自外部角色的代码并且基于被调用角色是否发生任何更改时,针对此类问题的建议解决方案是什么?就我如何实现 ansible playbook 逻辑而言,我在这里认为完全错误吗?

看看下面的我正在尝试做的具体示例 :

我有想要在较小角色中重用的拆分任务。在我的 common角色我有一个 add-file.yml看起来像这样的任务集( roles/common/tasks/add-file.yml ):

- name: Copying file "{{ file.src }}" to "{{ file.dest }}"
copy:
src: "{{ file.src }}"
dest: "{{ file.dest }}"
owner: "{{ file.owner | default(ansible_user_id) }}"
group: "{{ file.group | default(ansible_user_id) }}"
mode: "{{ file.mode | default('preserve') }}"
when:
file.state is not defined or file.state != 'absent'

- name : Ensuring file "{{ file.dest }}" is absent
file:
path: "{{ file.dest }}"
state: "{{ file.state }}"
when:
- file.state is defined
- file.state == 'absent'

这基本上是一个通用的自定义任务来支持 state: absent用于文件复制,直到 this bug得到修复。

然后在另一个角色中(我们称之为 setup-XY )我在文件 roles/setup-XY/tasks/main.yml 中执行此操作:
- name: Copying X-file
import_role:
name: common
tasks_from: add-file.yml
vars:
file:
state: present
src: X-file
dest: /home/user/X-file
mode: '0640'

- name: Ensuring Yline in Z-file
lineinfile:
dest: /etc/default/Z-file
regexp: '^Yline'
line: 'Yline=123'

然后在第三个角色中(我们称之为 z-script )我希望在文件 roles/z-script/tasks/main.yml 中有这样的东西:
- name: Setup-XY
include_role:
name: setup-XY
register: setupxy

- name: Run Z script if setupXY changed
shell: /bin/z-script
when: setupxy.changed

不幸的是,自从 register: setupxy 以来,上述内容不起作用行注册一个 setupxy始终返回 "changed": false 的变量.如果我使用 import_role而不是 include_role ,变量根本没有注册(保持未定义)。

请注意,在 z-script我要运行的角色 /bin/z-script每当在角色 setup-XY 中检测到任何更改时,都会执行 shell 命令,即如果 X-fileZ-file已更改,实际上我可能在 setup-XY 中有更多任务角色。

此外,请注意 z-scriptsetup-XY无关角色(例如 z-script 只需要在特定的有问题的服务器中运行),因此执行 z-script 的代码理想情况下不应与 setup-XY 一起运输(并污染)角色。看 setup-XY在这种情况下作为外部/上游角色。

最佳答案

你不可以做这个。你应该明白角色就像其他语言中的函数。你不能依赖内部发生的事情。
这就是为什么处理程序只能在当前上下文、角色或剧本中使用,并且您不能交叉调用它们。

关于variables - 在 include_role 中检测到更改时通知处理程序或注册 ansible 变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50556263/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com