2015-02-10 74 views
2

我有一個主機文件看起來像使用模式來填充Ansible清單文件主機屬性

[foo] 
foox 192.168.0.1 id=1 
fooy 192.168.0.1 id=2 
fooz 192.168.0.1 id=3 

不過,我想更簡明地寫這個使用模式,如:

[foo] 
foo[x:z] 192.168.0.1 id=[1:3] 

但是,這會被解釋爲id等於「[1:3]」的原始文本,而不是1,2或3。有沒有一種方法可以在清單文件中實現此目的,還是需要通過主機執行某些操作變量和/或組變量?

回答

5

這不能在庫存文件中完成。我認爲set_fact是您以編程方式建立一個簡單清單的最佳選擇。

--- 
- hosts: all 
    tasks: 
    - add_host: 
     name: "host{{ item }}" 
     ansible_ssh_host: "127.0.0.1" 
     ansible_connection: "local" 
     group: "new" 
     id: "{{ item }}" 
     with_sequence: count=3 
     delegate_to: localhost 
     run_once: yes 
- hosts: new 
    tasks: 
    - debug: 
     msg: "{{ id }}" 

如果我沒有記錯,神社能力已經從每一個他們不應該過的地方,如在YML文件when:即外引號,括號,特殊情況下刪除。

當我以編程方式說,雖然,我們正在談論Ansible ..地球上最後的候選人之一通用腳本。動態庫存腳本是解決這些問題的更好方法,除非我們正確地談論三臺服務器。

最簡單的庫存腳本來完成,這將是(在你的hosts目錄或由-i開關指出:

#!/usr/bin/env python 
import json 
inv = {} 
for i in range(3): 
    inv[i] = {"hosts":["host%s" % i],"vars":{"id":i,"ansible_ssh_host":"127.0.0.1", "ansible_connection":"local"}} 
print json.dumps(inv) 

同樣,恐怕沒有什麼比「漂亮」爲你」重新尋找。如果你的使用情況變得更復雜,那麼set_factset_hostgroup_by可以派上用場,或庫存腳本,或group_vars(我目前使用group_vars文件服務器的數量)。

+0

因此,將主機「注入」附加到依賴它的劇本中?這似乎是一種ewww。你知道有樣品的動態庫存腳本的好資源嗎? – Shark 2015-02-10 21:40:19

+0

股票文檔在這個話題上很不錯:http://docs.ansible.com/developing_inventory.html和http://docs.ansible.com/intro_dynamic_inventory.html。修改或解構_ec2_ one是一個好開始 – 2015-02-10 22:16:52

+0

@Shark我使用動態庫存的「hello world」進行編輯。 – 2015-02-10 22:27:47