如何将 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"}

我希望逻辑结果是:

  1. 从 vm2.yml
  2. 导入变量
  3. 执行来自fedora.yml
  4. 的任务
  5. 从 vm3.yml
  6. 导入变量
  7. 执行来自ubuntu.yml
  8. 的任务

如有任何建议,我们将不胜感激。

要更改的几件事:

  • 从错误中可以看出,json_query 正在返回一个包含两个字典的单个项目的列表,循环正在拾取该项目并将其传递给 includes 任务。展平返回的列表将直接给出可以循环的字典。
  • 要包含任务,您需要使用include_tasks
  • 修复了对 csVar 字典中 nameos 属性的引用。
  • 添加 .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