【问题标题】:can roles and tasks exist in the same playbook?角色和任务可以存在于同一个剧本中吗?
【发布时间】:2022-02-18 11:51:53
【问题描述】:
---
# file: main.yml

- hosts: fotk
  remote_user: fakesudo
  tasks:
  - name: create a developer user
    user: name={{ user }}
          password={{ password }}
          shell=/bin/bash
          generate_ssh_key=yes
          state=present
  roles:
  - { role: create_developer_environment, sudo_user: "{{ user }}" }
  - { role: vim, sudo_user: "{{ user }}" }

由于某种原因,创建用户任务没有运行。我在谷歌上搜索了我能想到的每一个关键词,但没有成功。

角色正在运行,这很奇怪。

剧本是否可以同时包含任务和角色?

【问题讨论】:

    标签: ansible ansible-playbook


    【解决方案1】:

    如果你需要在之前或之后做事情,你也可以做 pre_tasks: 和 post_tasks:。来自文档https://docs.ansible.com/ansible/latest/user_guide/playbooks_reuse_roles.html

    - hosts: localhost
    
      pre_tasks:
        - shell: echo 'hello in pre'
    
      roles:
        - { role: some_role }
    
      tasks:
        - shell: echo 'in tasks'
    
      post_tasks:
        - shell: echo 'goodbye in post'
    

    给出输出:PLAY [localhost]


    收集事实 ****************************************************** ************* 好的:[本地主机]

    任务:[shell echo 'hello in pre'] ************************************************ 更改:[本地主机]

    任务:[some_role | shell echo '你好来自角色'] ****************************** 已更改:[本地主机]

    TASK: [shell echo 'in tasks'] ************************************************* 已更改: [本地主机]

    TASK: [shell echo 'goodbye in post'] ****************************************** 已更改:[本地主机]

    播放回顾 ****************************************************** ****************** 本地主机:好的=5 更改=4 无法访问=0
    失败=0

    这是 ansible 1.9.1

    【讨论】:

    • 我在文档中看到了,但无论出于何种原因,我的任务都无法运行。
    • 试试我发布的简单剧本。添加一个仅执行 shell 的角色:回显某些内容并查看是否有效。也许你的剧本中有其他事情发生,导致它无法按预期工作。
    • URL 现在已经改变,尽管我在文档中找不到pre_tasks 示例。 docs.ansible.com/ansible/latest/user_guide/… 目前可能是一个不错的参考。
    【解决方案2】:

    实际上这应该是可能的,我记得我在测试期间做过几次。可能与您的版本有关 - 或者顺序确实很重要,因此任务将在角色之后执行。

    我会将此作为评论而不是答案发布,但我无法在评论中给出以下示例:

    无论您的任务未执行的原因是什么,您始终可以将您的剧本分成几个剧本,如下所示:

    ---
    # file: main.yml
    
    - hosts: fotk
      remote_user: fakesudo
      tasks:
      - name: create a developer user
        user: name={{ user }}
              password={{ password }}
              shell=/bin/bash
              generate_ssh_key=yes
              state=present
    
    - hosts: fotk
      remote_user: fakesudo
      roles:
      - { role: create_developer_environment, sudo_user: "{{ user }}" }
      - { role: vim, sudo_user: "{{ user }}" }
    

    【讨论】:

    • 如果您的剧本看起来像这样,那么我是否正确地认为这两个剧本可能会并行执行?
    • 不,第二场比赛只有在第一场比赛完成后才会开始。
    • 如果特定主机在第一次播放中的一个或多个任务失败,是否会在取决于第一次播放成功的第二次播放中跳过该主机?例如第一个剧本是“安装操作系统”,第二个剧本是“安装角色特定的软件”。
    【解决方案3】:

    https://docs.ansible.com/playbooks_roles.html#roles

    如果播放仍有“任务”部分,则执行这些任务 应用角色后。

    如果您希望在执行角色之前或之后运行任务,您需要在pre_taskspost_tasks 下列出这些任务。因此,没有办法在两个角色之间运行“松散”的任务。您可能希望为这些任务创建一个专用角色。

    【讨论】:

    • 请参阅@michael-aicher 的答案以获取有关此问题的更新。 Ansible 2.3 引入了include_role 选项。
    【解决方案4】:

    通过引用最新的 Ansible 文档 docs.ansible.com/latest/playbooks_reuse_roles,对已经提到的选项进行简短的跟进:

    从 Ansible 2.4 开始,您现在可以使用 import_role 或 include_role 将角色内联到任何其他任务中:

    ---    
    - hosts: webservers
      tasks:
        - debug:
          msg: "before we run our role"
        - import_role:
          name: example
        - include_role:
          name: example
        - debug:
          msg: "after we ran our role"`
    

    代码 sn-p 也来自 Ansible 文档。

    注意静态(import*)和动态(include*)用法之间的区别。

    【讨论】:

    • 这会在角色内部工作吗?我的许多角色都需要登录 cmdb 以获取有关系统/环境的信息。我创建了一个名为“登录”的角色,并且可能有 5 -6 个角色需要在执行任何其他操作之前执行,因为任务逻辑取决于来自 cmdb 的信息。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-03-21
    • 1970-01-01
    • 1970-01-01
    • 2019-08-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多