我使用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'}
]
甚至可能吗?
答案 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 }}"