Oleg
чтобы не переписывать все плейбуки начисто, а добавить циклы чтобы перебирались элементы массива
George
смотри
George
если речь про переменные, которые известны на момент старта плейбука (инвентори и пр) - ты можешь сформировать db_name прямо сразу
George
если у тебя переменные меняются в процессе выполнения плейбука, то да, ты прав, нужно передавать их имена, а потом их разворачивать
George
тогда прямо изначально жахни лукапом
George
прямо в варс можно жахнуть что-то типа prometheus_targets: node: - targets: "{{ groups['project-a'] | map('extract', hostvars, ['ansible_host']) | map('regex_replace', '$', ':9100') | list }}"
George
и там любые словари, списки и прочее Подобрать правильную комбинацию с фильтрами - дело на час.
Alex
Это понятно, просто может кто-то compose собирает и потом запускает может еще какие-то кейсы
например для миграций компоуз использую с сохранинением какой либо информации на хост машину (с монтированием томов) - но билд и запуск docker_container
George
> билд и запуск docker_container серьезно? для билда?
Dok
Привет всем. Подскажите, как запустить /usr/bin/ansible -m include_role -a name=tratata так, чтобы он забирал факты и позволял с ними работать условиям в указанной роли?
Dok
Пробовал ansible 1.1.1.1 -m setup -m include_role -a name=tratata не то
Anonymous
Вопрос про структуре директорий ansible репозитория. Я правильно понимаю, что могу сделать каталог group_vars/all/ и внутри него уже сколько угодно .yml складывать и они будут доступны для всех из этого инвентори?
Ivan
Привет! А никто не делал delegated driver для molecule чтобы из терраформа Яндексовского? У меня печаль, не могу молекулу заставить ходить на хост
Anonymous
да
Благодарю. А-то all.yml уж очень большим становится
George
точнее не совсем - они внутри ансибла мержатся. И если у тебя одна переменная будет установлена в нескольких файлах, то будет УПС
George
скорее всего установится то значение, которое было в файле с последним лексикографически именем
Vitaliy
Парни, я так понял в loop дополнительно flatten(1) нужен когда у нас список в переменной из нескольких параметров? Переход с with_items на loop в таске с установкой пакетов без проблем, а в других случаях требуется указать не просто loop, а примерно так: loop: "{{ postgresql_databases | flatten(1) }}"
George
видимо, да, похоже
George
но меня смущает - postgresql_databases - у тебя как фактически выглядит? может тебе тупо отселектить каждый второй элемент надо на самом деле
Oleg
Массив (сиречь словарь) или список?
предопределенный список значений - host и имя базы вида { host: host1, dbhost, blablahost ; name: onename, nametwo, anothername } ну как то так)
Timur
Что за переменная вам нужна и для чего именно?
Oleg
Что за переменная вам нужна и для чего именно?
есть куча плейбуков где например осуществляюся операции с "{{ db_name }}" сейчас в инвентори db_name=однабаза , надо в инвентори в качестве db_name указать несколько баз, и в плейбуках по циклу осуществлять с ними операции
Vitaliy
но меня смущает - postgresql_databases - у тебя как фактически выглядит? может тебе тупо отселектить каждый второй элемент надо на самом деле
postgresql_databases: - { db: "mydatabase", encoding: "UTF8", lc_collate: "ru_RU.UTF-8", lc_ctype: "ru_RU.UTF-8", owner: "mydb-user" } # - { db: "", encoding: "UTF8", lc_collate: "en_US.UTF-8", lc_ctype: "en_US.UTF-8", owner: "" }
Vitaliy
это пример
George
Массив (сиречь словарь) или список?
С каких это пор словари стали массивами и наоборот ? 😳😳😳
Vitaliy
| selectattr('db') вроде как нужен, а потом | list
зачем? работает ведь уже. С with_items как то попроще.
Vitaliy
with_items фу? Оф дока пока не говорит что это плохо.
Vitaliy
Я то with_items убиру, чтобы коллеги не фу в мою сторону)) просто усложнение какое-то с первого взгляда с эти loop.
George
Я то with_items убиру, чтобы коллеги не фу в мою сторону)) просто усложнение какое-то с первого взгляда с эти loop.
На самом деле нет - ты четко пишешь, что селектишь ключ db из каждого элемента листа и делаешь из них лист
George
А с with_items... Ну, жди, пока его депрекейтнут
Vitaliy
там не только db
George
там не только db
Эти элементы тебе нужны ?
Vitaliy
# (optional) list of users to be created (if not already exists) postgresql_users: [] # - { name: "mydb-user", password: "mydb-user-pass" } # - { name: "", password: "" } # - { name: "", password: "" } # - { name: "", password: "" } # (optional) list of databases to be created (if not already exists) postgresql_databases: [] # - { db: "mydatabase", encoding: "UTF8", lc_collate: "ru_RU.UTF-8", lc_ctype: "ru_RU.UTF-8", owner: "mydb-user" } # - { db: "", encoding: "UTF8", lc_collate: "en_US.UTF-8", lc_ctype: "en_US.UTF-8", owner: "" } # - { db: "", encoding: "UTF8", lc_collate: "en_US.UTF-8", lc_ctype: "en_US.UTF-8", owner: "" } # (optional) list of database extensions to be created (if not already exists) postgresql_extensions: [] # - { ext: "pg_stat_statements", db: "postgres" } # - { ext: "pg_stat_statements", db: "mydatabase" } # - { ext: "pg_stat_statements", db: "" } # - { ext: "pg_stat_statements", db: "" } и т.п.
Vitaliy
Эти элементы тебе нужны ?
нужны. Таск отработал, БД создана с нужным именем и параметрами.
George
Кажется понимаю, что ты имеешь в виду
Vitaliy
Просто сначала я делал в чистом виде loop, без flatten(1). Была ошибка, а теперь норм.
George
Но dict - это далеко не массив. Скорее лист - массив, чем дикт
George
Просто сначала я делал в чистом виде loop, без flatten(1). Была ошибка, а теперь норм.
Вообще странно, потому что [{A:A},{A:B},{A:C}] эквивалентно - {A:A} - {A:B} - {A:C}
George
Но как будто где-то вложенный список появился (или наоборот )
Vitaliy
ну видимо я пока не до конца понял loop. Таск отработал корректно, хотя Вы говорите что это странно. Почитаю доку ещё раз.
Vitaliy
С with_items фу, но работает без вопросов. Странно почему фу.
Vitaliy
Меня тоже. Но без него не пашет. TASK [PostgreSQL databases | make sure the PostgreSQL databases are present] ********************************************************************************************************************************** fatal: [10.128.64.143]: FAILED! => {"msg": "The task includes an option with an undefined variable. The error was: 'list object' has no attribute 'db'\n\nThe error appears to be in '/root/postgresql_cluster/tasks/postgresql-databases.yml': line 3, column 3, but may\nbe elsewhere in the file depending on the exact syntax problem.\n\nThe offending line appears to be:\n\n\n- name: PostgreSQL databases | make sure the PostgreSQL databases are present\n ^ here\n"}
Vitaliy
С ним - ок: TASK [PostgreSQL databases | make sure the PostgreSQL databases are present] ********************************************************************************************************************************** changed: [10.128.64.143] => (item={u'owner': u'mydb-user', u'lc_collate': u'ru_RU.UTF-8', u'db': u'mydatabase', u'lc_ctype': u'ru_RU.UTF-8', u'encoding': u'UTF8'})
Vitaliy
не то отправил, сек
Vitaliy
поправил
Vitaliy
Я руководствовался этим https://docs.ansible.com/ansible/latest/user_guide/playbooks_loops.html#with-items
Vitaliy
спасибо за обратную связь
Vitaliy
Вот такие вот простые списки без проблем: loop: - /etc/haproxy - /var/run/haproxy - /var/lib/haproxy/dev А пример выше уже сложнее.
George
George
Вот и ответ в общем-то. with_items сам делает flatten внутри себя.
Vitaliy
Вот и ответ в общем-то. with_items сам делает flatten внутри себя.
т.е. теперь пихать его везде, где не простой список.
Vitaliy
Иначе ... l | Setting Kernel Parameters] ********************************************************************************************************************************************************************* fatal: [10.128.64.143]: FAILED! => {"msg": "The task includes an option with an undefined variable. The error was: 'list object' has no attribute 'name'\n\nThe error appears to be in '/root/postgresql_cluster/tasks/sysctl.yml': line 3, column 3, but may\nbe elsewhere in the file depending on the exact syntax problem.\n\nThe offending line appears to be:\n\n\n- name: sysctl | Setting Kernel Parameters\n ^ here\n"} ...ignoring
George
Это очень похоже на очередной сеанс ЯМЛ магии + особенности структур данных Python, который под капотом ансибл
George
Если переформулировать: a, b, c - не тоже самое, что [a, b, c] И [a, b, c] - не тоже самое, что [[a, b, c]]
Vitaliy
ну у меня [a=value, b=value, c=value]. Почитаю еще, ну вроде я правильно понял.
Vitaliy
Еще один момент: TASK [Linux PAM limits | add or modify nofile limits for the user "postgres"] ********************************************************************************************************************************* changed: [10.128.64.143] => (item={u'limit_item': u'nofile', u'limit_type': u'soft', u'value': 65536}) changed: [10.128.64.143] => (item={u'limit_item': u'nofile', u'limit_type': u'hard', u'value': 200000}) из yml-а: loop: - { limit_type: 'soft', limit_item: 'nofile', value: "{{ soft_nofile }}" } - { limit_type: 'hard', limit_item: 'nofile', value: "{{ hard_nofile }}" } и работает. Т.е. когда не из переменной на уровне defaults
Vitaliy
Хотя "{{ soft_nofile }}" и "{{ hard_nofile }}" из переменных.
Vitaliy
в таком виде: soft_nofile: 65536 hard_nofile: 200000
Vitaliy
тогда обычный loop
Иван
Всем привет. Подскажите. Пользователю в sudoers разрешена только определенная команда без пароля systemctl restart apache. Как ее запустить? become все попробовал и не получилось
Иван
Как запустить sudo systemctl restart apache
Иван
Только shell модулем?
Vitaliy
become: yes become_user: myuser
George
Потому что Шелл - он через питон работает и там какая-то магия. И я почти наверняка уверен, что на сайте ансибла есть гайд как разрешить конкретное действие для конкретного юзера через судо