Это лишний тег ansible? - PullRequest
       0

Это лишний тег ansible?

1 голос
/ 10 февраля 2020

В то время как многим может понравиться ansible, мне кажется, что это довольно противоречивые и несколько избыточные понятия, такие как tags, roles, inventory/hosts files, hostgroups, playbooks, tasks "when" conditionals Существует довольно много проблем, чтобы определить, что в конечном итоге будет выполнено. Ядро этого вопроса: tags.

Насколько я понимаю, если у меня есть книга воспроизведения, в которой есть роль, содержащая список тегов, они добавляются ( * наследуется) всеми содержащимися задачами

Пример:

[----./playbook.yml----]

---
- hosts: all
  roles: 
  - {role: role01, tags: ['tag01', 'tag02']} 
  - {role: role02, tags: ['tag01', 'tag03']}

будет означать, что все задачи, найденные в ./roles/role01/tasks/main.yml, будут неявно помечены tag01 и tag02. Подтверждение, что это будет частью ответа на этот вопрос

Аналогично, все задачи в ./roles/role02/tasks/main.yml, следовательно, помечены tag01 и tag03, верно?

Теперь проблема заключается в том, что поиск в файле ./roles/role01/tasks/main.yml я вижу это содержимое

[----./roles/role01/tasks/main.yml----]
---
- block:
  - name: "upgrade all packages"
    yum:
      name: '*'
      state: latest
  tags:
    - tag01

Учитывая, что роль исключительно когда-либо упоминается из строки ./playbook.yml, показанной выше, я не вижу, как она имеет смысл иметь tag01, так как он должен быть неявно помечен с учетом строки:

- {role: role01, tags: ['tag01', 'tag02']}

Также меня совершенно беспокоит, что другая концепция ansible block имела для использования здесь?

Аспекты к вопросу:

  1. Была ли пометка в роли main.yml излишней?
  2. Зачем использовать блок (учитывая, что есть в любом случае это только одна задача)?

1 Ответ

0 голосов
/ 10 февраля 2020

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. Тест 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   
   
  1. Тест 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...