![Ansible:将带有键:值对的逗号分隔字符串转换为字典](https://linux22.com/image/788096/Ansible%EF%BC%9A%E5%B0%86%E5%B8%A6%E6%9C%89%E9%94%AE%EF%BC%9A%E5%80%BC%E5%AF%B9%E7%9A%84%E9%80%97%E5%8F%B7%E5%88%86%E9%9A%94%E5%AD%97%E7%AC%A6%E4%B8%B2%E8%BD%AC%E6%8D%A2%E4%B8%BA%E5%AD%97%E5%85%B8.png)
我正在通过额外的变量启动 docker-compose 服务 (apache solr) 的安装剧本。这些变量是在执行时设置的,因为这个剧本应该是灵活的,并且一台服务器上存在多个配置。
我的想法是,用户可以在 ansible ui(ansible 信号量)中将变量设置为字符串:
- 变量名
project_cores
- 变量值(字符串)
main_en:english,main_de:german
我想将这些核心迭代为字典。我最终想要的是:
{
{
name: main_en,
language: english
},
{
name: main_de,
language: german
},
}
第一步是将它们分开,
(这已经在起作用了):
- name: "debug: split cores"
debug:
msg: "{{ item }}"
loop: "{{ project_cores.split(',') }}"
然后我尝试了以下操作但没有成功,因为这没有添加子元素的键:
- name: "Extract solr cores configuration."
set_fact:
dict: "{{ dict|default({}) | combine ( { item.split(':')[0] : item.split(':')[1] } ) }}"
with_items:
- "{{ project_cores.split(',') }}"
我测试了一些组合,但没有找到如何添加键的有效解决方案。
知道如何将该字符串转换为第一个示例中所述的实际目录吗?提前致谢!
答案1
以下声明
project_cores_dict: "{{ dict(project_cores|
split(',')|
map('split',':')) }}"
给出你想要的
project_cores_dict:
main_de: german
main_en: english
- 完整测试剧本的示例
- hosts: localhost
vars:
project_cores: 'main_en:english,main_de:german'
project_cores_dict: "{{ dict(project_cores|
split(',')|
map('split',':')) }}"
tasks:
- debug:
var: project_cores_dict
- 使转换更加稳健,修剪这几项
project_cores_dict: "{{ dict(project_cores|
split(',')|map('trim')|
map('split',':')|map('map', 'trim')) }}"
测试一下
- debug:
msg: |
{{ pcd|to_yaml }}
loop:
- 'main_en:english,main_de:german'
- 'main_en:english, main_de:german'
- 'main_en: english, main_de:german'
vars:
pcd: "{{ dict(item|
split(',')|map('trim')|
map('split',':')|map('map', 'trim')) }}"
给出(节选)
msg: |-
{main_de: german, main_en: english}
msg: |-
{main_de: german, main_en: english}
msg: |-
{main_de: german, main_en: english}
无需修剪
- debug:
msg: |
{{ pcd|to_yaml }}
loop:
- 'main_en:english,main_de:german'
- 'main_en:english, main_de:german'
- 'main_en: english,main_de:german'
vars:
pcd: "{{ dict(item|
split(',')|
map('split',':')) }}"
空格将成为键和值的一部分
msg: |-
{main_de: german, main_en: english}
msg: |-
{' main_de': german, main_en: english}
msg: |-
{main_de: german, main_en: ' english'}