代码之家  ›  专栏  ›  技术社区  ›  gshepherd7

动态ansible host\u vars

  •  2
  • gshepherd7  · 技术社区  · 6 年前

    我有一个剧本的用例,其中tomcat的安装路径根据主机名和变量的值而改变。不知道该如何处理。例如,我有以下清单:

    [服务器]
    服务器1
    服务器2
    服务器3

    我有一个global\u var,用于指定安装的平台类型,如下所示: 平台:培训

    我的平台变量可以设置为培训、生产、开发

    根据平台值和主机名,我的tomcat安装路径将不同,因此我不能只拥有:

    host\u vars/server1。yml公司
    tomcat\u路径:/somepath1
    host\u vars/server2。yml公司
    tomcat\u路径:/somepath2
    host\u vars/server3。yml公司
    tomcat\u路径:/somepath3

    我也希望做一些类似的事情:

    服务器1。yml公司
    tomcat\u路径:/somepath1
    当:“{{平台}}}==培训”
    tomcat\u路径:/somepath2
    当:“{{平台}}}==生产”
    tomcat\u路径:/somepath3
    当:“{{平台}}}==开发”

    你如何在ansible处理这样的案件?

    2 回复  |  直到 6 年前
        1
  •  0
  •   ilias-sp    6 年前

    您可以在字典变量中定义所有可能的platform-tomcat\u路径选项,然后通过多种方式选择所需的组合。

    检查以下示例(使用3种不同的方式引用变量):

    - hosts: localhost
      gather_facts: false
      vars:
        tomcat_path: { training: /somepath1, production: /somepath2, development: /somepath3 }
        your_selected_mode: development
    
    
      tasks:
    
      - name: print
        debug:
          var: tomcat_path.training
    
      - name: print
        debug:
          var: tomcat_path['production']
    
      - name: print
        debug:
          var: tomcat_path.{{your_selected_mode}}
    

    您可以使用 your_selected_mode 选择所需的模式。

    输出:

    TASK [print] ********************************************************************************************************************************************************************************************************
    ok: [localhost] => {
        "tomcat_path.training": "/somepath1"
    }
    
    TASK [print] ********************************************************************************************************************************************************************************************************
    ok: [localhost] => {
        "tomcat_path['production']": "/somepath2"
    }
    
    TASK [print] ********************************************************************************************************************************************************************************************************
    ok: [localhost] => {
        "tomcat_path.development": "/somepath3"
    }
    

    如果需要根据主机对其进行进一步自定义,您可以使用 tomcat_path 中的变量声明 host_vars 归档并更改它以满足您的需要。

        2
  •  0
  •   kortef    6 年前

    你可以使用 conditional imports 但它要求每个主机和平台都有一个变量文件:

    - hosts: localhost
      connection: local
      vars_files:
       - "vars/{{ inventory_hostname }}_{{ platform }}.yml"
      tasks:
       - name: echo path
         debug: msg="Tomcat path is {{ tomcat_path }}"
    

    您需要定义变量文件 vars/server1_training.yml, vars/server2_training.yml, vars/server3_training.yml, vars/server1_production.yml, ...