JonnSmitt_\/Z
"msg": "Unsupported parameters for (copy) module: gather_facts,
Sergey
Это параметр плея, а не таски.
Timur
если удалить на целевой машине файл. ТО таск проходит. Но во второй проход уже НЕТ.
Учитывая, что ты копируешь какой-то конфиг в папку конфигов sudo, то логично, что после этого настройки меняются и на втором проходе настройки sudo у тебя уже другие
JonnSmitt_\/Z
Читаю. Ок. проверим и этот вариант. Те же самые. Конфиг Этот файл внисит "левые" разрешения.
JonnSmitt_\/Z
В другом плейбуке - эта же конструкция - работает.
Max
В плейбуке?
JonnSmitt_\/Z
УРА!
JonnSmitt_\/Z
Тьфутыж! так и знал! Всё это "гуано" было в ансибле.
JonnSmitt_\/Z
JonnSmitt_\/Z
Вот так выглядит рабочий таск. ! А казалось бы какого хрена! Просто обозвал конфиг с расширением ".conf" ! И всё. Ансибл больше не залупается. Я хотел скопировать @ля файл. Я его копирую. Вот зачем он умничает А. эхххх. Всех с Пятницей!
Max
То есть то что ты поменял модуль которым ты это сделал - это вина ансибла?
Dmitry
Прочитал "Привет, Mdadm"
JonnSmitt_\/Z
Я просто таском из плэйбука копировал файлик. Просто копировал. и мне НУЖНО скопировать. и всё.
Max
То есть ты считаешь, что рукожопие это вина ансибла?
Max
Ок, вопросов не имею.
Alex
Привет всем, подскажите, может кто сталкивался, интересует концепт так сказать. Есть плейбук, который производит тестирование установки определенных продуктов. В зависимости от продукта и типа инсталяции набегает от 50 до 150 проверок. Некоторые из них являются ключевыми. Например, условно 20я проверка проверяет доступность API и если он недоступен, то проводить остальные 80 проверок нет смысла. Фейлить сам плейбук при этом нельзя, так как мне надо формировать отчет с проверками Собственно вопрос, как в таком случае строить плейбук/роль, которая позволит пропускать все последующие проверке в случае необходимости
Alex
к каждому из 150 тасков с проверками приписывать when?
Vladimir
к каждому из 150 тасков с проверками приписывать when?
Ну, ты их можешь все в один блок объединить и в конце блока добавить when
Alex
все в один не могу, так как слишком много разных условий - ОС/тип инсталера/режим установки/параметры и т.д. и т.п.
Alex
ну и плюс как я писал выше - если все будет в одном и зафейлится где то посредине списка
Alex
как я буду отлавливать такое
Timur
Как-то не очень понял суть задачи
Timur
Так плейбук должен останавливаться на фейле или нет?
Alex
не должен, но все последующий проверки должны просто скипаться, так как в конце мне надо формировать отчет
Vladimir
да
Тогда ссылка выше тебе поможет
Alex
https://docs.ansible.com/ansible/latest/user_guide/playbooks_error_handling.html#controlling-what-defines-failure
т.е. выход только один и к каждому из тасков дополнительно цеплять when?
Vladislav 👻
подскажите, можно как-то чекнуть все конечные значения переменных для хоста?
Vladislav 👻
ansible-inventory --vars возвращает промежуточные, т.е. в значении одной переменной может быть название другой переменной
Denis
Ку-ку ребята пождскажите как выполнить один раз таску?
Denis
есть 50 машин но я один раз должен выполнить команду на делегайте
Артём
есть 50 машин но я один раз должен выполнить команду на делегайте
https://docs.ansible.com/ansible/latest/user_guide/playbooks_delegation.html#run-once
Lev
други, дабы вечерм пятницы не был томным и вы могли размяться, предлагаю вам сыгать в игру. кто больше придумает способов решить задачу: 1. есть список с пользователями, у некоторых пользователей нет поля emal. задача вывести пользователей без email 2. пример списка - login: login1 email: dep@loy.me - login: login2 - login: login3 email: dep@loy.com - login: login4 правильный ответ login2, login4 3. я придумал 4 варианта: --- - hosts: localhost roles: - role: example_plugins vars: admins: - login: login1 email: dep@loy.me - login: login2 - login: login3 email: dep@loy.com - login: login4 tasks: - debug: msg: "{{ admins }}" # print all acounts without email - debug: msg: "{% set out_list = [] %}\ {% for user in admins %}\ {% if not user.email is defined %}\ {{ out_list.append(user.login) }}\ {% endif %}\ {% endfor %}\ {{ out_list }}" # use standard jinja2 filters - debug: msg: "{{ admins | \ selectattr('email', 'undefined') | \ map(attribute='login') | \ list }}" # use test plugin - debug: msg: "{{ admins | \ select('has_email') | \ map(attribute='login') | \ list }}" # use filter - debug: msg: "{{ admins | users_without_email }}" $ cat users_without_email.py #!/usr/bin/python class FilterModule(object): def filters(self): return { 'users_without_email': self.a_users_without_email } def a_users_without_email(self, users_input): users_output = [] for user in users_input: if 'email' not in user: users_output.append(user['login']) return users_output $ cat has_email.py class TestModule: def tests(self): return { 'has_email': lambda i: 'email' not in i }
Lev
задача не несет никакого практического смысла, кроме придумать извращенные варианты решения задачи необычнами путями
Timur
други, дабы вечерм пятницы не был томным и вы могли размяться, предлагаю вам сыгать в игру. кто больше придумает способов решить задачу: 1. есть список с пользователями, у некоторых пользователей нет поля emal. задача вывести пользователей без email 2. пример списка - login: login1 email: dep@loy.me - login: login2 - login: login3 email: dep@loy.com - login: login4 правильный ответ login2, login4 3. я придумал 4 варианта: --- - hosts: localhost roles: - role: example_plugins vars: admins: - login: login1 email: dep@loy.me - login: login2 - login: login3 email: dep@loy.com - login: login4 tasks: - debug: msg: "{{ admins }}" # print all acounts without email - debug: msg: "{% set out_list = [] %}\ {% for user in admins %}\ {% if not user.email is defined %}\ {{ out_list.append(user.login) }}\ {% endif %}\ {% endfor %}\ {{ out_list }}" # use standard jinja2 filters - debug: msg: "{{ admins | \ selectattr('email', 'undefined') | \ map(attribute='login') | \ list }}" # use test plugin - debug: msg: "{{ admins | \ select('has_email') | \ map(attribute='login') | \ list }}" # use filter - debug: msg: "{{ admins | users_without_email }}" $ cat users_without_email.py #!/usr/bin/python class FilterModule(object): def filters(self): return { 'users_without_email': self.a_users_without_email } def a_users_without_email(self, users_input): users_output = [] for user in users_input: if 'email' not in user: users_output.append(user['login']) return users_output $ cat has_email.py class TestModule: def tests(self): return { 'has_email': lambda i: 'email' not in i }
Через select и selectattr - нормальные варианты. Можно, разве что rejectattr добавить
Timur
Только синтаксис можно покрасивее сделать - без лишних кавычек и обратных слешей
Lev
Только синтаксис можно покрасивее сделать - без лишних кавычек и обратных слешей
Это что бы на слайд 4*3 влезло. Коллегам немецким курс читать буду и хочу показать логику/процесс рефакторинга плэйбука и как там могут/зачем появляются фильтры всякие.
Timur
Такой вариант хуже влезает?
Timur
С джинджей вариант в топку, имхо
Timur
В плейбуке ей не место
Lev
- debug: msg: >- {{ admins | selectattr('email', 'undefined') | map(attribute='login') | list }}
да, чет намудрил я. я себе на черный день такую табличку наверстал
Lev
С джинджей вариант в топку, имхо
это пример как точка старта и показать что jinja может много чего, но не надо это тащить все
Artem
т.е. выход только один и к каждому из тасков дополнительно цеплять when?
Можно использовать block, отчёт формировать в always
Vladislav 👻
debug: hostvars
Хм, что-то не подумал, спасибо за наводку
Alex
Можно использовать block, отчёт формировать в always
Обернуть в блок будет проблематично
kbks
Приветы. А никто не импортирует дашборды для кибаны через ансибл? через curl - все отлично ( curl -X POST -H "Content-Type: application/json" -d @4f4978c0-176d-11e9-9ab8-053f966a5c8e.json "http://127.0.0.1:5601/api/kibana/dashboards/import" -H "kbn-xsrf: kibana", но вот с ансиблом не могу понять почему получаю 400 - name: "Import kibana's dashboard" uri: url: "http://127.0.0.1:5601/api/kibana/dashboards/import?overwrite=true" method: POST body: "{{ item }}" body_format: json validate_certs: false headers: Content-Type: "application/json" kbn-xsrf: "kibana" with_fileglob: - "{{ kibana_dashboards_dir }}/*.json"
kbks
ошибка в body body: '{{ lookup("file", item) }}'
Timur
Там был рабочий код для такой задачи
kbks
@tgadiev уже нашел ошибку, спасибо
Nick
Коллеги, а подскажите есть переменная, устанавливаемая на уровне группы - link_templates (лист) мне хочется на уровне хоста добавить к нему несколько элементов в host_vars/myhost пишу host_link_templates: - another_element link_templates: '{{link_templates + host_link_templates}}' получаю An unhandled exception occurred while templating '{{link_templates + host_link_templates}}'. Error was a <class 'ansible.errors.AnsibleError'>, original message: recursive loop detected in template string: {{link_templates + host_link_templates}}"} ЧЯДНТ? Роль, правда, не моя...
Timur
А, вы ещё и значение рекурсивно поменять пытаетесь
Timur
Не, так не пойдёт
Nick
я готов сделать как нужно ) задача простая - добавить элемент(ы) в уже существующий массив
Timur
А потом присвойте ее значение старой переменной
Nick
тоже не работает судя по кучке багов по этому поводу - это нормальное поведение, которое как-то обходится костылями... буду думать, спасибо
Vladislav 👻
Нельзя такое сделать в рамках одной переменной, в рантайме эта переменная будет иметь то значение, которое в хосте
Vladislav 👻
Копипаста из группы в хосты, а там можно сделать например так: var_temp: - group-value1 - group-value2 - {{ add-list }} var: {{ var_temp | flatten }}
Vladislav 👻
Если я правильно понял суть вопроса
George
Я хочу наваять (в апстрим) модуль ip_link, вот с такими примерами: - name: Create a dummy interface ip_link: name: dummy42 type: dummy state: present - name: Delete an interface ip_link: name: eth3.333 state: absent - name: Set MTU for eth0 to jumbo frames ip_link: name: eth mtu: 8986 - name: Create pair of veth intefaces and move them into different namespaces in up state ip_link: name: veth33 peer_name: veth34 type: veth state: up peer_state: up mtu: 8182 namespace: example1 peer_namespace: example2Буду очень рад предложениям и идеям (в пределах разумного, я весь ip link не осилю за раз).
Aleksandr
Привет. подскажите как получить вменяемый ответ в таком таске? - set_fact: test: "{{ users | selectattr('name', 'match', allowed_users) | list }}" allowed_users - массив. после чего создается объект generator object select_or_reject at 0x107bf0550 а на | list выдается ошибка - unhashable type: 'list'" ЧЯДНТ?
Vitaly
Vitaly
Простите, не удержался )
Almir
хах..
Alex
TASK [common/jfmc : Install python3] ******************************************* fatal: [app_slave]: FAILED! => changed=true msg: non-zero return code rc: 100 stderr: |- Warning: Permanently added '104.xxx.xxx.xxx' (ECDSA) to the list of known hosts. Shared connection to 104.xxx.xxx.xxx closed. stderr_lines: - 'Warning: Permanently added ''104.xxx.xxx.xxx'' (ECDSA) to the list of known hosts.' - Shared connection to 104.xxx.xxx.xxx closed. stdout: |- E: Type 'Ubuntu,' is not known on line 50 in source list /etc/apt/sources.list E: The list of sources could not be read. stdout_lines: <omitted> а кто-нибудь сталкивался с такими ошибками? При попытке установить питон через raw модуль
inqfen
Проверь 50 строку /etc/apt/sources.list, явно же сказано
Alex
в том то и дело, что там комент. Ошибка плавающая, на 3х хостах все норм, на одном возникает такая ошибка
Alex
50 # deb-src http://archive.canonical.com/ubuntu bionic partner 50 строка
inqfen
Такое ощущение, что где-то не закомменчено /перенос строки или ещё что-то подобное