Dr. L.S.Dee
так бывает когда сначала была русская потом поставили языковой пакет и поменяли дефолтный язык
Ненене. Суть не в этом. Суть в том, что модуль на скрине в принципе не работает на локализованной версии. Он парсит шаблоны, включая не только значения (OID, ver.Major,Minor), но и имена, а имена в регулярке указаны в англ. версии только. По-хорошему следует либо парсить только культуронезависимую часть, либо выноситьтакие вещи в 'localized_data' (папочки 'en-US', 'ru-RU' etc.). Сейчас же использование этого модуля на локализованной системе приведет к генерации запросов на выпуск нового серта с указанным сабжем по указанному шаблону, даже если такой серт уже есть в системе, валиден и не грозит истечь завтра, каждые полчаса-час. Ладно, если это чистый вебсервер, ему локализация не нужна. А если терминальник? На котором, от бедности, еще и роль веб-морды RDS?
Dr. L.S.Dee
Хм, все же лучше сократить до Ansible ==> PoSh ==> подсунуть конфиг.
Sergey
То есть в данном случае Ansible ==> PoSh ==> Python ==> CLI, получается?
Я акцент делал на другом: нету никакого проброса живого stdin. Совсем.
Dr. L.S.Dee
Я акцент делал на другом: нету никакого проброса живого stdin. Совсем.
А. А откуда тогда, со слов Андрея, запрашивается пароль?
Dr. L.S.Dee
я думаю что проблема именно в этом
Ну тогда да, получается. Запрашиваться-то данные запрашиваются, но никуда не уходят.
George
авто-магией?
Sergey
А. А откуда тогда, со слов Андрея, запрашивается пароль?
Да ниоткуда. Вот он и не запрашивается 😊))))
Dr. L.S.Dee
Можно передавать их объектом прямо в этой задаче, наверное. Или читать откуда-то еще. В идеале из специального хранилища, но можно и тупо из файла для начала. Главное, потом не забыть, что файл был только "для начала".
Sergey
Можно передавать их объектом прямо в этой задаче, наверное. Или читать откуда-то еще. В идеале из специального хранилища, но можно и тупо из файла для начала. Главное, потом не забыть, что файл был только "для начала".
Да какая разница, тут сам концепт выполнения этой штуки ансиблом некорректен. Там же что-то надо странное запустить, куда локальный пользователь забьёт свои креды.
Dr. L.S.Dee
Да какая разница, тут сам концепт выполнения этой штуки ансиблом некорректен. Там же что-то надо странное запустить, куда локальный пользователь забьёт свои креды.
Там нужно создать и настроить экземплр сервиса от имени конкретного пользователя, чьи креды известны. Вариант эмулировать ввод их в CLI лишь один из возможных.
Dr. L.S.Dee
Даже два пользователя. Администратор (от которого работает скрипт) создает сервис, а потом читаются креды второго пользователя, который должен сервис настроить.
Alexander
Подскажите, можно ли так составлять плейбук? https://pastebin.com/zSQE7rbL Возможности проверить, к сожалению, нет
Dr. L.S.Dee
Даже два пользователя. Администратор (от которого работает скрипт) создает сервис, а потом читаются креды второго пользователя, который должен сервис настроить.
Вот второе я бы решал, нагуглив/напилив роль конкретно для сервиса. Правда, у меня DSC, там еще веселее. Странного хотеть не возбраняется, но сделать вы это не сможете.
Андрей
@a_111_1111 уточняй давай _исходную_ задачу.
Есть определенный аппликейшн. Коммерческий и древний. написан на джаве. У него есть возможность работать как сервис. есть определленный аpi call который это все делает. Что конкретно он делает под капотом неизвестно. Но если это команду выполнить, то мы знаем что со стороны аппликейшина все будет ок. ( то есть обходить со стороны не стоит) проблема в чем - нужно это все автоматизировать. cli так написан, что нужно вводить пароль вручную. Никуда подложить его нельзя или обойти его ввод. Именно поэтому я влез с pexpect модулем. чтобы команда выполнилась корректно ее нужно запустить с опцией run as administrator вот как это выглядит если делать вручную на машине C:\SIL\sil\bin>sil setup service create Enter the SIL Administrator password: Please enter the HOSTNAME\USERNAME password: The service 'SIL' has been successfully installed. C:\SIL\sil\bin>для того чтобы автоматизировать ввод пароля я быстренько сварганил тот скриптец который скидывал выше если запустить cmd.exe от администратора и выполнить его то он задачу решает. Стает вопрос как это сделать в ансибле как-то так)
Sergey
Есть определенный аппликейшн. Коммерческий и древний. написан на джаве. У него есть возможность работать как сервис. есть определленный аpi call который это все делает. Что конкретно он делает под капотом неизвестно. Но если это команду выполнить, то мы знаем что со стороны аппликейшина все будет ок. ( то есть обходить со стороны не стоит) проблема в чем - нужно это все автоматизировать. cli так написан, что нужно вводить пароль вручную. Никуда подложить его нельзя или обойти его ввод. Именно поэтому я влез с pexpect модулем. чтобы команда выполнилась корректно ее нужно запустить с опцией run as administrator вот как это выглядит если делать вручную на машине C:\SIL\sil\bin>sil setup service create Enter the SIL Administrator password: Please enter the HOSTNAME\USERNAME password: The service 'SIL' has been successfully installed. C:\SIL\sil\bin>для того чтобы автоматизировать ввод пароля я быстренько сварганил тот скриптец который скидывал выше если запустить cmd.exe от администратора и выполнить его то он задачу решает. Стает вопрос как это сделать в ансибле как-то так)
https://docs.ansible.com/ansible/latest/modules/win_service_module.html#win-service-module https://docs.ansible.com/ansible/latest/modules/win_nssm_module.html#win-nssm-module
Андрей
https://docs.ansible.com/ansible/latest/modules/win_service_module.html#win-service-module https://docs.ansible.com/ansible/latest/modules/win_nssm_module.html#win-nssm-module
да это знаю но я не уверен что сервис созданный таким образом будет "таким как надо")
Sergey
да это знаю но я не уверен что сервис созданный таким образом будет "таким как надо")
Твои варианты: 1)читать исходники модулей ансибла, либо 2)переписывать свой скрипт. Ещё раз: проброса stdin нет. Точка.
Андрей
Твои варианты: 1)читать исходники модулей ансибла, либо 2)переписывать свой скрипт. Ещё раз: проброса stdin нет. Точка.
Тут есть нюанс который и не дает мне это все оставить уже 3й день) для того чтобы установить этот аппликейшн нужно тоже вводить 2 раза пароль который и станет потом паролем админа аппликейшина. И таким макаром получилось его ввести я ктому что может и коряво но как-то же получилось эти пароли ввести при тех же условиях
Андрей
Эмммм......... Для тебя разница между локальным и удалённым запуском есть?
ну уже да) но я же тоже удаленно запускал примерно то же самоеи оно сработало
Sergey
ну уже да) но я же тоже удаленно запускал примерно то же самоеи оно сработало
Ок, идём дальше. Фраза про отсутствие проброса stdin была понятной, или я умдурился в ней где-то накосячить?
Dr. L.S.Dee
Есть определенный аппликейшн. Коммерческий и древний. написан на джаве. У него есть возможность работать как сервис. есть определленный аpi call который это все делает. Что конкретно он делает под капотом неизвестно. Но если это команду выполнить, то мы знаем что со стороны аппликейшина все будет ок. ( то есть обходить со стороны не стоит) проблема в чем - нужно это все автоматизировать. cli так написан, что нужно вводить пароль вручную. Никуда подложить его нельзя или обойти его ввод. Именно поэтому я влез с pexpect модулем. чтобы команда выполнилась корректно ее нужно запустить с опцией run as administrator вот как это выглядит если делать вручную на машине C:\SIL\sil\bin>sil setup service create Enter the SIL Administrator password: Please enter the HOSTNAME\USERNAME password: The service 'SIL' has been successfully installed. C:\SIL\sil\bin>для того чтобы автоматизировать ввод пароля я быстренько сварганил тот скриптец который скидывал выше если запустить cmd.exe от администратора и выполнить его то он задачу решает. Стает вопрос как это сделать в ансибле как-то так)
Раз пошла такая пьянка, и от ввода реквизитов не избавиться, то читать их откуда-то или передавать как объект.
Андрей
Ок, идём дальше. Фраза про отсутствие проброса stdin была понятной, или я умдурился в ней где-то накосячить?
Ну насколько я понял в цепочке ansible -> posh -> python -> cli пош не имеет доступа к stdin из которого cli ждет пароль
Sergey
Нет. Модуль PoSH, на который я приводил ссылку, умеет пихать всякую фигню на вход запускаемого кода, только, очевидно, кто-то эту фигню должен для начала передать.
Sergey
https://github.com/ansible/ansible/blob/devel/lib/ansible/modules/windows/win_command.ps1#L45
Андрей
Нет. Модуль PoSH, на который я приводил ссылку, умеет пихать всякую фигню на вход запускаемого кода, только, очевидно, кто-то эту фигню должен для начала передать.
я тогда не понимаю почему в двух аналогичных случаях имею разный результат. Различие только в аппликейшене к которому стучусь. в первом случае инсталлятор во втором - cli. метод ввода паролей в двух случаях 1в1. в первом получилось иначе я бы не имел на выходе установленного и работающего аппликейшина.
Андрей
первая таска установить, вторая настроить как сервис
Андрей
первая успешно
Андрей
пароли тоже нужно вводиь
Sergey
пароли тоже нужно вводиь
удалённый stdin открывается, что ли?
Андрей
получается что да. иначе насколько я понимаю пароль бы не был получен
Андрей
а он был получен потому что аппликейшн установился. Без пароля такого бы не было
Sergey
Тогда чини свой python-скрипт.
Qwerty
Viktor
vsc1t: Всем доброго, кто может подсказать: ansible, переменная задается в цикле через include_tasks, в первой итерации она есть, во второй нет но проверку через when переменная is defined всеравно проходит, падает уже на jinja2 фильтрах с AsnibleUndefined. Как так? loop: "{{ item.server_conf |default({ 1: 1 })|dict2items }}" loop_control: loop_var: directory_item when: >- item.server_conf is defined and directory_item.key | regex_search('_log') == "_log" тут костыть {1: 1} все исправил Закидывал все это в блок и добавлял еще 1 when - проходит проверку на defined
Dr. L.S.Dee
первая таска установить, вторая настроить как сервис
Инсталлятор тоже читает пароль со stdin? Или все же ему можно передать учетные данные ключом, или он запускается с нужными учетными данными?
Viktor
Переменной нет, но when is defined проходит
Dr. L.S.Dee
Три большие разницы!
Timur
В том что не могу понять логику
Покажите код, который вызывает родительский цикл
Viktor
Сек
Viktor
host_vars: nginx_vhosts: - name: vhost1 enabled: yes server_conf: listen: 8080; server_name: vhost1; error_log: /var/log/nginx/vhost1/error.log warn; locations_conf: - >-2 location /status { return 200 'Status 200 OK! vhost1\n'; add_header Content-Type text/plain; } - name: vhost2 enabled: yes в tasks/main.yml - name: Ensure with Nginx vhost configuration include_tasks: nginx_configure.yml loop: "{{ nginx_vhosts }}" when: configure_nginx | bool в nginx_configure.yml - name: Making required dirs file: path: >- {{ directory_item.value | regex_replace(' .*$', '') | dirname }} state: directory owner: 'root' group: 'syslog' mode: '775' loop: "{{ item.server_conf |default({ 1: 1 })|dict2items }}" loop_control: loop_var: directory_item when: >- item.server_conf is defined and directory_item.key | regex_search('_log') == "_log"
Viktor
или pastebin?
Viktor
regex_search не проходит 1: 1, но почему проходит when is defined? Запихивал все в блок с условием when is defined - одинаково
Андрей
Инсталлятор тоже читает пароль со stdin? Или все же ему можно передать учетные данные ключом, или он запускается с нужными учетными данными?
Инсталлятору не нужна опция run as adm. Но его должен запускать юзер с правами админа. Тоже читает с stdin. Там нужно задекларировать пароль и ввести его для подтверждения. В плане учеток ему ничего передавать не надо он сам возьмет все что нужно
Anonymous
https://github.com/ansible/ansible/issues/60751
Плохо знаком gluster. Говорит, что не может выполнить /usr/sbin/gluster --mode=script volume add-brick IMAGES replica 2 172.16.105.140:/gluster/images/ 172.16.105.141:/gluster/images/ force
Dr. L.S.Dee
Инсталлятору не нужна опция run as adm. Но его должен запускать юзер с правами админа. Тоже читает с stdin. Там нужно задекларировать пароль и ввести его для подтверждения. В плане учеток ему ничего передавать не надо он сам возьмет все что нужно
> Но его должен запускать юзер с правами админа Это и есть runas, буквално "запуск от имени". А вот далее не факт. Или не факт, что читает именно как пароль. Для sensitive data есть обычно свой тип данных, но в данном случае мог быть и просто текст. В общем, поковырять было бы интересно... не будь это легаси. А не будь это легаси, проще было бы уговорить разработчиков (по-хорошему, или с адм.ресурсом) сделать красиво.
Anonymous
@Qwerty_Sewr , в самом модуле пытается запустить gluster с шелла. После выполнения получает код возврата 1 и падает.
Anonymous
@Qwerty_Sewr , смущает, что IMAGES большими буквами. что выдает gluster vol status?
Qwerty
Плохо знаком gluster. Говорит, что не может выполнить /usr/sbin/gluster --mode=script volume add-brick IMAGES replica 2 172.16.105.140:/gluster/images/ 172.16.105.141:/gluster/images/ force
Да. Он запускает его, но такой том уже есть. И да, он создается через ансибл, в этом таске. Такое чувство, что запускается дважды. Но в логах это не видно
Qwerty
@Qwerty_Sewr , смущает, что IMAGES большими буквами. что выдает gluster vol status?
Нууу, я честно говоря не вижу в этом проблемы.
Qwerty
@Qwerty_Sewr , смущает, что IMAGES большими буквами. что выдает gluster vol status?
При прогоне плейбука, задача отрабатывает точно ( Раньше не было гластер-тома, а потом он появляется ). Исходное состояние: 1. Гластер тома не созданы 2. Пиры не обнаружены (gluster peer status - нулевой) Начинаю прогонять таск, в отдельной консоли я мониторю, создается том, и потом таск фейлитс, что не может добавить брик, который задействован.
Qwerty
в shell(если вручную) эта команда работает без ошибок?
Если тома нет, то отрабатывает, если есть, то фейлится( что правильно)
Viktor
Покажите код, который вызывает родительский цикл
в файле host_vars: nginx_vhosts: - name: vhost1 enabled: yes server_conf: listen: 8080; server_name: vhost1; error_log: /var/log/nginx/vhost1/error.log warn; locations_conf: - >-2 location /status { return 200 'Status 200 OK! vhost1\n'; add_header Content-Type text/plain; } - name: vhost2 enabled: yes в tasks/main.yml - name: Ensure with Nginx vhost configuration include_tasks: nginx_configure.yml loop: "{{ nginx_vhosts }}" when: configure_nginx | bool в nginx_configure.yml - name: Making required dirs file: path: >- {{ directory_item.value | regex_replace(' .*$', '') | dirname }} state: directory owner: 'root' group: 'syslog' mode: '775' loop: "{{ item.server_conf |default({ 1: 1 })|dict2items }}" loop_control: loop_var: directory_item when: >- item.server_conf is defined and directory_item.key | regex_search('_log') == "_log" regex _search не проходит 1: 1, но почему проходит when is defined? Запихивал все в блок с условием when is defined - одинаково
Timur
regex_search не проходит 1: 1, но почему проходит when is defined? Запихивал все в блок с условием when is defined - одинаково
Для словаря так просто defined не прокатывает, т.к. проверяется переменная, а не ключ
Timur
Пожалуйса, подробнее, и как надо, если можно
Я бы попробовал пересмотреть структуру исходного словаря
Timur
На мой взгляд, под ту задачу, что вы пытаетесь решить, отлично подходит loop типа nested
Timur
Или, как вариант, subelements
Timur
Вложенные loop не стоит делать для такого простого цикла
Viktor
На мой взгляд, под ту задачу, что вы пытаетесь решить, отлично подходит loop типа nested
Что означает проверяется переменная? Просто проверяется наличие item? Если не затруднит дайте ссылки на nested и subelements. Спасибо за ответы.
Timur
https://docs.ansible.com/ansible/latest/plugins/lookup/nested.html
Viktor
Вложенные loop не стоит делать для такого простого цикла
У меня ещё несколько тасков в файле nginx_configure.yml тогда мне прийдется каждому loop добавлять
Viktor
https://docs.ansible.com/ansible/latest/plugins/lookup/subelements.html
Про переменную так и не понял
NS 🇷🇺
Коллеги, еще такой вопрос. Можно ли в плейбуке получить факты хостов, не учавствующие в нем.
Ждун
можно, вы хотите странного :D
Отделение Bereke Bank
для таких целей у меня в начале идет - name: Gather facts from all servers hosts: all tasks: - name: Collect facts returned by all servers setup: gather_subset: - all
NS 🇷🇺
ну в принципе вариант, но чет на скорость будет влиять сильно
Qwerty
можно, вы хотите странного :D
Ну почему странно? Скажем открыть iptables с хостов, которые клиенты.