Loops Ansible联合收割机“;复杂的;词典

Loops Ansible联合收割机“;复杂的;词典,loops,filter,ansible,Loops,Filter,Ansible,假设我有以下变量: 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:

假设我有以下变量:

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
我想将它们转换为以下变量结构:

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"
(最终目的是为我的所有站点/阶段创建相同的systemD服务)

我尝试了基于集合事实和子元素循环的多种方法

我认为这可以帮助我,但问题不一样,我不理解为适应他们而做出的努力。 (请注意,如果我在所有站点/阶段重复服务,那么它可以工作,但我会避免)

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


非常感谢

尽管我大体上同意@larsk关于ansible处理复杂数据操作能力的评论,但当前的问题并不像看上去那么难,可以有一个相当简洁的“ansible only”解决方案

我的解决方案依赖于使用

$ 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  

我只需要编写一个过滤器插件(或自定义模块)并用Python执行此转换,而不是试图将其硬塞进Ansible语法中。Ansible通常在数据处理方面非常糟糕。不太难,不太难。。。这取决于谁:D非常感谢
$ 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