如何为角色指定ansible pretasks?
How to specify ansible pretasks for a role?
应该如何为角色依赖定义一个前置任务。
我目前有一个 apache
角色,它有一个用户变量,所以在我自己的 <role>/meta/main.yml
角色中,我做了类似的事情:
---
dependencies:
- { role: apache, user: proxy }
此时的问题是我仍然没有我指定的用户,当角色试图在一个不存在的用户下启动 apache
服务器时,我得到一个错误。
我尝试在 <role>/tasks/main.yml
中创建一个任务,例如:
---
- user: name=proxy
但用户仅在 运行 依赖项中的 apache
任务之后创建(这是预期的)。那么,有没有一种方法可以创建一个任务,该任务会在 运行 个依赖关系中的角色之前创建一个用户?
简短回答:我认为该语言不允许为角色指定 pre_tasks
。
您可以 cheat/work-around 通过将用户的创建移动到单独的剧本并 include
使用剧本而不是 role
。像这样:
my_fake_role_playbooks/user_and_apache.yml:
- hosts: "{{p_hosts}}"
pre_tasks:
user: name=proxy
roles: [ apache ]
actual_playbook.yml:
- include: my_fake_role_playbooks/user_and_apache.yml p_hosts=[host1, host2]
* 代码未经测试。
HTH
您可以在未命名的 <role>
或 apache
角色中使用另一个依赖项简单地解决此问题。
新代理用户角色的全部内容:
---
- user: name=proxy
...
然后在roles/apache/meta/main.yml
中添加依赖。
---
dependencies:
- proxy-user
...
或在roles/<role>/meta/main.yml
中设置:
---
dependencies:
- proxy-user
- { role: apache, user: proxy }
...
我也有类似的需求,通过在角色vars中定义变量解决了。也就是说,用
创建一个 <role>/vars/main.yml
---
user: proxy
应该覆盖在 apache 模块中定义的 user
变量,而将其写入模块 defaults
目录中则不会。
我正在使用 ansible 1.9,不确定这种行为已经存在了多长时间。
刚要处理问题,真正的问题是前置任务很可能比角色更具体一些。做一个 post-task 很容易,因为你只需要让一个新的角色依赖,这被称为
"wrapper role"... 或者至少这就是他们在 chef 中所说的想法,用于当您尝试扩展某些内容时。
对于前置任务,您必须稍微修改层次结构,使用 "wrapper role" 和我所说的 "sibling role"。所以依赖逻辑将显示为,
- 包装角色
- 兄弟角色
- 原角色
包装器有两个依赖项,但请确保首先在依赖项列表中添加 "sibling role"。由于 Ansible 将从上到下。
最后,您应该将变量放在包装器角色中,以便您可以从剧本中覆盖它们。您希望变量尽可能遵循层次结构,而不是跨越兄弟姐妹。
我用pre_tasks做角色前的一些任务,感谢。
#!/usr/bin/env ansible-playbook
---
- hosts: all
become: true
pre_tasks:
- name: start tasks and sent notifiaction to HipChat
hipchat:
color: purple
token: "{{ hipchat_token }}"
room: "{{ hipchat_room }}"
msg: "[Start] Run 'foo/setup.yml' playbook on {{ ansible_nodename }}."
roles:
- chusiang.vim-and-vi-mode
vars:
...
tasks:
- name: include main task
include: tasks/main.yml
post_tasks:
- name: finish tasks and sent notifiaction to HipChat
hipchat:
color: green
token: "{{ hipchat_token }}"
room: "{{ hipchat_room }}"
msg: "[Finish] Run 'foo/setup.yml' playbook on {{ ansible_nodename }}."
# vim:ft=ansible :
从 Ansible 2.2 开始,您可以使用 include_role
。
https://docs.ansible.com/ansible/include_role_module.html
- user: name=proxy
- include_role:
name: apache
vars:
user: proxy
应该如何为角色依赖定义一个前置任务。
我目前有一个 apache
角色,它有一个用户变量,所以在我自己的 <role>/meta/main.yml
角色中,我做了类似的事情:
---
dependencies:
- { role: apache, user: proxy }
此时的问题是我仍然没有我指定的用户,当角色试图在一个不存在的用户下启动 apache
服务器时,我得到一个错误。
我尝试在 <role>/tasks/main.yml
中创建一个任务,例如:
---
- user: name=proxy
但用户仅在 运行 依赖项中的 apache
任务之后创建(这是预期的)。那么,有没有一种方法可以创建一个任务,该任务会在 运行 个依赖关系中的角色之前创建一个用户?
简短回答:我认为该语言不允许为角色指定 pre_tasks
。
您可以 cheat/work-around 通过将用户的创建移动到单独的剧本并 include
使用剧本而不是 role
。像这样:
my_fake_role_playbooks/user_and_apache.yml:
- hosts: "{{p_hosts}}"
pre_tasks:
user: name=proxy
roles: [ apache ]
actual_playbook.yml:
- include: my_fake_role_playbooks/user_and_apache.yml p_hosts=[host1, host2]
* 代码未经测试。
HTH
您可以在未命名的 <role>
或 apache
角色中使用另一个依赖项简单地解决此问题。
新代理用户角色的全部内容:
---
- user: name=proxy
...
然后在roles/apache/meta/main.yml
中添加依赖。
---
dependencies:
- proxy-user
...
或在roles/<role>/meta/main.yml
中设置:
---
dependencies:
- proxy-user
- { role: apache, user: proxy }
...
我也有类似的需求,通过在角色vars中定义变量解决了。也就是说,用
创建一个<role>/vars/main.yml
---
user: proxy
应该覆盖在 apache 模块中定义的 user
变量,而将其写入模块 defaults
目录中则不会。
我正在使用 ansible 1.9,不确定这种行为已经存在了多长时间。
刚要处理问题,真正的问题是前置任务很可能比角色更具体一些。做一个 post-task 很容易,因为你只需要让一个新的角色依赖,这被称为 "wrapper role"... 或者至少这就是他们在 chef 中所说的想法,用于当您尝试扩展某些内容时。
对于前置任务,您必须稍微修改层次结构,使用 "wrapper role" 和我所说的 "sibling role"。所以依赖逻辑将显示为,
- 包装角色
- 兄弟角色
- 原角色
包装器有两个依赖项,但请确保首先在依赖项列表中添加 "sibling role"。由于 Ansible 将从上到下。
最后,您应该将变量放在包装器角色中,以便您可以从剧本中覆盖它们。您希望变量尽可能遵循层次结构,而不是跨越兄弟姐妹。
我用pre_tasks做角色前的一些任务,感谢
#!/usr/bin/env ansible-playbook
---
- hosts: all
become: true
pre_tasks:
- name: start tasks and sent notifiaction to HipChat
hipchat:
color: purple
token: "{{ hipchat_token }}"
room: "{{ hipchat_room }}"
msg: "[Start] Run 'foo/setup.yml' playbook on {{ ansible_nodename }}."
roles:
- chusiang.vim-and-vi-mode
vars:
...
tasks:
- name: include main task
include: tasks/main.yml
post_tasks:
- name: finish tasks and sent notifiaction to HipChat
hipchat:
color: green
token: "{{ hipchat_token }}"
room: "{{ hipchat_room }}"
msg: "[Finish] Run 'foo/setup.yml' playbook on {{ ansible_nodename }}."
# vim:ft=ansible :
从 Ansible 2.2 开始,您可以使用 include_role
。
https://docs.ansible.com/ansible/include_role_module.html
- user: name=proxy
- include_role:
name: apache
vars:
user: proxy