Ansible - 将字符串列表转换为具有预定义键

时间:2018-05-09 09:03:23

标签: ansible

我使用Ansible在新部署上安装软件包。我在变量中有一个预定义的dicts列表。

我想打开界面以使用Jenkins更新此列表。

我的列表如下所示:

package_list: [
  {'name': 'python-devel', 'apt': 'python-dev'},
  {'name': 'python-pip'},
  {'name': 'postgresql-devel'},
  ...
  ]

我将Jenkins输入与Ansible通信的方式是使用环境变量。我可以传递一个附加软件包列表进行安装,并将其作为Ansible配置的一部分进行阅读。

问题是:我如何将字符串列表转换为字典列表与package_list的结构相匹配?

例如:

ENV:
PACKAGES=gcc,vim,ntp

ANSIBLE:
additional_packages = [
    {'name': 'gcc'},
    {'name': 'vim'},
    {'name': 'ntp'}
]

甚至可能吗?

2 个答案:

答案 0 :(得分:1)

我相信这本剧本会让你到达你想要的地方。它假设你有env变量:PACKAGES=gcc,vim,ntp

它将字符串变量转换为列表(由,拆分),然后在另一个循环中转换为字典列表:

剧本:

- hosts: localhost
  gather_facts: false
  vars:

  tasks:
    - name: pick up env variable, convert to list
      set_fact:
         PACKAGES: "{{ lookup('env', 'PACKAGES').split(',') }}"

    - name: create dict list variable
      set_fact:
         PACKAGES_DICT: "{{ PACKAGES_DICT|default([]) + [{'name': item}] }}"
      with_items:
        - "{{ PACKAGES }}"

    - name: print results
      debug:
        var: PACKAGES_DICT

结果:

TASK [print results] **************************************************************************************************************************************************************************************************
ok: [localhost] => {
    "PACKAGES_DICT": [
        {
            "name": "gcc"
        }, 
        {
            "name": "vim"
        }, 
        {
            "name": "ntp"
        }
    ]
}

希望这会有所帮助

修改

优化代码,删除set_fact任务,在vars部分声明PACKAGES变量:

- hosts: localhost
  gather_facts: false
  vars:
    PACKAGES: "{{ lookup('env', 'PACKAGES').split(',') }}"

  tasks:
    - name: create dict list variable
      set_fact:
         PACKAGES_DICT: "{{ PACKAGES_DICT|default([]) + [{'name': item}] }}"
      with_items:
        - "{{ PACKAGES }}"

    - name: print results
      debug:
        var: PACKAGES_DICT

答案 1 :(得分:0)

使用 Ansible,列表应该这样写:

package_list:
  - name: "gcc"
  - name: "vim"
  - name: "ntp

所以要从字符串中获取该列表,您可以这样做:

vars:
  package_list: "{{ packages.split(',').values() | list }}"