我作为新手正在设置 Ansible。我想将一些任务分组到 Nginx 角色下。
查看我的文件夹结构
我可以让它工作的唯一方法是在我的剧本中使用 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 的理念。从纯粹的技术角度来看,您在 playbook 中包含的 yml 文件中很可能有多个任务包。
include_role
的 模块 tasks_from
来完成此操作。
但是,角色的工作流程通常看起来不同。
文件夹中的
tasks
应始终是一个文件main.yml
,如果包含角色,则会自动调用该文件。
在此
main.yml
中,您可以添加进一步的控制逻辑以根据需要包含您的yml
文件。
在我看来,例如,您总是需要安装,但根据用例您希望有不同的配置。
在您的
nginx
角色中创建文件defaults/main.yml
。
---
config_flavor: none
这会使用字符串
config_flavor
初始化 none
变量。
在您的
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
)。将您的角色包含在剧本中,如下
---
- 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 文档并将它们用作参考书。
请参阅以下文件。您可以将“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