Tagi w ansiblu to oznakowanie task tak aby był wykonywany w całego playbooka lub roli. A teraz kilka zdań na temat pewnych ograniczeń.
Ogólna struktura plików:
[vagrant@ansible-master test_tags]$ tree .
.
├── roles
│ └── test_import
│ └── tasks
│ ├── import_tasks.yml
│ ├── include_tasks.yml
│ ├── include.yml
│ └── main.yml
└── test_tags.yml
Do testowania wybrałem : include, include_tasks ,import_tasks każdy ma inną nazwę tagu który znajduje się w roli test_import:
#file ./test_tags.yml
– hosts: localhost
roles:
– test_import
#file ./roles/test_import/tasks/main.yml
– include: include.yml
– include_tasks: include_tasks.yml
– import_tasks: import_tasks.yml
#file ./roles/test_import/tasks/include.yml
– name: Include role
debug:
msg: „Inside include role”
tags:
– test_tags2
#file ./roles/test_import/tasks/import_tasks.yml
– name: Import tasks role
debug:
msg: „Inside import tasks role”
tags:
– test_tags3
#file ./roles/test_import/tasks/include_tasks.yml
– name: Include tasks role
debug:
msg: „Inside include tasks role”
tags:
– test_tags1
Wylistowanie dostępnych tagów:
[vagrant@ansible-master test_tags]$ ansible-playbook -i localhost, test_tags.yml –list-tags
playbook: test_tags.yml
play #1 (localhost): localhost TAGS: []
TASK TAGS: [test_tags2, test_tags3]
Teraz wywołuję playbook z tagami wszystkimi:
[vagrant@ansible-master test_tags]$ ansible-playbook -i localhost, test_tags.yml -t test_tags1,test_tags2,test_tags3
PLAY [localhost] **************************************************************************
TASK [Gathering Facts] **************************************************************************
ok: [localhost]
TASK [test_import : Include role] **************************************************************************
ok: [localhost] => {
„msg”: „Inside include role”
}
TASK [test_import : Import tasks role] **************************************************************************
ok: [localhost] => {
„msg”: „Inside import tasks role”
}
Widać że brakuje include_tasks, a to dlatego że include* jest dynamicznie ładowany, w momencie jak chcemy wykonać, jak i brak jego podczas listowania dostępnych tagów. Sam include się wykonał. Dodatkowo trzeba pamiętać że jeżeli zastosujemy import lub import_tasks to nie może być w nazwie pliku zmiennej np:.
…
– import_tasks: „{{ app_name }}_change.yml”
…
gdyż jest próba zaciągnięcia podczas uruchomiania – podejście statyczne, a ta wartość jest nieoznaczona. Obejście można podać jako parametr: ansible-playbook …. -e ”app_name=new_app” ale wtedy wykona się tylko dla new_app_change.yml. Można także dodać do vars w roli czyli: /../roles/rola_name/vars/main.yml jednak tak samo jak w poprzednim podejściu wykona się tylko jako new_app .