Max
получается парсинг списка (или словаря?) делать прям при подстановке?
Grek 🇺🇦
да, это проблема?
Max
убрать - name: Find Firefox profile path part 2 set_fact: firefox_profile: "{{ item.path }}" with_items: "{{ firefox_path_tmp.files }}" и прям в таске где вы меняете файл, или что вы там делаете использовать firefox_path_tmp.path
не, не хочет так работать. fatal: [monitoring-pc]: FAILED! => {"msg": "The task includes an option with an undefined variable. The error was: 'dict object' has no attribute 'path' - name: Find Firefox profile path part 1 find: path: /home/{{ work_user }}/.mozilla/firefox file_type: directory patterns: '*.default-default' register: firefox_path_tmp # - name: Find Firefox profile path part 2 # set_fact: # firefox_profile: "{{ item.path }}" # with_items: "{{ firefox_path_tmp.files }}" - name: Render Firefox config template: src: prefs.js.j2 dest: "{{ firefox_path_tmp.path }}/prefs.js" я так понимаю, потому что модуль find для ансибла не отдаёт такой элемент. https://docs.ansible.com/ansible/latest/modules/find_module.html#return-values
Grek 🇺🇦
ну, так выведите результат того что вы зарегистрировали. и посмотрите что там и как, обратитесь к нужному элементу. я написал на вскидку
Grek 🇺🇦
firefox_path_tmp.files.path
Max
я почему-то не могу вытащить второй и последующие уровни вложенности (списки там или словари, я всё путаюсь). - debug: msg: "{{ firefox_path_tmp.files.path }}" даёт ошибку "msg": "The task includes an option with an undefined variable. The error was: 'list object' has no attribute 'path' поэтому и приходится поэтапно парсить каждый "уровень вложенности". и в гугле рецепты тоже такие же. видимо нет возможности вытащить сразу что-то с несколькими уровнями вложенности. find отдаёт такую конструкцию ok: [monitoring-pc] => { "msg": { "changed": false, "examined": 4, "failed": false, "files": [ { "atime": 1599463224.0152984, "ctime": 1599472383.4823093, "dev": 64770, "gid": 988, "gr_name": "monitoring", "inode": 67211072, "isblk": false, "ischr": false, "isdir": true, "isfifo": false, "isgid": false, "islnk": false, "isreg": false, "issock": false, "isuid": false, "mode": "0700", "mtime": 1599472383.4823093, "nlink": 9, "path": "/home/monitoring/.mozilla/firefox/q7zsbkhi.default-default", "pw_name": "monitoring", "rgrp": false, "roth": false, "rusr": true, "size": 4096, "uid": 991, "wgrp": false, "woth": false, "wusr": true, "xgrp": false, "xoth": false, "xusr": true } ], "matched": 1, "msg": "" } }
Aleksandr
firefox_path_tmp.files потому что это лист
Aleksandr
нельзя у него взять path
Aleksandr
нужен итератор по все найденным файлам?
Elenhil
я почему-то не могу вытащить второй и последующие уровни вложенности (списки там или словари, я всё путаюсь). - debug: msg: "{{ firefox_path_tmp.files.path }}" даёт ошибку "msg": "The task includes an option with an undefined variable. The error was: 'list object' has no attribute 'path' поэтому и приходится поэтапно парсить каждый "уровень вложенности". и в гугле рецепты тоже такие же. видимо нет возможности вытащить сразу что-то с несколькими уровнями вложенности. find отдаёт такую конструкцию ok: [monitoring-pc] => { "msg": { "changed": false, "examined": 4, "failed": false, "files": [ { "atime": 1599463224.0152984, "ctime": 1599472383.4823093, "dev": 64770, "gid": 988, "gr_name": "monitoring", "inode": 67211072, "isblk": false, "ischr": false, "isdir": true, "isfifo": false, "isgid": false, "islnk": false, "isreg": false, "issock": false, "isuid": false, "mode": "0700", "mtime": 1599472383.4823093, "nlink": 9, "path": "/home/monitoring/.mozilla/firefox/q7zsbkhi.default-default", "pw_name": "monitoring", "rgrp": false, "roth": false, "rusr": true, "size": 4096, "uid": 991, "wgrp": false, "woth": false, "wusr": true, "xgrp": false, "xoth": false, "xusr": true } ], "matched": 1, "msg": "" } }
files[0].path жеж
Elenhil
ну или итерировать если не уверены что там только один файл
Max
нужен итератор по все найденным файлам?
если вопрос какая задача, то надо найти путь по шаблону /home/user/some_random_string.default-default. это путь к профилю firefox. some_random_string как-то генерируется при установке firefox. поэтому хочется иметь путь типа такого /home/user/*.default-default. хардкодить путь до профиля firefox не хочется, чтобы плейбука была универсальная
Aleksandr
files[0].path жеж
можно делать так, если уверены что файл один
Max
спасибо всем за советы и рекомендации. а что значит [0] в данной конструкции? это же не нулевой элемент списка?
Elenhil
нулевой элемент списка
Elenhil
да
Elenhil
у вас список диктов
Elenhil
[{}]
Max
тогда я чёт запутался в питоне. есть список files, в котором словари. один из словарей называется path и этот словарь не является 0-ым элементом списка files
Max
это взятие значения нулевого элемента словаря path из списка files?
Elenhil
очевидно
Elenhil
я написал вам как получить path из того что вы скинули. Если у вас больше одного дикта в списке - вам надо итерировать с помощью with_items:
Max
Теперь вроде понятно, спасибо
Ivan
о благородные мужи! а подскажите, есть ли способ ускорить работу ансибла, если плейбук выполняется на локалхосте, а таски по сути своей - обращения по апи и http-запросы? за совет как померять узкие места тоже буду признателен
Alex
ну включи профилирование и посмотри
Alex
если это внешние сервисы - то выполнять запросы с машины, которая расположена как можно ближе к серверу
Ivan
@lexx107 @zulgabis спасибо!
A
Всем привет. Подскажите возможно-ли передать параметры модуля как переменные?
Grek 🇺🇦
возможно
A
Скажем я создаю контейнер через docker_container и в некоторых случиях мне нужно дополнительно параметр dns
A
или ограничить память...
A
возможно
Можно пример или где почитать как?
Grek 🇺🇦
пример чего именно?
A
Как реализовать через host_vars задуманное дополнение
Grek 🇺🇦
я чего-то не понимаю, вам рассказать как подставить переменную в параметр модуля?
A
Нет, сделать типо dns: "{{ my_dns }}" это не то что я хочу
A
мне нужно что-то типо - name: my container docker_container:
A
name: "{{ my_name }}" image: "{{ image }}" {{ extra_param }}
Lamobot
Нет, сделать типо dns: "{{ my_dns }}" это не то что я хочу
dns: "{{ my_dns|default(omit) }}" - если не нужен этот параметр при отсутствии переменной
A
то есть только прописав все параметры с подстановкой?
Elenhil
то есть только прописав все параметры с подстановкой?
Ну вы можете генерить роль из джинджи
Elenhil
Anna
Подскажите, Ansible в гитлабе все через image с docker контейнером используют?
George
Не совсем понимаю вопроса
Anna
можно ли из gitlab-runner типа shell нормально переключиться на ansible пользователя с ужения
Anna
окружения
Anna
ну например приходится так писать script: - sudo -u ansible /usr/local/bin/ansible-playbook -i /home/ansible/hosts /home/ansible/dev.yml --tags landing -e "land=qm"
George
Наверное, от настроек машины с раннером зависит
Anna
иначе не понимает команд и не видит hosts
Anna
т.е. sudo -u ansible хоть и от пользователя ansible, но полностью, не в его окружении
Sebor▂▅▇█▓▒░
А зачем так вообще извращаться? Не проще ли от пользователя раннера просто все сделать?
Sebor▂▅▇█▓▒░
Ага, хук слева
Anna
конкретнее
Anna
от пользователя раннер тоже не работает
Anna
$ ansible all -m setup [WARNING]: No inventory was parsed, only implicit localhost is available [WARNING]: provided hosts list is empty, only localhost is available. Note that the implicit localhost does not match 'all'
Anna
плейбуки в каталоге пользователя ansible
Sebor▂▅▇█▓▒░
Так надо же инвентори указывать
Anna
или надо в /etc/ansible держать
Anna
инвентори у пользователя ansible
inqfen
или надо в /etc/ansible держать
Вот это точно не надо
Anna
в домашнем каталоге
Anna
а кто как делает? через докер контейнер с ансиблом что ли все делают?
Anna
нет awx и пока излишне
Anna
ну есть и Ansible Tower, там тоже прикручивается через Токен.
Anna
но Tower тоже нет... темб более он платный
Отделение Bereke Bank
Через докер контейнер удобнее Запаковываешь с нужной версией ансиболи, со всякими модулями Претаской ставишь все зависимости, потом запускаешь плейбук И раннер чист, без всякого хлама
George
pwd ?
Anna
а как git pull делать. Мне на каждом серваке надо иметь .ssh/id_pub в каталоге ansible, а то пока на другого пользователя переключаюсь
Anna
каталог /home/gitlab-runner
George
каталог /home/gitlab-runner
А плейбук где ?
George
Наверняка в /builds ?
Anna
это тест