Pavel
https://stackoverflow.com/questions/54373152/how-to-resolve-could-not-locate-file-in-lookup-reading-id-rsa-pub
Pavel
он смотрит на локальный, а исполнение url с удаленного
Pavel
и все таки ошибка ( - name: import template to es uri: url: http://localhost:9200/_template/filebeat-7.6.2 user: beats_setup password: "{{ elasticsearch_native_user_beats_setup_user_password }}" method: POST body: "{{ lookup('file','{{ ansible_env.HOME }}/filebeat_prepare/filebeat.template.json') }}" force_basic_auth: yes status_code: 201 body_format: json when: filebeat_import == true пишет что FAILED! => {"msg": "An unhandled exception occurred while running the lookup plugin 'file'. Error was a <class 'ansible.errors.AnsibleError'>, original message: could not locate file in lookup: /home/administrator/filebeat_prepare/filebeat.template.json"}
Grek 🇺🇦
У вас вроде шаблон в шаблоне, так не работает
Sergey
^^^ +++
Pavel
а как тогда, shell?
Pavel
в документации похожий пример, тоже шаблон заявки - name: Create a JIRA issue uri: url: https://your.jira.example.com/rest/api/2/issue/ user: your_username password: your_pass method: POST body: "{{ lookup('file','issue.json') }}" force_basic_auth: yes status_code: 201 body_format: json
Grek 🇺🇦
Там шаблон в чистом виде, а вы запихали шаблон в шаблон, ансиьл не может его развернуть
Grek 🇺🇦
Как сделать правильно - хз, я не настоящий сварщик. Но я бы положил json в заведомо известную локацию относительно плейбука и вызывал его без использования переменных окружения
Grek 🇺🇦
Положите в files рядом с плейбуком и вызывайте files/your.json
Aleksey
в документации похожий пример, тоже шаблон заявки - name: Create a JIRA issue uri: url: https://your.jira.example.com/rest/api/2/issue/ user: your_username password: your_pass method: POST body: "{{ lookup('file','issue.json') }}" force_basic_auth: yes status_code: 201 body_format: json
или рядом прям к джобе сделать - name: Create a JIRA issue uri: url: https://your.jira.example.com/rest/api/2/issue/ user: your_username password: your_pass method: POST body: {{myjson }} force_basic_auth: yes status_code: 201 body_format: json vars: myjson: blalbl
Павел
в документации похожий пример, тоже шаблон заявки - name: Create a JIRA issue uri: url: https://your.jira.example.com/rest/api/2/issue/ user: your_username password: your_pass method: POST body: "{{ lookup('file','issue.json') }}" force_basic_auth: yes status_code: 201 body_format: json
вот мой вариант рабочий: - name: Create an issue jira: uri: https://jira.xxx.ru username: user password: pass project: XXX operation: create summary: заголовок description: create incident using Ansible issuetype: тип тикета issuetype: Task args: fields: customfield_11403: {'value': 'xxx' } customfield_11704: {'value': 'xxx', 'child': {'value': 'xxx'}} priority: {'id': '1'} assignee: {'name': 'user'} register: pathticket
Павел
customfield_11403 и customfield_11704 поля в условиях - если нет, то это выпиливается
Igor
любопытства ради: а в каких случаях из ансибла надо создавать тикет в жире?
Pavel
любопытства ради: а в каких случаях из ансибла надо создавать тикет в жире?
когда что то пошло не так в инфраструктурных ролях
Igor
но ведь "оператор ансибла" это увидит и пойдёт сразу поправит, например
Павел
Igor
а, прикольно
Pavel
но ведь "оператор ансибла" это увидит и пойдёт сразу поправит, например
если запускает руками - да, а если это автоматический CI/CD
Pavel
но джира не решает вопроса автоматизации битов эластика, там есть крупные шаблоны (
Ivan
привет! может кто знает, почему у меня раньше работала эта конструкция для force: без | bool, а теперь перестала пришлось добавить этот фильтр? По дефолту переменная False
Anton
Коллеги, я не могу придумать как корректно сделать: - name: Reorder hosts: localhost strategy: linear gather_facts: false tasks: - set_fact: grouplist: "{{ groups.keys()|list|select('search','subnet')|list }}" online: "{{ hostvars|json_query('[@.*][0]|[?!(rsyncstat.failed)].inventory_hostname') }}" tested: "{{ hostvars|json_query('[@.*][0]|[?testfact].inventory_hostname') }}" vars: - jquery: "[@.*][0]|[?!(rsyncstat.failed)].inventory_hostname" - debug: var=groups.{{ item }}|sort|first loop: "{{ grouplist }}" - debug: var={{item}} with_items: - grouplist - online - tested - debug: var=groups.{{ item }}|intersect({{tested}})|default(groups.{{ item }}|intersect({{online}})) loop: "{{ grouplist }}" И да, это программирование на ансибл. Тут проблема в том что внутри default не отрабатывает. и в msg этот последний дебаг не могу перевести, т.е. это не возможно вынести в какую-то переменную. Вариант конечно под каждую подсеть генерить две переменные и потом их сводить в одну. или писать модуль для обработки этого именно в питоне. И тут я могу застрять, по причине отсутствия навыков программирования на питоне. Т.е. минимум еще пару дней дополнительно в минимуме.
Sergey
Коллеги, я не могу придумать как корректно сделать: - name: Reorder hosts: localhost strategy: linear gather_facts: false tasks: - set_fact: grouplist: "{{ groups.keys()|list|select('search','subnet')|list }}" online: "{{ hostvars|json_query('[@.*][0]|[?!(rsyncstat.failed)].inventory_hostname') }}" tested: "{{ hostvars|json_query('[@.*][0]|[?testfact].inventory_hostname') }}" vars: - jquery: "[@.*][0]|[?!(rsyncstat.failed)].inventory_hostname" - debug: var=groups.{{ item }}|sort|first loop: "{{ grouplist }}" - debug: var={{item}} with_items: - grouplist - online - tested - debug: var=groups.{{ item }}|intersect({{tested}})|default(groups.{{ item }}|intersect({{online}})) loop: "{{ grouplist }}" И да, это программирование на ансибл. Тут проблема в том что внутри default не отрабатывает. и в msg этот последний дебаг не могу перевести, т.е. это не возможно вынести в какую-то переменную. Вариант конечно под каждую подсеть генерить две переменные и потом их сводить в одну. или писать модуль для обработки этого именно в питоне. И тут я могу застрять, по причине отсутствия навыков программирования на питоне. Т.е. минимум еще пару дней дополнительно в минимуме.
Aleksey
прикинь чо
Aleksey
я тут нашёл для себя https://github.com/kwoodson/ansible-role-yedit/blob/master/library/yedit.py он уже дважды на канале упоминался. но пусть будет ещё разрок. модуль для редактирования ямля.
Sergey
прикинь чо
Это же не штатный питонячий модуль, а поделие, которое как-то там работает - ну ок.
Aleksey
Писать плейбуки в плейбуках?
нее. мне надо немного побаловаться с ямлем. выкусить пару значений
Sergey
from_yaml / to_yaml?
Aleksey
комменты!
Sergey
комменты!
ну да, да, я помню твою боль с ними
Aleksey
фейспалм у них хостинг кода на сорсфорже.
Aleksey
кто бы видел сейчас мои страдания и муки совести
Aleksey
я собственно в него ушел с https://github.com/kwoodson/ansible-role-yedit/blob/master/library/yedit.py#L189
Aleksey
я встречал этот проект и ранее. но у меня не болело.
Aleksey
а тут и болит и такой подгон
Anton
Мне показалось или у афроамериканца волосы дыбом встали? А серьёзно, есть варианты или углубляться в питон?
Sergey
Мне показалось или у афроамериканца волосы дыбом встали? А серьёзно, есть варианты или углубляться в питон?
В теории - есть. Но ты уже написал выражение, которое своей сложностью объективно превзошло твой уровень владения инструментом. На питоне бы уже давно сделал и смеялся над всей этой историей.
Aleksey
Коллеги, я не могу придумать как корректно сделать: - name: Reorder hosts: localhost strategy: linear gather_facts: false tasks: - set_fact: grouplist: "{{ groups.keys()|list|select('search','subnet')|list }}" online: "{{ hostvars|json_query('[@.*][0]|[?!(rsyncstat.failed)].inventory_hostname') }}" tested: "{{ hostvars|json_query('[@.*][0]|[?testfact].inventory_hostname') }}" vars: - jquery: "[@.*][0]|[?!(rsyncstat.failed)].inventory_hostname" - debug: var=groups.{{ item }}|sort|first loop: "{{ grouplist }}" - debug: var={{item}} with_items: - grouplist - online - tested - debug: var=groups.{{ item }}|intersect({{tested}})|default(groups.{{ item }}|intersect({{online}})) loop: "{{ grouplist }}" И да, это программирование на ансибл. Тут проблема в том что внутри default не отрабатывает. и в msg этот последний дебаг не могу перевести, т.е. это не возможно вынести в какую-то переменную. Вариант конечно под каждую подсеть генерить две переменные и потом их сводить в одну. или писать модуль для обработки этого именно в питоне. И тут я могу застрять, по причине отсутствия навыков программирования на питоне. Т.е. минимум еще пару дней дополнительно в минимуме.
лайк! groups.{{ item }}|intersect({{tested}})|default(groups.{{ item }}|intersect({{online}})) пиши еще!
Aleksey
люблю такие конструкции в плейбуках. видно что человек хорошо почитал документацию и научился в сложные фильтры
Aleksey
сам при любой возможности херачу такие же конструкции. (нет. извини.)
Anton
люблю такие конструкции в плейбуках. видно что человек хорошо почитал документацию и научился в сложные фильтры
Вот тут конкретно не работает сложный фильтр. конкретней внутри default он почему-то не отрабатывает в питон 3.6 на ансибл 2.9.7
Sebor▂▅▇█▓▒░
Попробуй питон 3.8
Anton
В теории - есть. Но ты уже написал выражение, которое своей сложностью объективно превзошло твой уровень владения инструментом. На питоне бы уже давно сделал и смеялся над всей этой историей.
На питоне придется взять какой-то пример модуля фильтра (правильно ведь помню что модуль именно локальное исполнение) для того чтобы на основании примера с докой по питону написать своё. Кроме практики извратного программирования в пересечении PowerShel2/PowerShel5+cmd & bash & sql и очень древних практик турбопаскаля 5 и си++ тех же лет ничего не пробовал в последнее время кроме go
Anton
Попробуй питон 3.8
Мне по хорошему это заставить работать еще и на питоне 3.5 :(
Sergey
Модуль - удалённо, фильтр - локально
Sergey
В общем случае, конечно
Anton
Модуль - удалённо, фильтр - локально
понял. пример такого фильтра где можно взять?
Sergey
понял. пример такого фильтра где можно взять?
Исходники же: https://github.com/ansible/ansible/blob/v2.9.7/lib/ansible/plugins/filter/core.py
Lex
https://docs.ansible.com/ansible/latest/plugins/inventory/tower.html ребят, хочу предложить PR для этого плагина...кто знает как его отыскать )?
Lex
да, он лежит локально...а где его исходники на гитхабе..найти не могу ( все ссылки в 404
Alex
я же показал путь
Alex
https://github.com/ansible/ansible/blob/stable-2.9/lib/ansible/plugins/inventory/tower.py
Lex
хм...инетересно, а в devel его нет )) спасибо большое!
Anton
лайк! groups.{{ item }}|intersect({{tested}})|default(groups.{{ item }}|intersect({{online}})) пиши еще!
Вот так прокатило: - name: task1 debug: msg: "{{item}}" loop: "[{% for host in grouplist %}{% if groups[host]|intersect(tested)|length>0 %} '{{groups[host]|intersect(tested)|sort|first}}' {% else %} '{{ groups[host]|intersect(online)|sort|first }}' {% endif %},{% endfor %}]" Изначально пробовал делать через groups.host и через groups.{{host}} , но {{groups.{{host}}}} не прокатывает. Если кому-то такое интересно
Aleksey
Антон вы же понимаете что утомитесь писать тесты к этой конструкции да? Или планов писать на нее тесты нету ?
inqfen
А какая задача вообще стояла?
Aleksey
ну да, да, я помню твою боль с ними
прикинь чо! https://github.com/ansible/ansible/pull/38841
inqfen
Давно его видел
inqfen
Так и висит в open
Aleksey
но ансибл не был бы ансиблом если бы толковый модуль был бы вмержен
inqfen
жи есть
Anton
А какая задача вообще стояла?
выбор в подсети хоста который будет выступать в качестве сервера, и взять тот же хост в подсети если он уже использовался. В случае если внутри данной подсети нет сервера. И количество таких подсеток может быть до ~4k
Aleksey
впрочем я знаю почему его не мержат. он требует yaml на хосте.
inqfen
inqfen
И им это не мешает
Anonymous
Коллеги подскажите, хочу генерировать location nginx ансиблом, имеется такая переменная nginx: generate: - {location: "/", options: {"root /var/www/core-docs", "autoindex on"} } - {location: "//22", options: {"vasy", "42"} } имеется такой template ## generate section location {% if nginx.generate is defined %} {% for generate in nginx.generate %} location {{generate.location}} { {{generate.options}}; } {% endfor %} {% endif %} ### end location проблема не понимаю как мне сделать второй цикл для работы с массивом options
inqfen
В доке просто в требованиях указывается