Вот один из вариантов.
Для ясности переименуйте install_packages
в roles/base/defaults/main.yml
в base_packages
:
---
base_packages:
- ufw
- sshguard
Перепишите задачу установки пакета в roles/base/main.yml
, чтобы онавыглядит следующим образом:
---
- name: install required packages
apt:
name: "{{ base_packages + extra_packages|default([]) }}"
update_cache: "{{ apt_update_cache }}"
cache_valid_time: "{{ apt_cache_valid_time }}"
В roles/web/defaults/main.yml
определите web_packages
:
---
web_packages:
- nginx
А в roles/web/meta/main.yml
объявите свою зависимость следующим образом:
---
dependencies:
- role: base
vars:
extra_packages: "{{ web_packages }}"
Если я заменим эту задачу apt
на задачу debug
:
- name: install required packages
debug:
msg:
apt:
name: "{{ base_packages + extra_packages|default([]) }}"
update_cache: "{{ apt_update_cache }}"
cache_valid_time: "{{ apt_cache_valid_time }}"
И воспользуюсь этой пьесой:
---
- hosts: localhost
gather_facts: false
roles:
- web
Я получу следующий вывод:
PLAY [localhost] ******************************************************************************
TASK [base : install required packages] *******************************************************
ok: [localhost] => {
"msg": {
"apt": {
"cache_valid_time": 3600,
"name": [
"ufw",
"sshguard",
"nginx"
],
"update_cache": true
}
}
}
PLAY RECAP ************************************************************************************
localhost : ok=1 changed=0 unreachable=0 failed=0
Как видите, при этом устанавливаются как пакеты, объявленные в вашей роли base
, так и пакеты из роли web
.