Ошибка выполнения ansible воспроизведения из-за неопределенной переменной в файле include_vars - PullRequest
0 голосов
/ 09 января 2020

Ниже моя пьеса:

  tasks:
   - name: Construct File Path on Destination Server.
     include_vars:
       file: "{{ item }}"
     with_fileglob:
        - "vars/myvars.yaml"

   - name: setting_facts for BackEnd
     set_fact:
       fpath_BackEnd_APP: []
     set_fact:
       fpath_BackEnd_APP: "{{ fpath_BackEnd_APP + [ BASEPATH ~ '/' ~ vars[ (item | splitext)[1].split('.')[1] ] ~ '/' ~ item | basename ] }}"
     with_items:
       - "{{ Source_Filenames.split(',') }}"

Вот мой переменный файл:

cat vars / myvars.yaml

com: /path/to/com/folder
src: /path/to/src/folder

Приведенный ниже запуск плейбука работает нормально как и ожидалось.

ansible-playbook  /app/deploy.yml -e Source_Filenames=/app/testing_purpose.src,/app/testing_purpose.com

Однако, когда я передаю имя файла, у которого нет точки (.), т.е. без расширения файла, игра ansible не может найти переменную в myvars.yaml и ошибки как показано ниже:

ansible-playbook  /app/deploy.yml -e Source_Filenames=/app/testing_purpose.src,/app/testing_purpose,/app/testing_purpose.com,/app/testing_moht

"The task includes an option with an undefined variable. The error was: list object has no element 1\n\nThe error appears to be in '/app/deploy.yml'"

Мое требование состоит в том, чтобы выделить «/ path / to / no-ext / folder» для переменной «fpath_BackEnd_APP», если передан файл без расширения. Файлы с расширениями .com & .sr c работают нормально, так как они заменяют значение переменной из файла myvars.yml. Для любых других расширений файлов, таких как .jpg или .txt, плейбук должен падать с переменной undefined error. Любое решение будет оценено.

1 Ответ

1 голос
/ 09 января 2020

Если вы принимаете в качестве записи /toto/pipo

$ ansible localhost -m debug -a "msg={{ (item | splitext) }}" -e item=/toto/pipo
localhost | SUCCESS => {
    "msg": "('/toto/pipo', '')"
}

$ ansible localhost -m debug -a "msg={{ (item | splitext)[1] }}" -e item=/toto/pipo
localhost | SUCCESS => {
    "msg": ""
}

$ ansible localhost -m debug -a "msg={{ (item | splitext)[1].split('.') }}" -e item=/toto/pipo
localhost | SUCCESS => {
    "msg": [
        ""
    ]
}

$ ansible localhost -m debug -a "msg={{ (item | splitext)[1].split('.')[1] }}" -e item=/toto/pipo
localhost | FAILED! => {
    "msg": "The task includes an option with an undefined variable. The error was: list object has no element 1"
}

Принимая во внимание, что если вы передаете запись, содержащую расширение, например /toto/pipo.test:

$ ansible localhost -m debug -a "msg={{ (item | splitext)[1].split('.')[1] }}" -e item=/toto/pipo.test
localhost | SUCCESS => {
    "msg": "test"
}

Между тем, вы можете установить значение по умолчанию, когда само выражение не возвращает значение:

$ ansible localhost -m debug -a "msg={{ (item | splitext)[1].split('.')[1] | default('') }}" -e item=/toto/pipo
localhost | SUCCESS => {
    "msg": ""
}

...