动态ansible host_vars

时间:2018-05-11 13:44:49

标签: ansible

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

[服务器]
server1的
服务器2
服务器3

我有一个global_var,它指定了我的安装平台类型,如下所示: 平台:培训

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

根据平台和主机名的值,我的tomcat安装路径会有所不同,所以我不能只有:

host_vars / server1.yml
tomcat_path:/ somepath1
host_vars / server2.yml
tomcat_path:/ somepath2
host_vars / server3.yml
tomcat_path:/ somepath3

我也想做一些类似的事情:

server1.yml
tomcat_path:/ somepath1
何时:“{{platform}} == training”
tomcat_path:/ somepath2
何时:“{{platform}} == production”
tomcat_path:/ somepath3
何时:“{{platform}} == development”

你如何处理这样的案件?

2 个答案:

答案 0 :(得分:0)

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

检查以下示例(使用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变量声明并对其进行更改以满足您的需求。

答案 1 :(得分:0)

您可以使用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, ...