Ansible:将带有键:值对的逗号分隔字符串转换为字典

Ansible:将带有键:值对的逗号分隔字符串转换为字典

我正在通过额外的变量启动 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'}

相关内容