首页 > 解决方案 > Ansible jinja2 未使用 with_items 连接到列表

问题描述

为什么 new_list 也没有被连接?

---
- hosts: localhost
  gather_facts: False

  tasks:     
  - name: Set init list
    set_fact:
      init_list:
       - 1
       - 2
       - 3

  - name: New list from with_items
    set_fact:
      new_list: "{{ new_list|default([]) + [ item ] }}"
    with_items: "{{ init_list }}"

  - debug:
      var: new_list

当我运行这个简短的脚本时,我得到以下输出:

TASK [Set init list] 
*************************************************************************
ok: [localhost]

TASK [New list from with_items] 
*************************************************************************
ok: [localhost] => (item=1)
ok: [localhost] => (item=2)
ok: [localhost] => (item=3)

TASK [debug] 
*************************************************************************
ok: [localhost] => {
    "new_list": [
        3
    ]
}

我期待 new_list 包含 1,2,3。连接有效,但每次都覆盖。我确定这在以前可以正常工作(Ubuntu 16.04,不确定 Ansible 版本),我想知道这是否是 Ansible 版本问题。

# Ubuntu 18.04
# Ansible --version
ansible 2.5.1
  python version = 2.7.15rc1 (default, Nov 12 2018, 14:31:15) [GCC 7.3.0]

注意:我知道还有其他 jinja2 过滤器可能会解决这个问题,例如地图、列表等,但它们在我的生产代码中并不容易应用。

标签: ansiblejinja2

解决方案


我终于找到了正确的答案。这在 Ansible 版本 2.5.1 中被破坏了,不幸的是,这是 Ubuntu 18.04 中默认提供的版本。

当前最新的(2.5.5)没有这个问题。

sudo -H pip install ansible==2.5.5


推荐阅读