0

我创建了两个非常简单的 Ansible 角色,称为basewebweb是依赖的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. 使用变量from和from调用install required packagesfrom 。baseinstall_packagesbaseapt_update_cacheapt_cache_valid_timebase
  2. 调用install required packagesfrom ,web使用install_packages变量 fromweb和from (因为我没有覆盖这两个中的任何一个)。apt_update_cacheapt_cache_valid_timebaseweb

这可能吗,如果可以,我将如何去做?或者,是否有一种“更好”的方法来实现相同的结果,而无需在每个依赖角色中复制任务(我可能会创建其他几个依赖于 的base任务,它们也都有自己的角色特定任务)?

4

1 回答 1

2

这是一种选择。

为清楚起见,重命名install_packages为:roles/base/defaults/main.ymlbase_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角色的包。

于 2019-04-13T22:30:46.667 回答