【问题标题】:Ansible variables between playbooks剧本之间的 Ansible 变量
【发布时间】:2018-12-05 23:39:36
【问题描述】:

我正在尝试构建一个工作流,其中第一个 playbook 在 Windows 主机上运行,​​设置一些变量,其中包含正在执行的所有主机名。第二个剧本应该读取这个变量并在 Unix 中使用 windows 主机名创建一个目录。

在第一个剧本中尝试使用set_stats,但变量正在与所有主机名连接,并且在 Unix 上使用大字符串创建了一个目录。

实现此目的的任何解决方法或建议。

Playbook 在 Windows 上运行

- name: set hostname in a variable  
  set_stats:  
      data:  
        current_hostname: "{{ ansible_hostname }}"  
      per_host: no  

Playbook 在 Unix 上运行:

- name: Creates UNIX directory  
  file:  
    path: "{{ ARCH_DIR_LOC + current_hostname + '/'}}"  
    state: directory  
    mode: 0777  

【问题讨论】:

    标签: windows unix statistics ansible set


    【解决方案1】:

    没有办法在 Ansible 运行之间保留变量。但是有一个技巧:你可以将变量保存到 yaml/json 文件中(在本地主机上),然后使用include_vars 来加载它们。

    保存:

    - copy:
        content: '{{ my_variable|to_json }}'
        dest: foo.json
      delegate_to: localhost
    

    正在加载:

    - include_vars:
        file: foo.json
    

    【讨论】:

    • 谢谢乔治。仍然尝试使用相同的方法,因为工作流可以同时为不同的组并发运行,这取决于本地文件,在这些并发执行期间可能会出现问题。 set_stats 有助于拥有持久变量,但唯一的问题是处理多个值。如果 set_stats 或任何其他模块可以创建具有复杂数据结构(如数组或列表)的全局变量,将有助于在第二个剧本中系统地打破它以完成任务。
    • 您可以为这些变量使用不同的名称,并且可以在播放级别使用带有serial:1 的“关键部分”(一次一个主机)。
    • 您应该将变量保存到虚拟主机的事实中,然后跨剧本访问。例如在 SO 中搜索
    【解决方案2】:

    我能够编写如下脚本并为我工作:

      vars:  
        win_host_names: []  
      tasks:  
      - name: prepare list  
        set_fact:  
          win_host_names: "{{ win_host_names }} + [ '{{ ansible_facts.hostname }}' ]"  
    
      - name: set stats 
        set_stats:  
            data:  
              current_hostname_list: "{{ win_host_names }}"  
            per_host: no  
    

    【讨论】:

    • 为什么这个解决方案被接受?答案在同一游戏中的任务之间传递变量。我不认为这回答了这个问题。其实我看到问的人也回答了。
    猜你喜欢
    • 1970-01-01
    • 2015-07-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多