Ansible:在執行劇本之前檢查提供的標籤是否有效

Ansible:在執行劇本之前檢查提供的標籤是否有效

我懷疑這太聰明了(並且失敗了),但是 - 特別是在 PB 的開發中,使用標籤來限制運行的角色確實很有用 - 例如我們有:(劇本的片段) ...

 - { role: yum,      tags: [ 'yum' ] }
 - { role: proxy,    tags: [ 'proxy' ]  }
 - { role: firewall, tags: [ 'firewall' ] }

現在偶爾,我會帶著拼寫錯誤的標籤運行 - 例如

$ ansible-playbook servername, user=fred  my_playbook --tags=firewal

前置任務和後置任務都會運行,這使得看起來正在發生某些事情,但當然,沒有任務與錯誤輸入的標籤相符。我確實在日誌記錄中註意到了這一點(每個角色都是這樣做的:

- include_tasks: includes/log_role_completion.yml this_role={{ role_name }}

這解決了這個問題:

- name: "Setup completed_roles list"
  set_fact:
    completed_roles: "{{ this_role }}"
  changed_when: false
  when: completed_roles is not defined

- name: "Add role to list of completed roles"
  set_fact:
    completed_roles: "{{ completed_roles }} {{ this_role }}"
  changed_when: false
  when: completed_roles != this_role

然後,post_tasks 角色寫入已完成角色的清單 - 或一條訊息,指出可能由於標籤拼寫錯誤而沒有運行任何角色。這工作得很好 - 我知道 ansible 會寫入日誌,但它們要么冗長,要么神秘,而且我喜歡在目標上有 /var/log/ansible ,如下所示:

Ansible version 2.6.2 run commenced at 2018-08-31: 20:23:40 GMT using account vmw-user
Ansible version 2.6.2 run completed at 2018-08-31: 20:23:40 GMT for roles chrony, proxy, and log_complete

這確實很有用,但是(最後是問題)我寧願讓劇本檢查是否提供了與劇本中使用的任何標籤都不匹配的標籤,然後停止 - 從而警告我我拼錯了一些東西。這還可以防止劇本不完全運行 - 帶有拼字錯誤標籤的角色根本不會運行,這可能會導致問題。

變數 vars.ansible_run_tags 包含使用者提供的標籤:是否有某種方法可以查看劇本中設定了哪些標籤?我不想首先在檢查模式下運行,然後手動解析輸出 - 我希望它是自動的。

答案1

恕我直言,沒有這樣的變數來「查看劇本中設定了哪些標籤」。只有ansible_run_tagsansible_skip_tags。恐怕唯一的選擇是編寫一個 ansible-playbook 包裝器來檢查提供的標籤是否存在於劇本中(「首先在檢查模式下運行,然後手動解析輸出」)。

順便提一句。以下是已完成角色的簡化列表

completed_roles: "{{ completed_roles|default('') }} {{ this_role }}"

為了避免“前置任務運行,後置任務運行,這使得看起來正在發生某些事情”,您可能需要使用導入角色什麼時候條件而不是標籤。下面是一個範例,其中 role3.yml 和 role4.yml 僅列印訊息。

播放.yml

- hosts:
    - localhost
  tasks:
    - import_role: name=role3
      when: selector|default('') in [ 'role3', 'all_roles' ]
    - import_role: name=role4
      when: selector|default('') in [ 'role4', 'all_roles' ]

> ansible-playbook -e selector=role4 play.yml | grep msg
    "msg": "role4"

> ansible-playbook -e selector=all_roles play.yml | grep msg
    "msg": "role3"
    "msg": "role4"

相關內容