2014-02-20 40 views
23

我有一个虚拟的怀疑,让我坚持了很长的时间。我有一个主机和变量非常平庸的清单文件:Ansible - 读库存主机和变量group_vars /所有的文件

[lb] 
10.112.84.122 

[tomcat] 
10.112.84.124 

[jboss5] 
10.112.84.122 

... 

[tests:children] 
lb 
tomcat 
jboss5 

[default:children] 
tests 

[tests:vars] 
data_base_user=NETWIN-4.3 
data_base_password=NETWIN 
data_base_encrypted_password= 
data_base_host=10.112.69.48 
data_base_port=1521 
data_base_service=ssdenwdb 
data_base_url=jdbc:oracle:thin:@10.112.69.48:1521/ssdenwdb 

的问题是,我需要访问这些主机和变量,在库存文件,从group_vars /所有的文件。

我尝试了以下几种方式来访问主机IP:

{{ lb }} 
"{{ hostvars[lb] }}" 
"{{ hostvars['lb'] }}" 
{{ hostvars[lb] }} 

要访问主机变量我想:

"{{ hostvars[tests].['data_base_host'] }}" 

他们都是错的!谁能帮我找出访问的主机和变量,而不是从剧本,但是从变量文件的最佳做法是什么?

编辑:

确定。让我们澄清一下。

问题:在变量文件中使用库存文件中声明的主机,比如说:group_vars/all。

例如:我有一个DB主机IP:10.112.83.37

库存文件:

[db] 
10.112.83.37 

在组:瓦尔/我想使用IP构建一个变量的所有文件。

group_vars /所有文件:

data_base_url=jdbc:oracle:thin:@{{ db }}:1521/ssdenwdb 

在我使用/建于group_vars变量所有文件的模板。

模板文件:

oracle_url = {{ data_base_url }} 

的问题是,在group_vars的{{ db }}变量/所有的文件不被DB主机IP取代。用户只能编辑清单文件。

+0

我不认为你可以。变量可以通过操作和模板进行访问。 我想你从这些变量生成一些配置文件?所以利用它们的地方是在模板中。 你能否解释一下为什么你需要“访问”他们group_vars.all? – leucos

+0

感谢您的回复。好吧,我想有一个中心文件,我把我需要的所有变量。清单文件只包含主机IP,其余的都在group_vars.all文件中。但其中一些变量(在group_vars.all文件中)包含某些主机的IP,这就是为什么我需要访问库存文件中主机的IP。 –

+0

为了完成说明,我的目标是让任何想要配置系统的用户只在库存文件中添加主机IP。剩下的所有其他变量都建立在group_vars.all文件中。谢谢。 –

回答

-1

如果您希望您的增值经销商下group_vars文件,只要将它们移到这里。 VARS可以在库存([:瓦尔]部分)group_varshosts_vars下在文件,而且(最重要)。

库存文件:

[lb] 
10.112.84.122 

[tomcat] 
10.112.84.124 

[jboss5] 
10.112.84.122 

... 

[tests:children] 
lb 
tomcat 
jboss5 

[default:children] 
tests 

group_vars/tests文件:

data_base_user=NETWIN-4.3 
data_base_password=NETWIN 
data_base_encrypted_password= 
data_base_host=10.112.69.48 
data_base_port=1521 
data_base_service=ssdenwdb 
data_base_url=jdbc:oracle:thin:@10.112.69.48:1521/ssdenwdb 

例如,对于你上面的例子,你可以将文件group_vars/tests在移动你的增值经销商为组tests

+0

感谢您的回复。这种做法的问题是,我需要修改两个文件(库存和组瓦尔),当我想改变,例如,一台主机的IP(记住,一个有变量组瓦尔包含主机的IP )。我的一个要求是用户只需编辑清单文件(添加主机IP)来重新配置系统或在其他环境中安装。 –

+0

Mmhh,好吧,但你的问题showned库存文件已经解决了这一点,并没有看到任何的测试:从上面的使用信息增值经销商,所以我有很难搞清楚需要什么要解决的问题,对不起:( 你可以写下你想要的结果(即使它不工作),包括一个库存文件,一个group_vars/all文件和一个小剧本(一个动作,一个模板)吗? – leucos

+0

库存文件: [dB]的 10.112.83.37 group_vars /所有data_base_url = JDBC:预言:瘦:@ {{分贝}}:1521/ssdenwdb 剧本: {{data_base_url}} 这是一个非常基本的例子,但示出了需要使用一个n库存主机位于group_vars/all中的变量中。 –

12

Jus t如果问题仍然存在, 您可以通过‘hostvars’‘group_names’‘groups’可变变量来查看可能的库存。

例子:

为了能够让组内“MYGROUP”所有服务器的IP地址,请使用以下建设:

- debug: msg="{{ hostvars[item]['ansible_eth0']['ipv4']['address'] }}" 
    with_items: 
    - "{{ groups['mygroup'] }}" 
21
- name: host 
    debug: msg="{{ item }}" 
    with_items: 
    - "{{ groups['tests'] }}" 

这段代码将给消息:

'10.112.84.122' 
'10.112.84.124' 

groups['tests']基本上返回唯一的IP地址的列表['10.112.84.122','10.112.84.124']groups['tomcat'][0]返回10.112.84.124

+1

我们可以通过它的索引如访问每个IP地址:'{{组[“LB”] [0]}}''得到作为10.112.84.122'的结果。 – syodage

20

如果您想以编程方式访问库存条目以将其包含在任务中,例如。你可以这样引用它:

{{ hostvars.tomcat }} 

这会返回一个包含与该主机相关的所有变量的结构。如果你想只是一个IP地址(或主机名),你可以参考这样的:

{{ hostvars.jboss5.ansible_ssh_host }} 

这里是您可以参考变量列表:click。此外,你可以声明一个变量并将其设置为例如在剧本中的某个步骤的结果。

- name: Change owner and group of some file 
    file: path=/tmp/my-file owner=new-owner group=new-group 
    register: chown_result 

然后,如果你在tomcat玩这个步骤中,您可以从jboss5这样访问:

- name: Print out the result of chown 
    debug: msg="{{ hostvars.tomcat.chown_result }}" 
+0

上面没有为我工作。我不得不使用'{{groups ['database'] [0]}}'获取数据库主机组的第一个IP地址。 – syodage

+2

在较新的版本ansible(2.X IIRC)它只是叫'ansible_host',而不是'ansible_ssh_host'。 – sjas

0

考虑到你前面的例子:

清单文件:

[db] 
10.112.83.37 

group_vars /全部

data_base_url=jdbc:oracle:thin:@{{ db }}:1521/ssdenwdb 

模板文件:

oracle_url = {{ data_base_url }} 

您可能要取代你的group_vars /所有

data_base_url="jdbc:oracle:thin:@{{ groups['db'][0] }}:1521/ssdenwdb" 
1

是由nixlike的例子中工作得很好。

清单:

[docker-host] 
myhost1 user=barbara 
myhost2 user=heather 

剧本:

--- 

- hosts: localhost 
    connection: local   

    tasks:  
     - name: loop debug inventory hostnames 
      debug: 
      msg: "the docker host is {{ item }}" 
      with_inventory_hostnames: docker-host 
     - name: loop debug items 
      debug: 
      msg: "the docker host is {{ hostvars[item]['user'] }}" 
      with_items: "{{ groups['docker-host'] }}" 

输出:

ansible-剧本ansible /测试/瓦尔 - 测试 - local.yml

PLAY [ localhost]


TASK [SETUP] *************************************** **************************** ok:[localhost]

TASK [loop debug inventory hostnames] ***** ************************************* ok:[localhost] =>(item = myhost2)= > { “item”:“myhost1”, “{item}”:“myhost2”, “msg”:“docker host is myhost2”} ok:[localhost] =>(item = myhost1) msg“:”码头主机是myhost1“}

TASK [循环调试项目] ************************************************* ******* ok:[localhost] =>(item = myhost1)=> { “item”:“myhost1”, “msg”:“docker host is barbara”} ok:[localhost] = >(项目= myhost2)=> { “项”: “myhost2”, “msg” 中: “的搬运工宿主是石楠”}

PLAY RECAP ************ ************************************************** *******本地主机:OK = 3 =改变可达0 = 0
失败= 0

的感谢!

相关问题