Van*_*las 7 variables roles include ansible
经过大量搜索,我得出的结论是 ansible(我使用最新的稳定版 v2.5.3)很可能不支持从include_roleandimport_role语句注册变量或通知。
还有一个类似的问题在这里,并在其中一个答案的建议是: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'
Run Code Online (Sandbox Code Playgroud)
这基本上是支持state: absent文件复制的通用自定义任务,直到此错误得到修复。
然后在另一个角色(我们称之为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'
Run Code Online (Sandbox Code Playgroud)
然后在第三个角色(让我们称之为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
Run Code Online (Sandbox Code Playgroud)
不幸的是,上述内容不起作用,因为该register: setupxy行注册了一个setupxy始终返回的变量"changed": false。如果我使用import_role而不是include_role,则该变量根本没有注册(保持未定义)。
请注意,在z-script角色中,我想/bin/z-script在角色中检测到任何更改时运行shell 命令setup-XY,即如果X-file或Z-file已更改,实际上我可能在setup-XY角色中执行更多任务。
此外,请注意,z-script与setup-XY角色无关(例如,z-script唯一需要在特定有问题的服务器中运行),因此z-script理想情况下执行的代码不应与setup-XY角色一起交付(并污染)。setup-XY在这种情况下,将视为外部/上游角色。