在具有不同值的父角色中调用Ansible任务

在具有不同值的父角色中调用Ansible任务,ansible,ansible-role,Ansible,Ansible Role,我创建了两个非常简单的Ansible角色,分别是base和webweb依赖于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: "{{ a

我创建了两个非常简单的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 }}"
apt_update_cache: yes
apt_cache_valid_time: 3600

install_packages:
  - ufw
  - sshguard
install_packages:
 - nginx
base
中的变量在
base/defaults/main.yml
中定义:

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

install_packages:
  - ufw
  - sshguard
install_packages:
 - nginx
web
中的变量在
web/defaults/main.yml
中定义:

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

install_packages:
  - ufw
  - sshguard
install_packages:
 - nginx
我想做的是:

  • 使用
    base
    中的
    install\u packages
    变量和
    apt\u update\u cache
    apt\u cache\u valid\u time
    base
    调用
    install required packages
  • web
    调用
    install required packages
    ,使用
    web
    中的
    install\u packages
    变量和
    apt\u update\u cache
    apt\u cache\u valid\u time
    base
    调用
    install\u packages
    (因为我在
    web
    中没有重写这两个变量)
  • 这可能吗?如果可能的话,我该怎么做?或者,是否有一种“更好”的方法来实现相同的结果,而不必在每个依赖角色中重复任务(我可能会创建几个其他依赖于
    base
    ,它们也都有自己的特定于角色的任务)?

    这里有一个选项

    为清楚起见,请将
    角色/base/defaults/main.yml中的
    安装程序包
    重命名为
    基本程序包

    ---
    base_packages:
      - ufw 
      - sshguard
    
    ---
    web_packages:
      - nginx
    
    角色/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 }}"
    
    ---
    dependencies:
      - role: base
        vars:
          extra_packages: "{{ web_packages }}"
    
    roles/web/defaults/main.yml
    中,定义
    web\u包

    ---
    base_packages:
      - ufw 
      - sshguard
    
    ---
    web_packages:
      - nginx
    
    roles/web/meta/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 }}"
    
    ---
    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   
    
    如您所见,这将安装在
    基本角色中声明的包以及
    web角色中声明的包。

    这里有一个选项

    为清楚起见,请将
    角色/base/defaults/main.yml中的
    安装程序包
    重命名为
    基本程序包

    ---
    base_packages:
      - ufw 
      - sshguard
    
    ---
    web_packages:
      - nginx
    
    角色/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 }}"
    
    ---
    dependencies:
      - role: base
        vars:
          extra_packages: "{{ web_packages }}"
    
    roles/web/defaults/main.yml
    中,定义
    web\u包

    ---
    base_packages:
      - ufw 
      - sshguard
    
    ---
    web_packages:
      - nginx
    
    roles/web/meta/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 }}"
    
    ---
    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   
    

    如您所见,这将安装在
    基本角色中声明的包以及
    web角色中声明的包。

    谢谢您的回答。但是,如果我有多个角色依赖于
    base
    ,这会起作用吗?如果我最终创建的角色依赖于
    web
    ,会发生什么?我试图避免让家长角色意识到孩子角色。谢谢你的回答。但是,如果我有多个角色依赖于
    base
    ,这会起作用吗?如果我最终创建的角色依赖于
    web
    ,会发生什么?我试图避免让父角色意识到子角色。