Ansible:通过额外的var选择dict元素

Ansible: selecting dict element by extra var

我正在尝试创建一个剧本来设置日志收集守护进程。我有一个带有要设置的参数的字典(在模板中使用)。像这样

logservers:
  prod:
    ipaddress: 10.10.44.79
    envname: "Productive servers"
    other_data: "important prod data"
  test:
    ipaddress: 10.20.44.79
    envname: "Testing servers"
    other_data: "data for testing"
  dev:
    ipaddress: 10.30.44.79
    envname: "Developement servers"
    other_data: "developers data"

是否可以使用额外的变量,例如 运行 剧本中的 -e env=prod 并在模板化时使用字典中的 select “prod” 元素?

或者,在Ansible中实现这个的方法是什么?

最后一点:我需要这个来让 Ansible 的一个相当老的 dist 在 (2.4) 上工作

有很多方法可以做到这一点:

一种方法是使用一个新变量 server ,它在额外的变量之后有想要的数据:

- name: configure app servers
  hosts: localhost
  vars:
    logservers:
      prod:
        ipaddress: 10.10.44.79
        envname: "Productive servers"
        other_data: "important prod data"
      test:
        ipaddress: 10.20.44.79
        envname: "Testing servers"
        other_data: "data for testing"
      dev:
        ipaddress: 10.30.44.79
        envname: "Developement servers"
        other_data: "developers data"

    server: "{{ logservers[env] }}"

  tasks:
    - name: display "{{ env }}"
      debug:
        msg: "{{ server }}"

您启动剧本:

ansible-playbook play.yml -e env=dev

结果:

TASK [display "dev"] ****************************************************************
ok: [localhost] => {
    "msg": {
        "envname": "Developement servers",
        "ipaddress": "10.30.44.79"
        "other_data": "developers data"
    }
}

您启动剧本:

ansible-playbook play.yml -e env=prod

结果:

TASK [display "prod"] ***************************************************************
ok: [localhost] => {
    "msg": {
        "envname": "Productive servers",
        "ipaddress": "10.10.44.79"
        "other_data": "important prod data"
    }
}