나는 이것이 너무 교묘하게 시도하고 실패한다고 생각하지만 - 특히 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
IMHO에는 "플레이북에 어떤 태그가 설정되어 있는지 확인"하는 변수가 없습니다. 거기 엔 오직ansible_run_tags그리고ansible_skip_tags. 유일한 옵션은 제공된 태그가 플레이북에 있는지 확인하기 위해 ansible-playbook 래퍼를 작성하는 것입니다("먼저 검사 모드에서 실행하고 출력을 수동으로 구문 분석").
그런데. 다음은 완료된 역할의 단순화된 목록입니다.
completed_roles: "{{ completed_roles|default('') }} {{ this_role }}"
"무슨 일이 일어나고 있는 것처럼 보이게 하는 사후 작업과 마찬가지로 사전 작업이 실행되는" 것을 방지하려면 다음을 사용하는 것이 좋습니다.import_roles그리고언제태그 대신 조건. 아래는 role3.yml과 role4.yml이 메시지만 출력하는 예입니다.
play.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"