我该如何设置所有任务之间共享的指令在文件中,在 Ansible playbook 片段文件中仅包含任务?
# 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
该文件只需要包含一系列任务;“角色”级别或“游戏”级别似乎没有合适的位置推荐的目录结构。
如果整个剧本都在一个文件中,那么每个剧本都会有自己单独的名称,我会在剧本上设置指令。但是这些任务文件正在被收集和编译,而剧本没有地方供我编写这些指令。
应该在哪里执行适用于角色中的所有任务得到定义吗?
答案1
gather_facts
对于除了剧本之外的任何事物来说,设置都是没有意义的(或者不可能的),因为它只会影响是否收集事实的剧本级别的决定。
become
和become_user
是有效的块或任务级关键字,因此您可以使用堵塞将它们应用到任务列表(在角色内或其他):
- become: true
become_user: root
block:
- name: "APT: Update available packages from Debian repositories"
apt:
update_cache: true
- name: "APT: Install required packages"
apt:
name:
- foo
- bar
调用角色时也可以应用许多关键字:
- hosts: all
roles:
- name: foo
become: true
tasks:
- import_role:
name: bar
become: true
- include_role:
name: baz
apply:
become: true
答案2
我的典型目录结构:
├── deploy-something.yml
├── README.md
├── inventories
│ ├── prod
│ │ ├── group_vars
│ │ │ └── all
│ │ │ ├── vars.yml
│ │ │ └── vault.yml
│ │ ├── host_vars
│ │ │ ├── host1.yml
│ │ │ ├── host2.yml
│ │ │ └── localhost
│ │ │ ├── vars.yml
│ │ │ └── vault
│ │ └── inventory.yml
│ ...
└── roles
├── role1
│ ├── ...
...
在这种情况下,我在顶层游戏中放置了这样的指令deploy-something.yml
:
- hosts: all
remote_user: ansible
become: yes
become_method: sudo
any_errors_fatal: true
serial: true
order: reverse_inventory
roles:
- role1
- role2
答案3
问:“适用于角色所有任务的指令应该在哪里定义?“
答:简而言之,回答是:在角色之外。
关键字的具体位置取决于您如何使用该角色。还有更多选项
- 角色:
- 导入角色:
- 包括角色:
解释所有事情超出了范围细节此处。通常,将此类关键字放在角色的(缩进)级别。在以下情况下包括角色你也可以申请关键字。请注意,并非所有关键字都可以在任何地方应用。请参阅剧本关键词适用于角色。例如,关键字gather_facts
只能应用于剧本。解决问题的选项之一可能是以下剧本的结构
- hosts: all
gather_facts: false
roles:
- role: os_packages
become: true
become_user: root
问:“当没有代表角色的配置文件(只有角色目录)时,如何做到这一点(在角色级别应用此类关键字)?“
答:如果只有角色目录,代表角色,则您只能将关键字应用于角色内的块和任务。您不能将关键字应用于此角色内的角色。角色没有配置文件之类的东西。
在前面的回答中,我所说的级别是指缩进级别,例如在上面的代码中,gather_facts
适用于剧本,而和都become
适用become_user
于角色。