Ansible – tag’s

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 .