vars_files 项中的 Ansible 未定义变量,但该变量是使用 set_fact 定义的

Ansible Undefined variable in vars_files item but the variable was defined using set_fact

我正在尝试 select 基于 Ansible 将在其上部署这些文件的机器上存在的主板版本的本地文件。

所以我的方法是使用格式为 {"" : ".yml 的字典"}。并使用此字典填充一个新变量(此处为 pcu_config),该变量最终将存储要由 ansible 使用的文件的名称。我已经达到了我的实现中所示的程度,并且在第

行出现未定义的变量错误
vars_files:
    - "{{ playbook_dir }}/pcu_config/{{ pcu_config }}"

但是正如在播放之前的输出图像中的 debug 消息中所见,pcu_config确实已定义(并且也是正确的文件名)。

- name: Find the pcu_config
  hosts: vehicle
  gather_facts : no
  vars:
    pcu_config_dict:
      VirtualBox: virtual.yml
      n1: n1.yml
      n2: n2.yml
      n3: n3.yml
      n4a: n4a.yml
      n4b: n4b.yml
      
  tasks:
        - name: Find the motherboard name
          shell: cat /sys/devices/virtual/dmi/id/board_name
          register: board_name

        - name: Find the motherboard version
          shell: cat /sys/devices/virtual/dmi/id/chassis_version
          register: board_version

        - debug:
            msg: "board_name : {{ board_name.stdout }}, board_version: {{ board_version.stdout }}, {{pcu_config_dict}} "

        - name: Assign the PCU_config file for other than n4's
          set_fact:
            pcu_config: '{{pcu_config_dict[ board_name.stdout | default("this cpu does not exist in the dict")] | default("") }}'
          when: board_name.stdout != "n4"

        - name: Assign the PCU_config file for n4
          set_fact:
            pcu_config: '{{pcu_config_dict[board_version.stdout | default("this cpu_version does not exist in the dict")] | default("") }}'
          when: board_name.stdout == "n4"


- name : Check pcu_config is available elsewhere in playbook
  hosts: vehicle
  tasks: 
    - debug:
        msg: "{{ pcu_config }}, {{ playbook_dir }}"

- name: Deploy software to vehicle
  hosts: vehicle
  vars_files:
    - "{{ playbook_dir }}/pcu_config/{{ pcu_config }}"
    - "{{ playbook_dir }}/os_config/deb-files-cache.yml"
    - "{{ playbook_dir }}/os_config/python_dep.yml"

  roles:
      - role: logger_network
        tags: base

这是我在虚拟机上 运行 这个剧本时的输出。

欢迎提出解决X或Y问题的建议。(参考@Zeitounator的评论)

这不是最好的方法,但可以使用 cacheable: yes 访问剧本中其他地方由 set_facts 设置的变量。

        - name: Assign the PCU_config file for other than n4's
          set_fact:
            pcu_config: '{{pcu_config_dict[ board_name.stdout | default("this cpu does not exist in the dict")] | default("") }}'
            cacheable: yes
          when: board_name.stdout != "n4"

        - name: Assign the PCU_config file for n4
          set_fact:
            pcu_config: '{{pcu_config_dict[board_version.stdout | default("this cpu_version does not exist in the dict")] | default("") }}'
            cacheable: yes
          when: board_name.stdout == "n4"