如何在仅包含任务的 Ansible 剧本片段文件中设置文件中所有任务之间共享的指令?
# ansible/inventory/roles/os_packages/tasks/main.yaml
- name: "APT: Update available packages from Debian repositories"
gather_facts: false
become: true
become_user: root
apt:
update_cache: true
- name: "APT: Install required packages"
gather_facts: false
become: true
become_user: root
apt:
name:
- foo
- bar
那些重复的指令—— gather_facts
,become
等——应该在该文件中声明一次。但是在哪里,因为(目前?)没有代表角色或扮演的文件?
# ansible/inventory/roles/os_packages/tasks/main.yaml
# This doesn't work because Ansible is expecting only tasks.
gather_facts: false
become: true
become_user: root
- name: "APT: Update available packages from Debian repositories"
apt:
update_cache: true
- name: "APT: Install required packages"
apt:
name:
- foo
- bar
该文件只需包含一系列任务;“角色”级别或“播放”级别似乎在这个推荐的目录结构中没有合适的位置。
如果整个剧本都在一个文件中,那么每个剧本都有自己单独的名称,我会在剧本上设置指令。但是这些任务文件正在收集和编译,我没有地方可以编写这些指令。
应该在哪里定义适用于角色中所有任务的指令?
我的典型目录结构:
在这种情况下,我将这些指令放在顶层 play 中
deploy-something.yml
:gather_facts
对除了游戏之外的任何东西进行设置是没有意义的(或可能的),因为它只会影响游戏级别的决定是否收集事实。become
并且become_user
是有效的块级或任务级关键字,因此您可以使用块将它们应用于任务列表(在角色内或其他):调用角色时也可以应用许多关键字:
问:“应该在哪里定义适用于角色中所有任务的指令? ”
A:简短的回答是:在角色之外。
你应该把关键字放在哪里取决于你如何使用这个角色。还有更多选择
在这里解释所有细节超出了范围。通常,将此类关键字放在角色的(缩进)级别上。在include_role的情况下,您还可以应用关键字。请注意,并非所有关键字都可以在任何地方应用。请参阅适用于角色的剧本关键字。例如,关键字
gather_facts
只能应用于剧本。如何解决您的问题的选项之一可能是下面的游戏结构问:“当没有代表角色的配置文件(只有角色目录)时,如何做到这一点(在角色级别应用此类关键字)? ”
A:如果只有角色目录,代表角色,可以只对角色内部的块和任务应用关键字。您不能将关键字应用于此角色中的角色。没有角色的配置文件之类的东西。
在上一个答案中,我所说的级别是指缩进级别,例如在上面的代码中,适用于戏剧,
gather_facts
同时适用于角色。become
become_user