2016-09-16 92 views
1

我有一本我只想在RHEL 6服務器上執行的手冊。我知道我可以把Ansible只爲與某些變量相匹配的主機運行Playbook

when: ansible_distribution == "RedHat" and ansible_distribution_major_version == 6 

到整個劇本中的每一個任務,但這對我來說似乎相當低效。

是不是有辦法將整個手冊限制在這些機器上,這樣我就不必把這條線放到每一個任務中了?

我想它甚至會執行得更快,因爲它不需要檢查每個任務中的服務器是否是RedHat 6。另外,我認爲大多數性能高效的方法是將RHEL 6服務器列表放在一邊,並僅對它們執行這個操作手冊,因爲Ansible並沒有真正緩存這些信息,所以它總是需要連接到所有服務器只是爲了弄清楚他們是否是RHEL和版本6?要解決這個問題

+0

下面有一個很好的答案,但最好的方法是將庫存中的操作系統作爲組跟蹤。 – smiller171

回答

2

使用includewith_first_found

- include: "{{ include_path }}" 
    with_first_found: 
    - "{{ ansible_distribution }}.yml" 
    - "{{ ansible_os_family }}.yml" 
    - "default.yml" 
    loop_control: 
    loop_var: include_path 

更新:加入loop_var防止可能的item可變碰撞。

+1

@techraf好點,謝謝!更新了答案。 –

0

策略之一是包括與任務具體爲主要任務的文件的分發版本,像這樣的任務文件:

- include: "{{ ansible_distribution }}-{{ ansible_distribution_major_version }}.yml" 

文件tasks/RedHat-6.yml將比包含所有任務的特定對RHEL6。

當你想你的劇本失敗時,分佈不支持,你可以做這樣的事情:

- include: RedHat6.yml 
    when: ansible_distribution == "RedHat" and ansible_distribution_major_version == 6 

- fail: 
    msg: "Distribution not supported" 
    when: ansible_distribution != "RedHat" or whatever conditions you want 
+0

這是很整潔,有沒有辦法抓住「未知的分佈」,這樣ansible不會產生某種類型的文件沒有發現運行時錯誤和失敗的一切? – Petr

+0

也許是這樣的:' - 包括:unknown_distribution.yml:not {{ansible_distribution}}被定義。但是我不確定Ansible在未能確定分配時會返回什麼。 –