如何将 ansible_query 结果传递给 included_task
How to pass ansible_query results to an included_task
我想从我的 vars/main.xml 文件中的列表中提取虚拟机名称和 os 类型。我希望将虚拟机名称和 os 类型传递给包含任务文件,该文件的任务是从名为 的 vars 文件中包含 vars,然后包含一个基于 os-类型.
我可以成功提取机器名称列表及其关联的 os 类型,但我不知道如何传递它们并在包含的任务文件中引用它们。
vars/main.yml
vm_on_host:
baseserver:
- name: server1
vm:
- name: vm1
os: fedora
- name: server2
vm:
- name: vm2
os: fedora
- name: vm3
os: ubuntu
tasks/yml
- name: "Include createServer.yml"
include_tasks: createServer.yml
loop: "{{ vm_on_host | json_query(cs_query) }}"
loop_control:
loop_var: csVar
vars:
cs_query: "baseserver[?name=='server2'].vm[*].{name: name, os: os}"
tasks/createServer.yml
- name: Inside createServer.yml
debug:
msg: "Inside createServer.yml"
- name: Include vars for this server (name)
include_vars: "{{ csVar }}.name"
- name: Include tasks for this os (os)
include_vars: "{{ csVar }}.os"
结果:
TASK [masterConfig : Display name and os from server2] *************************************************************************************************
ok: [localhost] => (item=[{'name': 'vm2', 'os': 'fedora'}, {'name': 'vm3', 'os':
'ubuntu'}]) => {
"ansible_loop_var": "osVar",
"osVar": [
{
"name": "vm2",
"os": "fedora"
},
{
"name": "vm3",
"os": "ubuntu"
}
]
}
TASK [masterConfig : Include createServer.yml] *********************************************************************************************************
included: /home/jwhimpel/ansible/roles/masterConfig/tasks/createServer.yml for localhost
TASK [masterConfig : Inside createServer.yml] **********************************************************************************************************
ok: [localhost] => {
"msg": "Inside createServer.yml"
}
TASK [masterConfig : Include vars for this server (name)] **********************************************************************************************
fatal: [localhost]: FAILED! => {"ansible_facts": {}, "ansible_included_var_files": [],
"changed": false, "message": "Could not find or access '[{'name': 'vm2', 'os':
'fedora'}, {'name': 'vm3', 'os': 'ubuntu'}].name'\nSearched
in:\n\t/home/jwhimpel/ansible/roles/masterConfig/vars/[{'name': 'vm2', 'os': 'fedora'},
{'name': 'vm3', 'os':
'ubuntu'}].name\n\t/home/jwhimpel/ansible/roles/masterConfig/[{'name': 'vm2', 'os':
'fedora'}, {'name': 'vm3', 'os':
'ubuntu'}].name\n\t/home/jwhimpel/ansible/roles/masterConfig/tasks/vars/[{'name': 'vm2',
'os': 'fedora'}, {'name': 'vm3', 'os':
'ubuntu'}].name\n\t/home/jwhimpel/ansible/roles/masterConfig/tasks/[{'name': 'vm2',
'os': 'fedora'}, {'name': 'vm3', 'os':
'ubuntu'}].name\n\t/home/jwhimpel/ansible/vars/[{'name': 'vm2', 'os': 'fedora'},
{'name': 'vm3', 'os': 'ubuntu'}].name\n\t/home/jwhimpel/ansible/[{'name': 'vm2', 'os':
'fedora'}, {'name': 'vm3', 'os': 'ubuntu'}].name on the Ansible Controller.\nIf you are
using a module and expect the file to exist on the remote, see the remote_src option"}
我希望逻辑结果是:
- 从 vm2.yml
导入变量
- 执行来自fedora.yml
的任务
- 从 vm3.yml
导入变量
- 执行来自ubuntu.yml
的任务
如有任何建议,我们将不胜感激。
要更改的几件事:
- 从错误中可以看出,
json_query
正在返回一个包含两个字典的单个项目的列表,循环正在拾取该项目并将其传递给 includes 任务。展平返回的列表将直接给出可以循环的字典。
- 要包含任务,您需要使用
include_tasks
。
- 修复了对
csVar
字典中 name
和 os
属性的引用。
- 添加
.yml
扩展名以包含 .yml 文件(变量和任务)。
tasks/main.yml
- name: "Include createServer.yml"
include_tasks: createServer.yml
loop: "{{ vm_on_host | json_query(cs_query) | flatten }}"
loop_control:
loop_var: csVar
vars:
cs_query: "baseserver[?name=='server2'].vm[*].{name: name, os: os}"
tasks/createServer.yml
- name: Include vars for this server (name)
include_vars: "{{ csVar.name }}.yml"
- name: Include tasks for this os (os)
include_tasks: "{{ csVar.os }}.yml"
最后把相应的文件放到vars/
和tasks/
目录下。
vars/
├── main.yml
├── vm2.yml
└── vm3.yml
tasks/
├── createServer.yml
├── fedora.yml
├── main.yml
└── ubuntu.yml
我想从我的 vars/main.xml 文件中的列表中提取虚拟机名称和 os 类型。我希望将虚拟机名称和 os 类型传递给包含任务文件,该文件的任务是从名为
我可以成功提取机器名称列表及其关联的 os 类型,但我不知道如何传递它们并在包含的任务文件中引用它们。
vars/main.yml
vm_on_host:
baseserver:
- name: server1
vm:
- name: vm1
os: fedora
- name: server2
vm:
- name: vm2
os: fedora
- name: vm3
os: ubuntu
tasks/yml
- name: "Include createServer.yml"
include_tasks: createServer.yml
loop: "{{ vm_on_host | json_query(cs_query) }}"
loop_control:
loop_var: csVar
vars:
cs_query: "baseserver[?name=='server2'].vm[*].{name: name, os: os}"
tasks/createServer.yml
- name: Inside createServer.yml
debug:
msg: "Inside createServer.yml"
- name: Include vars for this server (name)
include_vars: "{{ csVar }}.name"
- name: Include tasks for this os (os)
include_vars: "{{ csVar }}.os"
结果:
TASK [masterConfig : Display name and os from server2] *************************************************************************************************
ok: [localhost] => (item=[{'name': 'vm2', 'os': 'fedora'}, {'name': 'vm3', 'os':
'ubuntu'}]) => {
"ansible_loop_var": "osVar",
"osVar": [
{
"name": "vm2",
"os": "fedora"
},
{
"name": "vm3",
"os": "ubuntu"
}
]
}
TASK [masterConfig : Include createServer.yml] *********************************************************************************************************
included: /home/jwhimpel/ansible/roles/masterConfig/tasks/createServer.yml for localhost
TASK [masterConfig : Inside createServer.yml] **********************************************************************************************************
ok: [localhost] => {
"msg": "Inside createServer.yml"
}
TASK [masterConfig : Include vars for this server (name)] **********************************************************************************************
fatal: [localhost]: FAILED! => {"ansible_facts": {}, "ansible_included_var_files": [],
"changed": false, "message": "Could not find or access '[{'name': 'vm2', 'os':
'fedora'}, {'name': 'vm3', 'os': 'ubuntu'}].name'\nSearched
in:\n\t/home/jwhimpel/ansible/roles/masterConfig/vars/[{'name': 'vm2', 'os': 'fedora'},
{'name': 'vm3', 'os':
'ubuntu'}].name\n\t/home/jwhimpel/ansible/roles/masterConfig/[{'name': 'vm2', 'os':
'fedora'}, {'name': 'vm3', 'os':
'ubuntu'}].name\n\t/home/jwhimpel/ansible/roles/masterConfig/tasks/vars/[{'name': 'vm2',
'os': 'fedora'}, {'name': 'vm3', 'os':
'ubuntu'}].name\n\t/home/jwhimpel/ansible/roles/masterConfig/tasks/[{'name': 'vm2',
'os': 'fedora'}, {'name': 'vm3', 'os':
'ubuntu'}].name\n\t/home/jwhimpel/ansible/vars/[{'name': 'vm2', 'os': 'fedora'},
{'name': 'vm3', 'os': 'ubuntu'}].name\n\t/home/jwhimpel/ansible/[{'name': 'vm2', 'os':
'fedora'}, {'name': 'vm3', 'os': 'ubuntu'}].name on the Ansible Controller.\nIf you are
using a module and expect the file to exist on the remote, see the remote_src option"}
我希望逻辑结果是:
- 从 vm2.yml 导入变量
- 执行来自fedora.yml 的任务
- 从 vm3.yml 导入变量
- 执行来自ubuntu.yml 的任务
如有任何建议,我们将不胜感激。
要更改的几件事:
- 从错误中可以看出,
json_query
正在返回一个包含两个字典的单个项目的列表,循环正在拾取该项目并将其传递给 includes 任务。展平返回的列表将直接给出可以循环的字典。 - 要包含任务,您需要使用
include_tasks
。 - 修复了对
csVar
字典中name
和os
属性的引用。 - 添加
.yml
扩展名以包含 .yml 文件(变量和任务)。
tasks/main.yml
- name: "Include createServer.yml"
include_tasks: createServer.yml
loop: "{{ vm_on_host | json_query(cs_query) | flatten }}"
loop_control:
loop_var: csVar
vars:
cs_query: "baseserver[?name=='server2'].vm[*].{name: name, os: os}"
tasks/createServer.yml
- name: Include vars for this server (name)
include_vars: "{{ csVar.name }}.yml"
- name: Include tasks for this os (os)
include_tasks: "{{ csVar.os }}.yml"
最后把相应的文件放到vars/
和tasks/
目录下。
vars/
├── main.yml
├── vm2.yml
└── vm3.yml
tasks/
├── createServer.yml
├── fedora.yml
├── main.yml
└── ubuntu.yml