Logging

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

  • September 1, 2018

我懷疑這是試圖太聰明(並且失敗),但是 - 特別是在開發 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 包含使用者提供的標籤:是否有某種方法可以查看在劇本中設置了哪些標籤?我不想先在檢查模式下執行,然後手動解析輸出——我希望它是自動的。

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

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

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

為避免“執行前任務,執行後任務,這使得似乎正在發生某些事情”,您可能需要使用import_roleswhen條件而不是標籤。下面是一個範例,其中 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"

引用自:https://serverfault.com/questions/928861