如何在ansible中使用字典键逐个包含文件?

如何在ansible中使用字典键逐个包含文件?,ansible,jinja2,Ansible,Jinja2,我试图从ansible一个接一个地调用测试用例。每个测试用例都写在一个yml文件中 --- - hosts: localhost tasks: - set_fact: k8s_tests: san-1.yml: "Scale replica to 1" san-2.yml: "Scale replica to 2" - name: display local tests debug: var=k8s_tests - in

我试图从ansible一个接一个地调用测试用例。每个测试用例都写在一个yml文件中

---
- hosts: localhost
  tasks:

  - set_fact:
      k8s_tests: 
        san-1.yml: "Scale replica to 1"
        san-2.yml: "Scale replica to 2"

  - name: display local tests
    debug: var=k8s_tests

  - include: "{{ k8s_test_item }}"
    vars:
      local_test: "{{ k8s_test_item }}"
    with_items: "{{ k8s_tests }}"
    loop_control:
      loop_var: k8s_test_item
当我执行它时,文件的顺序是错误的。 include应该先按san-1.yml的顺序运行,然后按san-2.yml的顺序运行 但事实恰恰相反

TASK [include] *********************************************************************************
included: /root/oc310/jenkinsrun/containers/K8S/san-2.yml for localhost
included: /root/oc310/jenkinsrun/containers/K8S/san-1.yml for localhost
所以我添加了dictsort对字典进行排序

- include: "{{ k8s_test_item }}"
    vars:
      local_test: "{{ k8s_test_item }}"
    with_items: "{{ k8s_tests | dictsort }}"
    loop_control:
      loop_var: k8s_test_item 
但它试图同时包含键和值,但失败了

TASK [include] *********************************************************************************
included: /root/oc310/jenkinsrun/containers/K8S/san-1.yml for localhost
fatal: [localhost]: FAILED! => {"reason": "Could not find or access '/root/oc310/jenkinsrun/containers/K8S/Scale replica to 1' on the Ansible Controller."}
included: /root/oc310/jenkinsrun/containers/K8S/san-2.yml for localhost
fatal: [localhost]: FAILED! => {"reason": "Could not find or access '/root/oc310/jenkinsrun/containers/K8S/Scale replica to 2' on the Ansible Controller."}
- include: "{{ k8s_test_item }}"
    vars:
      local_test: "{{ k8s_test_item }}"
    with_items: "{{ k8s_tests | dictsort(false,'key') }}"
    loop_control:
      loop_var: k8s_test_item
值“将副本缩放到1”和“将副本缩放到2”不是文件,不应包括它们。我尝试按键排序,但它仍然尝试根据值包含,但失败了

TASK [include] *********************************************************************************
included: /root/oc310/jenkinsrun/containers/K8S/san-1.yml for localhost
fatal: [localhost]: FAILED! => {"reason": "Could not find or access '/root/oc310/jenkinsrun/containers/K8S/Scale replica to 1' on the Ansible Controller."}
included: /root/oc310/jenkinsrun/containers/K8S/san-2.yml for localhost
fatal: [localhost]: FAILED! => {"reason": "Could not find or access '/root/oc310/jenkinsrun/containers/K8S/Scale replica to 2' on the Ansible Controller."}
- include: "{{ k8s_test_item }}"
    vars:
      local_test: "{{ k8s_test_item }}"
    with_items: "{{ k8s_tests | dictsort(false,'key') }}"
    loop_control:
      loop_var: k8s_test_item
下面是相同的输出

TASK [include] *********************************************************************************
included: /root/oc310/jenkinsrun/containers/K8S/san-1.yml for localhost
fatal: [localhost]: FAILED! => {"reason": "Could not find or access '/root/oc310/jenkinsrun/containers/K8S/Scale replica to 1' on the Ansible Controller."}
included: /root/oc310/jenkinsrun/containers/K8S/san-2.yml for localhost
fatal: [localhost]: FAILED! => {"reason": "Could not find or access '/root/oc310/jenkinsrun/containers/K8S/Scale replica to 2' on the Ansible Controller."}

我需要把文件一个一个地整理好。如何做到这一点?

这里有一个解决方案,可以确保您的文件名总是正确排序。您需要:

将字典转换为具有 使用 结果列表 下面是一个带有调试的实现,以显示所描述的每个步骤

注:

我必须颠倒var声明中的顺序,以获得与您相同的初始结果,并进行成功的演示 loop是定义循环的新关键字,在这里等同于with_list。看见