如何为角色指定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_rolehttps://docs.ansible.com/ansible/include_role_module.html

- user: name=proxy

- include_role:
    name: apache
  vars:
    user: proxy