如何在 Ansible 中一个角色下执行多个任务?

问题描述 投票:0回答:2

我作为新手正在设置 Ansible。我想将一些任务分组到 Nginx 角色下。

查看我的文件夹结构

enter image description here

我可以让它工作的唯一方法是在我的剧本中使用 include 语句...但这意味着我需要开始将所有内容更改为相对路径,因为 Ansible 不再能够找到东西。

我目前的剧本:

- name: 
    Install Nginx, Node, and Verdeccia
  hosts: 
    all
  remote_user: 
    root
  tasks:
    - include: ../roles/nginx/tasks/install.yml
    - include: ../roles/nginx/tasks/create_node_config.yml
  vars:
    hostname: daz.com

如何将剧本中的

sub task
引用为类似

tasks:
  - nginx.install

并且仍处于最佳实践范围内。

ansible ansible-2.x
2个回答
8
投票

到目前为止,您对角色的使用不符合规范或 Ansible 的理念。从纯粹的技术角度来看,您在 playbook 中包含的 yml 文件中很可能有多个任务包。

如果您想包含某个角色的特定任务文件,您应该通过带有参数

include_role
模块
tasks_from
来完成此操作。

但是,角色的工作流程通常看起来不同。

  1. 文件夹中的

    tasks
    应始终是一个文件
    main.yml
    ,如果包含角色,则会自动调用该文件。

  2. 在此

    main.yml
    中,您可以添加进一步的控制逻辑以根据需要包含您的
    yml
    文件。

在我看来,例如,您总是需要安装,但根据用例您希望有不同的配置。

  1. 在您的

    nginx
    角色中创建文件
    defaults/main.yml

    ---
    config_flavor: none
    

    这会使用字符串

    config_flavor
    初始化
    none
    变量。

  2. 在您的

    nginx
    角色中创建文件
    tasks/main.yml

    ---
    - name: include installation process
      include_tasks: install.yml
    
    - name: configure node
      include_tasks: create_node_config.yml
      when: config_flavor == "node"
    
    - name: configure symfony
      include_tasks: create_symfony_config.yml
      when: config_flavor == "symfony"
    
    - name: configure wordpress
      include_tasks: create_wordpress_config.yml
      when: config_flavor == "wordpress"
    
    • 应用角色时,默认会包含
      main.yml
    • 这是首先完成安装的地方,然后完成正确的配置。
    • 应进行哪些配置由变量
      config_flavor
      定义。在列出的示例中,值为
      node
      symfony
      wordpress
      。在所有其他情况下,安装将完成,但不进行配置(因此在默认情况下使用
      none
      )。
  3. 将您的角色包含在剧本中,如下

    ---
    - name: Install Nginx, Node, and Verdeccia
      hosts: all
      remote_user: root
    
      vars:
        hostname: daz.com
    
      roles:
        - role: nginx
          config_flavor: node
    

    此时您可以设置

    config_flavor
    的值。如果您设置
    wordpress
    ,则将使用
    create_wordpress_config.yml
    中的逻辑自动包含任务
    tasks/main.yml

您可以在 Ansible 文档中找到有关角色的更多信息。

还有更多的可能性和方式,你会在学习的过程中认识它们。基本上,我建议您阅读大量 Ansible 文档并将它们用作参考书。


1
投票

请参阅以下文件。您可以将“include_role”与“tasks_from”属性一起使用。您不需要提供任务文件的完整路径,只需提供文件名。

https://docs.ansible.com/ansible/latest/collections/ansible/builtin/include_role_module.html

示例:

- name: Run tasks/other.yaml instead of 'main'
  ansible.builtin.include_role:
    name: myrole
    tasks_from: other
© www.soinside.com 2019 - 2024. All rights reserved.