假设我有以下变量:
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"(最终目的是为所有my sites/stages创建相同的systemD服务)
我尝试了很多基于set_fact和with_subelement循环的东西。
我认为this answer可以帮助我,但问题不是一样的,我不明白为了适应它们而做的转换。(注意,如果我在所有site_name/stage_name中重复服务,它会起作用,但我会避免它)
注意:我不能改变"contextes“变量结构,我所有的ansible基础结构都是基于的。
非常感谢
发布于 2020-01-15 21:18:26
虽然我总体上同意@larsk关于ansible处理复杂数据操作的能力的评论,但当前的问题并不像看起来那么难,并且可以有一个相当简洁的"ansible only“解决方案。
我的解决方案依赖于subelements loop的使用
---
- 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这给了我们
$ 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 https://stackoverflow.com/questions/59750716
复制相似问题