首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Ansible combine "complex“字典

Ansible combine "complex“字典
EN

Stack Overflow用户
提问于 2020-01-15 19:42:06
回答 1查看 267关注 0票数 2

假设我有以下变量:

代码语言:javascript
复制
services:
  - name: export
    command: "php app/console export"
  - name: import
    command: "php app/console import"

contextes:
  - site_name: mysite
    stages:
      - stage_name: prod
        url: http://mysite.fr
        db:
          name: mysitedb_prod
          user: myuserdb_prod
        # more and more attributes, some simple, some list, some dictionaries
      - stage_name: qualif
        url: http://qualif.mysite.fr
        db:
          name: mysitedb_qualif
          user: mysiteuser_qualif
  - site_name: my2dsite
    stages:
      - stage_name: prod
        url: http://mysite2.fr
        db:
          name: mysite2db_prod
          user: myuser2db_prod

我想将它们转换为具有以下变量结构:

代码语言:javascript
复制
my_var:
  - site_name: mysite
    stage_name: prod
    services:
      - name: export
        command: "php app/console export"
      - name: import
        command: "php app/console import"
  - site_name: mysite
    stage_name: qualif
    services:
      - name: export
        command: "php app/console export"
      - name: import
        command: "php app/console import"
  - site_name: my2dsite
    stage_name: prod
    services:
      - name: export
        command: "php app/console export"
      - name: import
        command: "php app/console import"

(最终目的是为所有my sites/stages创建相同的systemD服务)

我尝试了很多基于set_fact和with_subelement循环的东西。

我认为this answer可以帮助我,但问题不是一样的,我不明白为了适应它们而做的转换。(注意,如果我在所有site_name/stage_name中重复服务,它会起作用,但我会避免它)

注意:我不能改变"contextes“变量结构,我所有的ansible基础结构都是基于的。

非常感谢

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-01-15 21:18:26

虽然我总体上同意@larsk关于ansible处理复杂数据操作的能力的评论,但当前的问题并不像看起来那么难,并且可以有一个相当简洁的"ansible only“解决方案。

我的解决方案依赖于subelements loop的使用

代码语言:javascript
复制
---
- name: Loop on subelements
  hosts: localhost
  gather_facts: false

  vars:
    services:
      - name: export
        command: "php app/console export"
      - name: import
        command: "php app/console import"

    contextes:
      - site_name: mysite
        stages:
          - stage_name: prod
            url: http://mysite.fr
            db:
              name: mysitedb_prod
              user: myuserdb_prod
            # more and more attributes, some simple, some list, some dictionaries
          - stage_name: qualif
            url: http://qualif.mysite.fr
            db:
              name: mysitedb_qualif
              user: mysiteuser_qualif
      - site_name: my2dsite
        stages:
          - stage_name: prod
            url: http://mysite2.fr
            db:
              name: mysite2db_prod
              user: myuser2db_prod

  tasks:
    - name: Construct my new data structure
      vars:
        current_hash:
          site_name: "{{ item.0.site_name }}"
          stage_name: "{{ item.1.stage_name }}"
          services: "{{ services }}"
      set_fact:
        my_var: "{{ my_var | default([]) + [current_hash] }}"
      loop: "{{ lookup('subelements', contextes, 'stages') }}"

    - name: Show calculated var
      debug:
        var: my_var

这给了我们

代码语言:javascript
复制
$ ansible-playbook test.yml 

PLAY [Loop on subelements] **********************************************************************************************************************************************************************************************************************************************

TASK [Construct my new data structure] **********************************************************************************************************************************************************************************************************************************
ok: [localhost] => (item=[{'site_name': 'mysite'}, {'stage_name': 'prod', 'url': 'http://mysite.fr', 'db': {'name': 'mysitedb_prod', 'user': 'myuserdb_prod'}}])
ok: [localhost] => (item=[{'site_name': 'mysite'}, {'stage_name': 'qualif', 'url': 'http://qualif.mysite.fr', 'db': {'name': 'mysitedb_qualif', 'user': 'mysiteuser_qualif'}}])
ok: [localhost] => (item=[{'site_name': 'my2dsite'}, {'stage_name': 'prod', 'url': 'http://mysite2.fr', 'db': {'name': 'mysite2db_prod', 'user': 'myuser2db_prod'}}])

TASK [Show calculated var] **********************************************************************************************************************************************************************************************************************************************
ok: [localhost] => {
    "my_var": [
        {
            "services": [
                {
                    "command": "php app/console export",
                    "name": "export"
                },
                {
                    "command": "php app/console import",
                    "name": "import"
                }
            ],
            "site_name": "mysite",
            "stage_name": "prod"
        },
        {
            "services": [
                {
                    "command": "php app/console export",
                    "name": "export"
                },
                {
                    "command": "php app/console import",
                    "name": "import"
                }
            ],
            "site_name": "mysite",
            "stage_name": "qualif"
        },
        {
            "services": [
                {
                    "command": "php app/console export",
                    "name": "export"
                },
                {
                    "command": "php app/console import",
                    "name": "import"
                }
            ],
            "site_name": "my2dsite",
            "stage_name": "prod"
        }
    ]
}

PLAY RECAP **************************************************************************************************************************************************************************************************************************************************************
localhost                  : ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0  
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59750716

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档