Вызов задачи Ansible в родительской роли с разными значениями - PullRequest
0 голосов
/ 13 апреля 2019

Я создал две очень простые роли Ansible, названные base и web. web зависит от base, и эта зависимость определена в web/meta/main.yml.

base имеет следующую задачу, определенную в base/tasks/main.yml:

- name: install required packages
  apt:
    name: "{{ install_packages }}"
    update_cache: "{{ apt_update_cache }}"
    cache_valid_time: "{{ apt_cache_valid_time }}"

Переменные в base определены в base/defaults/main.yml:

apt_update_cache: yes
apt_cache_valid_time: 3600

install_packages:
  - ufw
  - sshguard

Переменные в web определены в web/defaults/main.yml:

install_packages:
 - nginx

Что я хочу сделать, это:

  1. Вызовите install required packages из base, используя переменную install_packages из base и apt_update_cache и apt_cache_valid_time из base.
  2. Вызовите install required packages из web, используя переменную install_packages из web, apt_update_cache и apt_cache_valid_time из base (поскольку я не переопределил ни одного из этих двух в web ).

Возможно ли это, и если да, то как мне это сделать? В качестве альтернативы, есть ли «лучший» способ достичь того же результата, не воспроизводя задачу в каждой зависимой роли (я, вероятно, создам несколько других, которые зависят от base, и у них всех будут свои собственные задачи, специфичные для роли тоже)?

1 Ответ

2 голосов
/ 14 апреля 2019

Вот один из вариантов.

Для ясности переименуйте 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.

...