【问题标题】:How to specify ansible pretasks for a role?如何为角色指定 ansible 预任务?
【发布时间】:2015-05-29 07:21:19
【问题描述】:

应该如何为角色依赖定义一个预任务。 我目前有一个apache 角色,它有一个用户变量,所以在<role>/meta/main.yml 我自己的角色中,我做了类似的事情:

---
dependencies:
  - { role: apache, user: proxy }

此时的问题是我仍然没有我指定的用户,并且当角色尝试在不存在的用户下启动apache 服务器时,我收到错误消息。

我尝试在<role>/tasks/main.yml 中创建一个任务,例如:

---
- user: name=proxy

但只有在依赖项中运行 apache 任务后才会创建用户(这是意料之中的)。那么,有没有办法在依赖项中运行角色之前创建一个可以创建用户的任务?

【问题讨论】:

  • 你能发布完整的剧本以及你的自定义角色吗?
  • 您也将- user: name=proxy 设置为pre_tasks:tasks<role>/tasks/main.yml 中吗?
  • 实际上,除了--- 部分,- user: name=proxy 上方的一行就是我拥有的整个文件。我已经编辑了内容,以便更清楚地了解我的文件的外观,但这就是我现在拥有的所有内容,除了 apache 角色

标签: dependencies ansible role


【解决方案1】:

从 Ansible 2.2 开始,您可以使用 include_rolehttps://docs.ansible.com/ansible/include_role_module.html

- user: name=proxy

- include_role:
    name: apache
  vars:
    user: proxy

【讨论】:

【解决方案2】:

我使用pre_tasks在角色之前完成一些任务,感谢Kashyap

#!/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 :

【讨论】:

  • 现在,我喜欢使用pre_taskspost_tasks 来做一些事情。
【解决方案3】:

只是不得不处理这个问题,真正的问题是前置任务很可能比角色更具体。做一个后期任务很容易,因为你只需让一个新的角色依赖,这被称为 “包装角色”......或者至少这就是他们在厨师中所说的想法,当你试图扩展某些东西时。

对于前置任务,您必须稍微修改层次结构,使用“包装角色”和我所说的“兄弟角色”。所以依赖逻辑会显示为,

  • 包装角色
    • 兄弟角色
    • 原角色

包装器有两个依赖项,但请确保在依赖项列表中首先添加“兄弟角色”。因为 Ansible 会从上到下。

最后,您应该将您的 var 放在包装角色中,以便您可以从剧本中覆盖它们。您希望变量尽可能地遵循层次结构,而不是跨越兄弟姐妹。

【讨论】:

    【解决方案4】:

    我也有类似的需求,我通过在角色 vars 中定义变量来解决。也就是说,用

    创建一个<role>/vars/main.yml
    ---
    user: proxy
    

    这应该覆盖在 apache 模块中定义的 user 变量,而将其写入您的模块 defaults 目录中不会。

    我使用的是 ansible 1.9,不知道这种行为存在多长时间。

    【讨论】:

      【解决方案5】:

      您可以在未命名的<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 }
      ...
      

      【讨论】:

        【解决方案6】:

        简答:我认为该语言不允许为角色指定 pre_tasks

        您可以通过将用户的创建移至单独的剧本并includeing 剧本而不是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

        【讨论】:

        • pre_taskspost_task 是否只允许在剧本中而不是在角色中?
        • 现在有 include_varsinclude_tasksinclude_roles 模块。这些是模块,因此它们作为任务、pre_tasks 或 post_tasks 在角色或任务中运行,甚至可能在处理程序中运行。是的,pre_taskspost_tasks 用于剧本,而不是角色。严格来说,tasks 部分也仅在剧本中使用,因为角色任务位于单独的文件中。
        猜你喜欢
        • 2020-10-05
        • 2015-08-26
        • 2019-01-14
        • 2017-02-27
        • 2018-10-06
        • 1970-01-01
        • 1970-01-01
        • 2014-05-02
        • 1970-01-01
        相关资源
        最近更新 更多