Ansible:循环通过复杂变量以访问同一任务下的不同层的方法

Ansible:循环通过复杂变量以访问同一任务下的不同层的方法,ansible,Ansible,为了能够在同一模块/任务中调用来自变量不同层的项,在Ansible play中循环使用复杂字典变量的正确方法是什么 所讨论的变量如下所示(但它可以是任意数量的层,到目前为止,我只有大约3层): 任务包括在同一shell模块下或模板中使用安装路径(第1层)和数据库参数(第3层)创建数据库 例如(任务应该看起来像这样),但使用正确的循环方法: - name: Creating the databases become_user: "{{ item.0.instances.username }}"

为了能够在同一模块/任务中调用来自变量不同层的项,在Ansible play中循环使用复杂字典变量的正确方法是什么

所讨论的变量如下所示(但它可以是任意数量的层,到目前为止,我只有大约3层):

任务包括在同一shell模块下或模板中使用安装路径(第1层)和数据库参数(第3层)创建数据库

例如(任务应该看起来像这样),但使用正确的循环方法:

- name: Creating the databases
  become_user: "{{ item.0.instances.username }}"
  shell: "./db2 create database {{ item.1.name }} using pagesize {{ item.1.pagesize }}"
  args:
    chdir: "{{ item.0.install_path }}/bin"
  with_subelements:
    - "{{ installation }}"
    - instances.databases.clm

谢谢大家!

在ansible中做这样的事情不是一件小事,因为ansible中的循环是一维的。不过,有一种方法很简单,可以使用嵌套的。假设我将所有变量放在
vars.yml
中,并有以下文件:

playbook-nested.yml 实例.yml 数据库.yml 因此,命令
ansible playbook playbook-nested.yml-e@vars.yml
的输出将是:

PLAY [localhost] ***************************************************************

TASK [setup] *******************************************************************
ok: [localhost]

TASK [pass version forward] ****************************************************
included: /home/user/instances.yml for localhost
included: /home/user/instances.yml for localhost

TASK [Pass instance forward] ***************************************************
included: /home/user/databases.yml for localhost

TASK [echo command] ************************************************************
ok: [localhost] => (item={u'state': u'absent', u'name': u'RQM', u'pagesize': 32768}) => {
   "item": {                                                                                                                                      
       "name": "RQM",                                                                                                                             
       "pagesize": 32768,                                                                                                                         
       "state": "absent"                                                                                                                          
   },                                                                                                                                             
   "msg": "./db2 create database RQM using pagesize 32768"                                                                                        
}                                                                                                                                                  
ok: [localhost] => (item={u'state': u'absent', u'name': u'LQE', u'pagesize': 16384}) => {
   "item": {                                                                                                                                      
       "name": "LQE",                                                                                                                             
       "pagesize": 16384,                                                                                                                         
       "state": "absent"                                                                                                                          
   },                                                                                                                                             
   "msg": "./db2 create database LQE using pagesize 16384"                                                                                        
}                                                                                                                                                  

TASK [Pass instance forward] ***************************************************
included: /home/user/databases.yml for localhost
included: /home/user/databases.yml for localhost

TASK [echo command] ************************************************************
ok: [localhost] => (item={u'state': u'present', u'name': u'JTS', u'pagesize': 32768}) => {
   "item": {                                                                                                                                      
       "name": "JTS",                                                                                                                             
       "pagesize": 32768,                                                                                                                         
       "state": "present"                                                                                                                         
   },                                                                                                                                             
   "msg": "./db2 create database JTS using pagesize 32768"                                                                                        
}                                                                                                                                                  
ok: [localhost] => (item={u'state': u'absent', u'name': u'CCM', u'pagesize': 16384}) => {
   "item": {                                                                                                                                      
       "name": "CCM",                                                                                                                             
       "pagesize": 16384,                                                                                                                         
       "state": "absent"                                                                                                                          
   },                                                                                                                                             
   "msg": "./db2 create database CCM using pagesize 16384"                                                                                        
}                                                                                                                                                  
ok: [localhost] => (item={u'state': u'absent', u'name': u'QM', u'pagesize': 32768}) => {
   "item": {                                                                                                                                      
       "name": "QM",                                                                                                                              
       "pagesize": 32768,                                                                                                                         
       "state": "absent"
   }, 
   "msg": "./db2 create database QM using pagesize 32768"
}

TASK [echo command] ************************************************************
skipping: [localhost]

PLAY RECAP *********************************************************************
localhost                  : ok=8    changed=0    unreachable=0    failed=0      
我不知道clm是什么意思,也不知道我是否必须循环使用
数据库
,但我认为现在您已经清楚了这个概念


我想您也可以使用较低级别上的嵌套_循环。

Andrew,非常感谢您用我在其他任何地方都找不到的宝贵信息来启发我!!我有这个任务:
-name:echo命令debug:msg=“安装值为{{installation[v].installations},用户{{installation[v].instances[I].username}},数据库{{{installation[v].instances[I].databases[d].name}{************************************************************确定:[localhost]=>{“msg”:“./db2如果值为真,则使用用户inst1和数据库名称JTS创建数据库”}
- hosts: localhost
  tasks:
    - name: pass version forward
      include: instances.yml v="{{ version_item }}"
      with_items: "{{ installation }}"
      loop_control:
        loop_var: version_item
- name: Pass instance forward
  include: databases.yml i={{ instance_item }}
  with_items: "{{ installation[v].instances }}"
  loop_control:
    loop_var: instance_item
- name: echo command
  debug: msg="./db2 create database {{ item.name }} using pagesize {{ item.pagesize }}"
  with_items: "{{ installation[v].instances[i].databases.clm }}"
  when:  installation[v].instances[i].databases.clm  is defined
PLAY [localhost] ***************************************************************

TASK [setup] *******************************************************************
ok: [localhost]

TASK [pass version forward] ****************************************************
included: /home/user/instances.yml for localhost
included: /home/user/instances.yml for localhost

TASK [Pass instance forward] ***************************************************
included: /home/user/databases.yml for localhost

TASK [echo command] ************************************************************
ok: [localhost] => (item={u'state': u'absent', u'name': u'RQM', u'pagesize': 32768}) => {
   "item": {                                                                                                                                      
       "name": "RQM",                                                                                                                             
       "pagesize": 32768,                                                                                                                         
       "state": "absent"                                                                                                                          
   },                                                                                                                                             
   "msg": "./db2 create database RQM using pagesize 32768"                                                                                        
}                                                                                                                                                  
ok: [localhost] => (item={u'state': u'absent', u'name': u'LQE', u'pagesize': 16384}) => {
   "item": {                                                                                                                                      
       "name": "LQE",                                                                                                                             
       "pagesize": 16384,                                                                                                                         
       "state": "absent"                                                                                                                          
   },                                                                                                                                             
   "msg": "./db2 create database LQE using pagesize 16384"                                                                                        
}                                                                                                                                                  

TASK [Pass instance forward] ***************************************************
included: /home/user/databases.yml for localhost
included: /home/user/databases.yml for localhost

TASK [echo command] ************************************************************
ok: [localhost] => (item={u'state': u'present', u'name': u'JTS', u'pagesize': 32768}) => {
   "item": {                                                                                                                                      
       "name": "JTS",                                                                                                                             
       "pagesize": 32768,                                                                                                                         
       "state": "present"                                                                                                                         
   },                                                                                                                                             
   "msg": "./db2 create database JTS using pagesize 32768"                                                                                        
}                                                                                                                                                  
ok: [localhost] => (item={u'state': u'absent', u'name': u'CCM', u'pagesize': 16384}) => {
   "item": {                                                                                                                                      
       "name": "CCM",                                                                                                                             
       "pagesize": 16384,                                                                                                                         
       "state": "absent"                                                                                                                          
   },                                                                                                                                             
   "msg": "./db2 create database CCM using pagesize 16384"                                                                                        
}                                                                                                                                                  
ok: [localhost] => (item={u'state': u'absent', u'name': u'QM', u'pagesize': 32768}) => {
   "item": {                                                                                                                                      
       "name": "QM",                                                                                                                              
       "pagesize": 32768,                                                                                                                         
       "state": "absent"
   }, 
   "msg": "./db2 create database QM using pagesize 32768"
}

TASK [echo command] ************************************************************
skipping: [localhost]

PLAY RECAP *********************************************************************
localhost                  : ok=8    changed=0    unreachable=0    failed=0