在Ansible中,如何将活动角色中的变量组合到一个数组中?

时间:2019-05-13 10:55:38

标签: ansible

看“ In Ansible, how to combine variables from separate files into one array?”,答案之一是建议使用include_vars将多个源中的变量放入一个数组中,这几乎是我所需要的,但不是很充分。

我正在设置cloudfront_logging,它需要awslogs_logs:数组中的项目。我希望能够为该角色添加到我活跃的角色中,所以Syslog担任我的常见角色,但是如果我有php角色,我希望它包含php日志。

我想我可以让include_vars可以为所有角色工作,但是我看不到如何使它仅对构建中包含的角色起作用。因此,如果我包括php角色,请包括php日志,但如果不包括php日志,则不包括。

我当然可以将数组静态地包含在顶层,但是在架构上似乎有些偏离,因为您希望角色能够处理自己的日志记录。

1 个答案:

答案 0 :(得分:1)

您的角色可以使用set_fact任务将信息附加到变量。例如,假设您希望角色能够在logfiles事实中注册日志文件的路径;例如,您可以在每个角色中执行以下操作:

- set_fact:
    logfiles: "{{ logfiles|default([]) + ['/var/log/something.log', '/var/log/anotherthing.log'] }}"

换句话说,如果roles/role1/tasks看起来像这样:

---
- set_fact:
    logfiles: "{{ logfiles|default([]) + ['/var/log/role1.log'] }}"

roles/role2/tasks看起来像这样:

---
- set_fact:
    logfiles: "{{ logfiles|default([]) + ['/var/log/role2.log'] }}"

然后是一个看起来像这样的剧本:

---
- hosts: localhost
  gather_facts: false
  roles:
    - role1
    - role2

  tasks:
    - debug:
        var: logfiles

将产生以下输出:


PLAY [localhost] ******************************************************************************

TASK [role1 : set_fact] ***********************************************************************
ok: [localhost]

TASK [role2 : set_fact] ***********************************************************************
ok: [localhost]

TASK [debug] **********************************************************************************
ok: [localhost] => {
    "logfiles": [
        "/var/log/role1.log", 
        "/var/log/role2.log"
    ]
}

PLAY RECAP ************************************************************************************
localhost                  : ok=3    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0