TL; Dr : да, действительно, в случае, описанном в вопросе (неявное тегирование на уровне роли ansible делает тегирование отдельной задачи / блока внутри роли ненужных и, следовательно, лишних ).
Более подробная информация:
Ansible, к сожалению, часто предлагает слишком сложный и искаженный синтаксис и стиль. В этом самом случае это было только ненужное дублирование тегов в сочетании с одинаково необязательным использованием синтаксического элемента block
(в ansible playbook).
Как было проверено / протестировано поведение ansible в отношении маркировки? => с оболочкой / bash sctipt:
Я прибегнул к этому сценарию оболочки, который должен проверить, как ansible tags
ведет себя по отношению к этому неявному наследованию в отношении для ролей.
Сценарий bash создаст минимальный ansible контрольный пример, который содержит две роли role1
и role2
, обе из которых являются дословными копиями, за исключением имени (чтобы можно было чтобы сообщить им об этом) и с 2 задачами:
task(A)
is not явно помечены task(B)
is явно маркированы с тэгом 'tag01'.
Необходимые ansible playbook.yml
и файл хоста / инвентаря inventory.ini
также создаются в скрипте:
#!/bin/bash
#make a temporary directory for test
TEMPDIR="$(mktemp -d)"
#change to temporary directory
cd "$TEMPDIR"
# create ansible hosts file "./inventory.ini"
# only host we need is the the local box (to be simple disregard any ssh overhead)
cat > inventory.ini <<'EOF'
[hosts]
localhost ansible_connection=local
EOF
# create ansilble role "role1"
# (to keep it simple, we have minimal role with only a tasks entry)
mkdir -p roles/role1/tasks
# (the content for the tasks/main.yml file are two tasks, with one task
# namely task(A) not being explicitly and the task(B) being explicitly
# tagged)
cat > roles/role1/tasks/main.yml <<'EOF'
---
# tasks file for role1 and role2
- name: "task(A) tagged not explicitly 'tag01'"
debug:
msg: "debug-msg: this is \"task(A) tag explicitly 'tag01'\" {{ role_name }} ."
- name: "task(B) tagged explicitly 'tag01'"
debug:
msg: "debug-msg: this is \"task(B) tagged explicitly 'tag01'\" {{ role_name }} ."
tags:
- tag01
EOF
# create ansible role "role2" as a verbatim copy of "role1"
cp -r roles/role1 roles/role2
# now create an ansible playbook that uses these two ansible roles
# (note that for the role "role1" we used "implicit tagging"
cat > playbook.yml <<'EOF'
---
- hosts: all
roles:
- role: "role1"
tags:
- "tag01"
- role: "role2"
EOF
# show the test setup
find .
# TEST 1:
# run "playbook.yml" one time "as is" ( i.e. no using of tags -> "all tasks"
# should be run)
echo "TEST1" | tee TEST1
ansible-playbook -i inventory.ini playbook.yml | tee -a TEST1
# TEST 2:
# run "playbook.yml" with --tags command line options ( meaning this time
# we limit the task to be run to only those that have the specific tag)
echo "TEST2" | tee TEST2
ansible-playbook -i inventory.ini --tags 'tag01' playbook.yml | tee -a TEST2
# TEST 3:
# run "playbook.yml" with --skip-tags command line options ( meaning this time
# we limit the task to be run all, but those to tags to be "skipped")
echo "TEST3" | tee TEST3
ansible-playbook -i inventory.ini --skip-tags 'tag01' playbook.yml | tee -a TEST3
# show path of temporary directory
echo "TEMPDIR is $TEMPDIR"
Запустив этот скрипт оболочки, он в основном дает три Результаты для
- Тест 1 "TEST1",
ansible-playbook -i inventory.ini playbook.yml
: использование тегов не используется => любые неявные или явные теги не совпадают, все задачи для обеих ролей role1
и role2
выполняются:
TEST1
PLAY [all] **************************************************************************
TASK [Gathering Facts] **************************************************************************
ok: [localhost]
TASK [role1 : task(A) tagged not explicitly 'tag01'] **************************************************************************
ok: [localhost] => {
"msg": "debug-msg: this is \"task(A) tag explicitly 'tag01'\" role1 ."
}
TASK [role1 : task(B) tagged explicitly 'tag01'] **************************************************************************
ok: [localhost] => {
"msg": "debug-msg: this is \"task(B) tagged explicitly 'tag01'\" role1 ."
}
TASK [role2 : task(A) tagged not explicitly 'tag01'] **************************************************************************
ok: [localhost] => {
"msg": "debug-msg: this is \"task(A) tag explicitly 'tag01'\" role2 ."
}
TASK [role2 : task(B) tagged explicitly 'tag01'] **************************************************************************
ok: [localhost] => {
"msg": "debug-msg: this is \"task(B) tagged explicitly 'tag01'\" role2 ."
}
PLAY RECAP **************************************************************************
localhost : ok=5 changed=0 unreachable=0 failed=0
- Тест 2 "TEST2",
ansible-playbook -i inventory.ini --tags 'tag01' playbook.yml
: теги используются => неявные и явные теги имеют значение. Так как tag01
установлен на role1
на уровне role
, то обе задачи (A) и task(B)
содержат задачи. В отличие от role2
без неявно унаследованных тегов, запускается только task(B)
. Выходные данные показывают, что:
TEST2
PLAY [all] **************************************************************************
TASK [Gathering Facts] **************************************************************************
ok: [localhost]
TASK [role1 : task(A) tagged not explicitly 'tag01'] **************************************************************************
ok: [localhost] => {
"msg": "debug-msg: this is \"task(A) tag explicitly 'tag01'\" role1 ."
}
TASK [role1 : task(B) tagged explicitly 'tag01'] **************************************************************************
ok: [localhost] => {
"msg": "debug-msg: this is \"task(B) tagged explicitly 'tag01'\" role1 ."
}
TASK [role2 : task(B) tagged explicitly 'tag01'] **************************************************************************
ok: [localhost] => {
"msg": "debug-msg: this is \"task(B) tagged explicitly 'tag01'\" role2 ."
}
PLAY RECAP **************************************************************************
localhost : ok=4 changed=0 unreachable=0 failed=0
Наконец, тест 3 «TEST3» инвертирует все с
--skip-tags
, где неявное тегирование для
role1
приводит к пропуску всей роли. Для
ansible-playbook -i inventory.ini --skip-tags 'tag01' playbook.yml
мы имеем следующий результат:
TEST3
PLAY [all] **************************************************************************
TASK [Gathering Facts] **************************************************************************
ok: [localhost]
TASK [role2 : task(A) tagged not explicitly 'tag01'] **************************************************************************
ok: [localhost] => {
"msg": "debug-msg: this is \"task(A) tag explicitly 'tag01'\" role2 ."
}
PLAY RECAP **************************************************************************
localhost : ok=2 changed=0 unreachable=0 failed=0
В заключение, и чтобы не отставать от топи c вопроса, тег для задачи, содержащейся в роли, имеет вид излишне, если этот role
(а) уже помечен в playbook
и, следовательно, неявно наследует все его задачи, и б) это единственная playbook
роль, используемая в любом случае (как это было дело тут).
Хотя выходной сигнал может быть сгенерирован путем выполнения сценария оболочки, предоставленного здесь, для удобства он выводит:
.
./playbook.yml
./roles
./roles/role2
./roles/role2/tasks
./roles/role2/tasks/main.yml
./roles/role1
./roles/role1/tasks
./roles/role1/tasks/main.yml
./inventory.ini
TEST1
PLAY [all] **************************************************************************
TASK [Gathering Facts] **************************************************************************
ok: [localhost]
TASK [role1 : task(A) tagged not explicitly 'tag01'] **************************************************************************
ok: [localhost] => {
"msg": "debug-msg: this is \"task(A) tag explicitly 'tag01'\" role1 ."
}
TASK [role1 : task(B) tagged explicitly 'tag01'] **************************************************************************
ok: [localhost] => {
"msg": "debug-msg: this is \"task(B) tagged explicitly 'tag01'\" role1 ."
}
TASK [role2 : task(A) tagged not explicitly 'tag01'] **************************************************************************
ok: [localhost] => {
"msg": "debug-msg: this is \"task(A) tag explicitly 'tag01'\" role2 ."
}
TASK [role2 : task(B) tagged explicitly 'tag01'] **************************************************************************
ok: [localhost] => {
"msg": "debug-msg: this is \"task(B) tagged explicitly 'tag01'\" role2 ."
}
PLAY RECAP **************************************************************************
localhost : ok=5 changed=0 unreachable=0 failed=0
TEST2
PLAY [all] **************************************************************************
TASK [Gathering Facts] **************************************************************************
ok: [localhost]
TASK [role1 : task(A) tagged not explicitly 'tag01'] **************************************************************************
ok: [localhost] => {
"msg": "debug-msg: this is \"task(A) tag explicitly 'tag01'\" role1 ."
}
TASK [role1 : task(B) tagged explicitly 'tag01'] **************************************************************************
ok: [localhost] => {
"msg": "debug-msg: this is \"task(B) tagged explicitly 'tag01'\" role1 ."
}
TASK [role2 : task(B) tagged explicitly 'tag01'] **************************************************************************
ok: [localhost] => {
"msg": "debug-msg: this is \"task(B) tagged explicitly 'tag01'\" role2 ."
}
PLAY RECAP **************************************************************************
localhost : ok=4 changed=0 unreachable=0 failed=0
TEST3
PLAY [all] **************************************************************************
TASK [Gathering Facts] **************************************************************************
ok: [localhost]
TASK [role2 : task(A) tagged not explicitly 'tag01'] **************************************************************************
ok: [localhost] => {
"msg": "debug-msg: this is \"task(A) tag explicitly 'tag01'\" role2 ."
}
PLAY RECAP **************************************************************************
localhost : ok=2 changed=0 unreachable=0 failed=0
TEMPDIR is /tmp/tmp.cPE6a4gGiG