2017-08-30 48 views
1

我一直在閱讀關於如何創建動態庫存的安全文檔。據我所知,我必須提供一個能夠輸出host_vars和group_vars的json。Ansible動態庫存服務概念

考慮到這一點,我將如何去擴展group_vars和host_vars概念以包含服務的定義?

從本質上說,我的「最終目標」是有東西,讓我來定義:

主機A的服務A B C,那麼這將變成相應的主機和組瓦爾。

什麼是接近最好的方法? 我一直在想可能是一個數據庫,但我不太確定如何適當地抽象服務概念。

預先感謝任何幫助

回答

3

我不能給你所有的答案,我剛開始使用Ansible四個星期前。不過,我已經成功整合了動態庫存。這是我可以分享:(推斷爲您的設置,我在RHEL店,使用6.9和7.4)

  1. 默認情況下,ansible查找您的庫存在的/ etc/ansible/hosts中找到的文件該文件的默認格式是(我相信)INI格式。 [服務器] 服務器-1 服務器2

[labhosts] labhost-1 labhost-2

[本地主機] 127.0.0.1

  1. 的/ etc/ansible/ansible.cfg將允許您根據需要重新定位庫存文件/目錄。目前,我的意見將假設沒有默認的變化

  2. 上面的例子是靜態庫存。你可以將你的/ etc/ansible/hosts文件放到一邊,然後執行:mkdir/etc/ansible/hosts/012/////ansible/hosts/hosts可以將靜態庫存文件在您的動態目錄(現在)因此,美是,你仍然可以使用靜態庫存,它只是住在/ etc/ansible/etc/< - 目錄沒有什麼特別的靜態文件名。它可以是任何名稱,但是某些字符作爲靜態文件名稱的一部分無效。

  3. 要使用動態庫存,您現在只需將放入/ etc/ansible/hosts /目錄中的可執行腳本從您的外部數據庫中提取主機名即可。 AND,這是關鍵部分,該腳本的輸出(stdout)必須以JSON格式輸出。

  4. 當你找到你的庫存文件時,它會「看到」/ etc/ansible/hosts /是一個目錄,然後在那裏尋找腳本。當您運行劇本或劇本時,它將執行腳本,並使用JSON輸出作爲您的播放的主機目標。
  5. 現在,我不是JSON專家,但是這對我有用。JSON的語法如下所示:{「GROUPNAME」:[「HOST1」,「HOST2」,「HOST3」,]}
  6. 所以整個字符串由左右花括號括起來。第一個字段是帶引號的groupname,用冒號分隔,然後是逗號分隔的引用主機列表,由左右方括號界定。

在我的環境中,我們有一個perl腳本,並根據切換參數提取主機名列表。我們最近修改了perl腳本,使用print語句生成JSON輸出。有一個JSON:perl模塊,但我們沒有發現它需要使用,因爲使用print來格式化輸出已經足夠了。至於組名,我們還從perl腳本的開關設置中「建立」了組名。

因此,使用上述我的INI庫存例如,JSON輸出將是這樣的:{「服務器」:[「服務器1」,「服務器2」,]}

注1:一個怪癖,我瞭解到,如果您只有一臺主機,則必須以逗號結尾。有一個原因,我不確定我能解釋它。當我們生成我們的JSON輸出時,無論主機的數量如何,我們都會添加一個逗號,並且它正常工作。注意2:我意識到這不是真正的JSON輸出,但它正在滿足我們的需求。

在你的劇本,你會放 - 主機:全部或 - 主機:your_group_name 我通常只是把 - 主機:所有的,然後使用限制-i選項和/或「--limit =主機名」

「-i」將您的清單縮小到靜態或動態生成列表 --limit = hostname其中「hostname」是-i輸出的子集之一。

請考慮以下命令:ansible all -m ping 這將ping您整個清單中的所有主機。靜態和動態

ansible所有-m平-i服務器 這將ping通的所有主機在您的服務器組

ansible所有-m平-i服務器--limit =服務器1 這將只是ping通一臺主機「server-1」 使用--limit =非常適合用於測試播放或劇本

當轉到劇本時,您可以在劇本中指定主機列表。 然後你只需要在命令行中根據需要添加限制。

祝你好運!