首页 > 解决方案 > 包括在剧本的第一次播放中生成的变量

问题描述

我有一本包含两个剧本的剧本:1:在本地主机上创建库存文件和变量文件2:在生成的库存上使用命令中的变量

示例剧本:

---
- name: Generating inventory and variables
  hosts: localhost
  vars_files:
     -  variables.yml  #variables file used for automating
  tasks:
      - name: Creating inventory template
        template:
             src: hosts.j2
             dest: "./inventories/{{location}}/hosts"
             mode: 0777
             force: yes
        ignore_errors: yes
        run_once: true
      - meta: refresh_inventory
      - name: Creating predefined variables from a template
        template:
             src: predefined-vars.yml.j2
             dest: "./variables/predefined-vars.yml"

- name: Setting vlan to network devices
  remote_user: Ansible
  hosts: all
  vars_files:
     -  variables.yml  #variables file used for automating.
     -  variables/predefined-vars.yml 
  tasks:
      - name: configure Junos ROUTER for vlan
        include_tasks: ./roles/juniper/tasks/add_vlan_rt.yml
        when:
          - inventory_hostname in groups['junos_routers']
          - groups['junos_routers'] | length == 1
          - location == inventory_name

这会产生未定义的变量错误(对于在第一次播放中创建的变量)。

有没有办法做到这一点?我用它来生成 router_port_name 等变量 - 变量取决于位置和专用服务器,它们在 variables.yml 中定义

非常感谢任何帮助。

谢谢

编辑:但是,我注意到这本剧本:


---
- hosts: localhost
  gather_facts: false
  name: 1
  vars_files:
  - variables.yml

  tasks:
- name: Creating predefined variables from a template
    template:
         src: predefined-vars.yml.j2
         dest: "./variables/predefined-vars.yml"

- name: Generate hosts file
  hosts: all
  vars_files:
  - variables.yml
  - ./variables/predefined-vars.yml

  tasks:
  - name: test
    debug: msg="{{ router_interface_name }}"

显示在第一次播放中创建的变量。

我看到的不同之处在于,第一个剧本在第一次剧本开始时读取剧本中使用的所有变量文件(甚至是预定义的-vars.yml <- 在第一次比赛时创建,在另一个剧本中使用)(生成库存和创建变量文件) 而第二个剧本在第一次播放时读取 variables.yml ,并且仅在第二次播放开始时读取预定义的vars.yml 。

任何想法如何使第一个剧本的行为方式相同?

标签: automationansible

解决方案


因此,我根据其他人的文档和建议找到了问题的解决方案。

我对这个问题的理解:

剧本将读取所有提供的变量(所有剧本)到缓存中以供以后使用,所以如果我将我的预定义-vars.yml 包含到 vars_files 中,那么在第一次播放更改它之后,这些更改将不会被以后的播放使用因为他们会为此使用缓存。

因此,我必须在第二次播放中创建另一个任务,它将读取(加载到缓存中)我新生成的文件(用于该播放):


      - name: Include predefined vars
        include_vars: ./variables/predefined-vars.yml
        run_once: true

希望这对你有帮助!仍然不知道为什么第二场比赛会显示变量......


推荐阅读