我想仅将标记块中定义的 Ansible 角色的一部分导入到剧本中(并执行(。
例如,我的角色some_role
包含 3 个任务块,标记为tag1
、tag2
和tag3
。我可以创建导入整个角色的剧本:
---
- hosts: some_host
roles:
- role: roles/some_role
然后从指定单个标签的命令行执行它:
$ ansible-playbook -i hosts.yml playbook.yml --tags tag1
但是我想将--tags tag1
部分移动到剧本本身中,以便能够在不向ansible-playbook
提供标签的情况下运行该单个块。
我找不到任何简单的方法来执行剧本中带有特定标签的角色的一部分。
一种方法可能是打破多个文件中的任务,并使用import_role
或include_role
使用剧本中的文件。比如说,如果您在角色的任务目录中创建两个名为main.yml
和other.yml
的文件,那么您可以使用如下所示的其他任务。
- import_role:
name: myrole
tasks_from: other
没关系。 这行不通。--千斤顶
评论中有用的讨论,所以我把它留了下来。
从未尝试过,但apply
试一试include_role
:
---
- hosts: some_host
tasks:
- include_role:
name: roles/some_role
apply:
tags:
- tag1
https://docs.ansible.com/ansible/latest/modules/include_role_module.html
- import_role:
name: myrole
tags: [ web, foo ]
- import_tasks: foo.yml
tags: [ web, foo ]
您可以使用上面的代码块来实现它。
参考资料:文档
---
- hosts: some_host
tasks:
- include_role:
name: some_role
tags: tag1
some_role必须在其任务中自然地定义 tag1。但是您还需要使用 tag1 执行它,就像您在问题中所做的那样:
ansible-playbook -i hosts.yml playbook.yml --tags tag1
我刚刚使用以下文档使用 ansible 2.10.6 对其进行了测试。确保使用包含而不是导入。