LINUX.ORG.RU

Ansible и Python - как написать условие наличия элемента в списке внутри списка?

 , , ,


0

1

В конфигурации Ansible сделан такой список Git-репозитариев:

gitRepos:
- [ "twp.git",                   "master",    "twp",                   "twp.pro" ]
- [ "impulse.git",               "radioline", "calc_impulse",          "impulse.pro" ]
- [ "doxygen_documentation.git", "master",    "doxygen_documentation", "" ]

Как видно, это список (из трех элементов), состоящий из списков (из четырех элементов). На самом деле, список гораздо больше, около 50 записей.

В процессе работы список Git-репозитариев может меняться: в нем постоянно добавляются и удаляются различные строки.

Мне нужно написать такую задачу (task), которая должна проверить наличие строки «doxygen_documentation» в третьем столбце переменной gitRepos, и если такового ни в одной строке нет, завершить работу плейбука:
  - name: Проверка наличия Git-репозитария doxygen_documentation в списке обрабатываемых
    fail: msg="Не подключен репозитарий doxygen_documentation в all.yml"
    when: "<тут какое-то условие проверки gitRepos>"

К сожалению, я не владею Ansible/Питоном настолько, чтобы придумать как сделать такое условие. Как оно должно выглядеть?

★★★★★

А формат списка в списке вы сами задаёте или это что-то неизменное? Может лучше словари в списке?

LeNiN ★★
()
Ответ на: комментарий от vvn_black

а если там будет false?

чтобы придумать как сделать такое условие

x = ‘doxygen_documentation’ in gitRepos[2]
if not x:
    твой говнокод тута
anonymous
()
Ответ на: комментарий от vvn_black

len(list(filter(lambda x: 'doxygen_documentation' == x[2], gitRepos))) > 0

Блин, тут еще оказывается надо извратиться, чтобы засунуть условие в Ansible.

В плейбуке:

  - name: Проверка наличия Git-репозитария doxygen_documentation в списке обрабатываемых
    fail: msg="Не подключен репозитарий doxygen_documentation в all.yml"
    when: "len(list(filter(lambda x: 'doxygen_documentation' == x[2], gitRepos))) == 0"

Ошибка:
fatal: [docGeneratorHost]: FAILED! => 
{"msg": "The conditional check 'len(list(filter(lambda x: 'doxygen_documentation' == x[2], gitRepos))) == 0' failed. 
The error was: template error while templating string: expected token ',', got 'x'.
 
String: {% if len(list(filter(lambda x: 'doxygen_documentation' == x[2], gitRepos))) == 0 %} True {% else %} False {% endif %}

The error appears to be in 'gitRepos.plb.yml': line 8, column 5, but may
be elsewhere in the file depending on the exact syntax problem.
The offending line appears to be:
  - name: Проверка наличия Git-репозитария doxygen_documentation в списке обрабатываемых
    ^ here
"}

Xintrea ★★★★★
() автор топика
Последнее исправление: Xintrea (всего исправлений: 1)
Ответ на: комментарий от Xintrea

any(['doxygen_documentation' == x[2] for x in gitRepos])

Да и без лямбды тоже вариант не катит, этот jinja2 похоже имеет свой for, и пытается парсить выражение вместо того чтоб его просто выполнить.

Xintrea ★★★★★
() автор топика
Ответ на: комментарий от xelk

when: '«doxygen_documentation» in «{{gitRepos}}»'

gitRepos - это список списков, посему так не сработает.

Xintrea ★★★★★
() автор топика
- name: Проверка наличия Git-репозитария doxygen_documentation в списке обрабатываемых
  fail: msg="Не подключен репозитарий doxygen_documentation в all.yml"
  when: '"doxygen_documentation" not in gitRepos | map(attribute=2) | list'
spirit ★★★★★
()
Последнее исправление: spirit (всего исправлений: 1)

еще так можно

when: "'doxygen_documentation' not in gitRepos | json_query('[*][2]')"

json_query возможно потребует доустановки модуля jmespath

CaHbl4
()
Последнее исправление: CaHbl4 (всего исправлений: 2)
Ответ на: комментарий от spirit

Сделал по-тупому:

  - name: Получение результата проверки наличия репозитария doxygen_documentation
    shell: |
      echo "print any(['doxygen_documentation' == x[{{ gitTable_DirectoryName }}] for x in {{gitRepos}}])" | python
    register: result
    
  - name: Проверка наличия Git-репозитария doxygen_documentation в списке обрабатываемых
    fail: msg="Не подключен репозитарий doxygen_documentation в all.yml"
    when: "result.stdout_lines[0]=='False'"

Xintrea ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.