2016-12-09 43 views
0

我想生成一個報告(可能使用模板),根據他們的事實對我的主機進行分組。如何根據Ansible事實將Ansible變成組主機?

說我在我的/etc/ansible/hosts以下服務器(ansible_distributionansible_distribution_version事實在括號中指定):

mercer (RedHat, 7.2) 
grocer (RedHat, 6.2) 
draper (Solaris, 10) 
fishmonger (RedHat, 7.2) 
goldsmith (Solaris, 11) 
skinner (RedHat, 7.2) 

我想要做的是與文件看起來像結束:

**RedHat 6.2 Servers** 
grocer 

**RedHat 7.2 Servers** 
mercer 
fishmonger 
skinner 

**Solaris 10 Servers** 
draper 

**Solaris 11 Servers** 
goldsmith 

我不知道是否會更好嘗試:

A)通過play_hosts循環並拉出將事實寫入一個新變量('fact1','fact2','hostname'),然後在我的jinja2模板中用groupby循環該新變量以生成報告。 B)將它們全部排序在一個合理的任務中,然後將一組預先分組的數組轉換爲模板,並對其進行格式化。

...我無法解決如何做。

回答

1

我會使用動態庫存腳本或group_by庫存模塊來執行此操作。現在讓我們來看看庫存模塊。這裏的一個問題是ansible_distribution_version需要歸一化爲一個適當的變量。我會用過濾器來完成。這樣

- hosts: all 
    tasks: 
    - group_by: 
     key: OSGROUP_{{ ansible_distribution_version | upper | regex_relace('(| |\.', '') }} 

正則表達式的東西可能是不正確的,但你的想法。然後你可以參考組

- hosts: OSGROUP_REDHAT72 
    tasks: 
    - debug: msg="Do RedHat 7.2 stuff to {{inventory_name}}" 
+0

這聽起來很有希望,但有沒有辦法可以循環OSGROUP_ *? 我更願意以一種非常普遍的方式編寫單個任務,而不是每個OS組都有一個任務 - 如果沒有其他任何內容,這意味着每次有新的操作系統類型進入該分區時都不需要添加新任務。 –

+0

看起來像答案是使用類似於以下內容: with_dict:groups when:'OSGROUP_'in item.key 但尚未嘗試過。 –

+0

您也可以基於此分組運行角色。請參閱https://docs.ansible.com/ansible/playbooks_roles.html#roles。您的when子句看起來像「when:inventory_hostname in groups ['OSGROUP_REDHAT72']」。然後,您可以爲您支持的每個發行版重複該行 – Petro026