inqfen
- name: "sync files to the script directory" synchronize: src: "files/mongo_scripts/" dest: "/tmp/mongo_scripts" - name: "execute db scripts" command: "mongo {{ db_local_connection_uri }} {{ mongo_script }}" loop: "{{ lookup('fileglob', '/tmp/mongo_scripts') }}" loop_control: loop_var: "mongo_script"
inqfen
Выполняется это с гитлаб раннера, где питон только 3
inqfen
Добавил в скрипт перед выполнением - apk add python Ошибки больше нет
inqfen
То есть на контролхосте rsync он вызывает через интерпретатор второго питона
Timur
ln --symbolic /usr/bin/python3 /usr/bin/python
inqfen
ну это понятно, но костылик кмк
Timur
Более простой костылик, чем установка дополнительно второго питона
inqfen
Я думаю проще пока забить, этому хосту со вторым питоном жить неделю-две осталось
inqfen
Потом на 3 онли это переедет
Timur
хочется странного: задавать ansible_play_hosts внутри плейбука. Т.е. сделать что-то вроде: - hosts: "{{ somelist }}" ...
Timur
подскажите, как лучше, или киньте ссылкой на то, что это антипаттерн и так лучше не делать
Timur
накостылить генератор hosts-файлов могу, но это ещё корявее
UglyKoyote
Коллеги, а помогите тоже со странным :) Есть плейбук, есть инвентори, может быть от 1 до бесконечности групп серверов. Таска одна и та же, на выходе такие же группы файлов, по 1 на сервер. Задача - сравнить в каждой группе все файлы с эталонным. Пока решаю задачу питонячим скриптом, которому на вход подаю каталог до каждой группы, дальше скрипт уже сам всё делает. Вопрос - можно ли запускать таску ОДИН раз в КАЖДОЙ группе? Чет пока вменяемого решения найти не могу. Не хотелось бы оставлять любые ручные манипуляции (кроме запуска плейбука)
UglyKoyote
число/название групп заранее неизвестно
Timur
хочется странного: задавать ansible_play_hosts внутри плейбука. Т.е. сделать что-то вроде: - hosts: "{{ somelist }}" ...
алсо, я разобрался^Wнагуглил: - hosts: localhost tasks: - add_host: name=docker_{{item}} groups="dockers,other" tag={{item}} with_sequence: start={{ext_def_start}} count={{ext_def_num}} - hosts: docker_* tasks: - debug: var=tag
Timur
только вам надо итерироваться по всем вашим группам и выбирать первый хост
Timur
и собирать из выбранного новую группу
Timur
и потом уже по ней запускать play
Ivan
Привет! name = "node-{{ item.distr }}-{{ lookup('env','CI_JOB_ID') | default(100,true) | random }}" Хочу: если нет переменной, то пусть будет рандом. Если она есть, то рандом не юзать. Но прикол в том, что лукап не отдаёт андефайнд, чтобы дефолт можно было юзать без true
UglyKoyote
run_once
увы но это не то. оно просто один раз выполняется на весь плейбук
UglyKoyote
если бы так просто было, я бы не стал спрашивать
UglyKoyote
ну я вроде описал.. есть группы в одном файле. надо запускать одну таску один раз в одной группы, но в каждой группе
Timur
Ну, сделайте несколько плеев по числу групп
Timur
В чем проблема-то?
UglyKoyote
я не знаю сколько может быть групп
Timur
Простите?
UglyKoyote
или 1 или 100, мне плодить сущности?
UglyKoyote
в инвентори файле может быть как одна группа, так 2-10-100
Timur
Так. И?
Timur
Что именно вы пытаетесь сделать?
UglyKoyote
да хотя бы выводить через дебуг по одному имени сервера из каждой группы
UglyKoyote
без разницы какого - важно 1 сервер из каждой группы
Timur
Так, давайте без глупостей
UglyKoyote
имена/число группа заранее не определено
Timur
Что вы хотите сделать?
Timur
В чем заключается задача?
Timur
Больше деталей
Timur
Что вы пытаетесь сделать с файлами? Какого состояния достичь?
UglyKoyote
ок. есть список серверов. который включен в одну группу, есть второй список, включен во вторую группу. я по каждой группе собираю списки установленных пакетов. затем питонячий скрипт запускаю в каждом каталоге - куда складываю результаты по группе. скрипт выплевывает 2 файла сравнения одного сервера с другими
UglyKoyote
скрипт по регекспу определяет эталонный файл, с которым сравнивает всё что находит в этом же каталоге
UglyKoyote
и поэтому возникла идея и запуск скрипта "отдать" в ансибл. чтобы и это исключить "из рук" человека. собственно вся задача
Ivan
Что именно вы хотите сделать?
Уникальное имя, конечно. Если запускается с CI, то брать из переменной. Если нет, то подставлять рандомное значение в хвост
Timur
В чем затруднение?
Ivan
{{ lookup('env','CI_JOB_ID') | default(60|random) }}" так?
Timur
Да
Ivan
я уже написал, что получается "node-debian10-", потому что лукап не отдаёт андефайнд, чтобы дефолт работал. Если я поставлю default(.....,true), то он будет работать всегда, насколько я понял
Ivan
Нет, проверил — всё хорошо name = "node-{{ item.distr }}-{{ lookup('env','CI_JOB_ID') | default(60|random,true) }}" так вот норм
Timur
Вот я об этом и говорил
Timur
Для чего нужно сравнение файлов?
Ivan
Вот я об этом и говорил
Я не совсем верно понял второй аргумент true у default
UglyKoyote
Непонятно, какое состояние вы хотите получить в итоге
состояние уже получено. 2 файла на сервер, как хочет заказчик. я просто хотел пойти дальше, и сократить число ручных манипуляций
UglyKoyote
то бишь втащить питоновский скрипт в одну из тасок
Timur
Для чего нужен питоновский скрипт?
Timur
Какое состояние вы пытаетесь сделать?
UglyKoyote
есть эталонный сервер. есть сервер который надо "проверить". получаю список пакетов на каждом сервере из двух. затем проверяю: наличие всех пакетов что есть на эталоне на предмет их наличия на сравниваемом, и второй файл - список пакетов которые есть на сравниваемом, но не установленны на эталонном
Timur
И какое должно быть состояние в итоге?
UglyKoyote
1. хочу - позиция заказчика 2. состояние чего? не могу понять вопроса пока. на выходе УЖЕ есть все данные что нужны заказчику
UglyKoyote
но получаются они кол-вом запуска питоноскрипта, по числу групп
Timur
Еще раз. Какого состояния серверов вы хотите добиться? Состояния типа "запущен питоновский скрипт"?
UglyKoyote
а.. нет, хочу таску - которая будет запускать скрипт для каждой полученной группы, на локальной машине куда упали все данные
UglyKoyote
просто запустить и всё
Timur
Зачем тут ансибл тогда?
Timur
Если вам просто нужно запустить скрипт на питоне
UglyKoyote
ещё раз...
UglyKoyote
ансибл ходит по группам серверов и собирает данные
Timur
Какие данные?
UglyKoyote
после этого мне надо обработать полученные "сырые данные"
UglyKoyote
Вы серьезно? мне 4 раз повторить? я же уже 3 раза именно Вам написал
Ruslan
Коллеги, как вот это: >>> for i in a['vminfo']['virtual_machines']: ... for j in i['mac_address']: ... pprint(j) описать в таске?