ℭ𝔞𝔯𝔯𝔬𝔩
Хай всем, нужно в роль передать список всех ип нод кластера еластика. Использую динамик инвентори гугловый, как это лучше сделать? может кто сталкивался?
выдернул из плейбука: - hosts: "{{ custom_hosts | d([]) }}" … vars: … discovery.zen.ping.unicast.hosts: "{% set ip_list=[] %}{% for host in groups[custom_hosts] %}{% if ip_list.insert(loop.index,hostvars[host]['ansible_host']) %}{% endif %}{% endfor %}{{ip_list|join(',')}}" …
ℭ𝔞𝔯𝔯𝔬𝔩
В логе отображаются при выполнении.
странно, должен быть хэш
Alexander
странно, должен быть хэш
Посмотрю, если логи остались, щас пока не до этого.
ℭ𝔞𝔯𝔯𝔬𝔩
Посмотрю, если логи остались, щас пока не до этого.
есть старый тикет про это: https://github.com/ansible/ansible/issues/18184 в конец недавно кто-то дописал такое: > The workaround is to use hashing filters (hash, password_hash, md5 ...) in your playbook https://docs.ansible.com/ansible/2.4/playbooks_filters.html#hashing-filters > Here is an example: > My playbook look like this: - hosts: jug gather_facts: no vars_files: - vars/cred.yml tasks: - name: Input Test shell: printf "{{ dba_user }}\n{{ dba_passwd | hash('sha1') }}\n{{ dba_sid }}" | ./input_script.sh args: chdir: /home/tbemnta/data/scripts/ > When I run it in verbose mode, password is hashed: $ ansible-playbook -vvv -i inventory-ng/hosts/hosts --ask-vault-pass ansible/yaml/input_06112018.yml
Alexander
Ну хеши это понятно. В общем, баг. Буду знать, спасибо.
Sergey
🤦‍♂️
Asten
Осталось только написать run_my_ansible_playbook.sh
Vlad
Странные люди. Почему они не передают пароли через environment?
జ్ఞా
Братцы! Удаленного дево-пса ищет кто? есть ресурсы рускоязычные чтобы найти халтуру по ансиблю ? Дайте проектик потренироваться - да поотлаживать
Alexey
Кто ж в здравом уме даст проектик комуто "тренироваться"?
Alexey
Хотя смотря сколько ты готов за это платить..
జ్ఞా
Это из какого фильма ?
Stefan
а есть какой-то ресурс по практическим задачам на самообучение по ансиблу?
simplemice.eth
виртуалки + таски?
Павел П.
Добрый день) То ли глаз замылился, то ли не пойму. Делаю прямо по примеру в https://docs.ansible.com/ansible/2.7/modules/authorized_key_module.html Получаю ошибку ERROR! 'with_file' is not a valid attribute for a Play ansible 2.4.3.0 python version = 2.7.13 Плейбук:
Павел П.
Artem
with_items
shine
мб with_items ? loop, по-моему, с 2.5
Artem
или key: {{ file }}
Павел П.
with_items
ERROR! 'authorized_key' is not a valid attribute for a Play
Павел П.
или key: {{ file }}
ERROR! 'with_file' is not a valid attribute for a Play
Павел П.
В общем по версиям проверить? Ок...
Stefan
виртуалки + таски?
про таски именно и спрашиваю
simplemice.eth
таски на гитхабе
Stefan
таски на гитхабе
ссыль можно?
Александр
’’’ - name: nginx direcories file: path: "{{ nginx_dir }}/{{ item }}" state: directory loop: "{{ [ lookup('filetree', 'nginx/') ] | json_query('[]') | json_query('[?state==`directory`].path') }}" tags: - nginx_update_configs - name: install nginx configs template: src: "../files/nginx/{{ item }}" dest: "{{ nginx_dir }}/{{ item }}" loop: "{{ [ lookup('filetree', 'nginx/') ] | json_query('[]') | json_query('[?state!=`directory`].path') }}" notify: - reload nginx tags: - nginx_update_configs ’’’
Александр
Рассмотрим подробнее loop - то же самое, что и with_items lookup('filetree', 'nginx/') - возвращает массив (в терминологии python и jinja - лист) словарей с файлами и каталогами с некоторыми характеристиками [ lookup(...) ] - обёрнут в квадратные скобки на случай если он вернёт один объект как голый словарь, чтобы в итоге он был все же массивом json_query('[]') - возвращает один массив данных, на случай если у нас массив вложен в массив (если мы изначально получили от lookup массив - у нас будет что-то вроде [[ data ]]) [?state!=`directory`] - делает выборку массива словарей, по свойству state (Если это не каталог) .path - возвращает как массив path всех элементов
Павел П.
круть! Очень спасибо за подробноту!
Александр
Можно проще. Но вывод ansible-playbook -CD будет более грязным
Александр
Будет отображаться содержимое item и пропущенные по условию
Timur
Кавычек не хватает у путей к файлам просто
Timur
Будет отображаться содержимое item и пропущенные по условию
Регулировать отображение можно с помощью loop_control и label
Александр
Посмотрю. Спасибо
Александр
Регулировать отображение можно с помощью loop_control и label
а есть рекомендация, чтобы не делить операцию на создание дерева каталогов и копирование файлов? Сохранив при этом информативность выхлопа -CD
Александр
не. это не ответ
Timur
Или речь о том, чтобы создавать каталоги и копировать файлы в одном модуле?
Timur
Это же принципиально разные задачи
Александр
ок. Глупый вопрос...
Александр
Регулировать отображение можно с помощью loop_control и label
- name: nginx direcories file: path: "{{ nginx_dir }}/{{ item.path }}" state: directory with_filetree: nginx loop_control: label: "{{ item.path }}" when: item.state == "directory" если я сделаю что-то подобное, у меня же всё равно будут отображаться skip'ы по условию when: item.state == "directory"
Александр
- name: nginx direcories file: path: "{{ nginx_dir }}/{{ item }}" state: directory loop: "{{ [ lookup('filetree', 'nginx/') ] | json_query('[]') | json_query('[?state==`directory`].path') }}" мне вернёт только директории и только path заодно
ℭ𝔞𝔯𝔯𝔬𝔩
Jinja2 в двойных кавычках же Ну и with_items если "{{ item }}"
Александр
это хорошо что в данном случае три файла. А если их штук 20 и примерно столько же каталогов, плюс ещё diff'ы - выхлоп получится очень грязным
Александр
В ansible.cfg вроде как есть опция отключить ВСЕ skip'ы, но боюсь это не мой случай. В нашем случае, во многих местах они несут информативность
Vladislav 👻
Timur
это хорошо что в данном случае три файла. А если их штук 20 и примерно столько же каталогов, плюс ещё diff'ы - выхлоп получится очень грязным
Тогда готовьте список путей отдельной таской с помощью find, а полученный готовый лист уже используйте в качестве входного аргумента для задачи по созданию и копированию
Александр
Сравним вывод $ cat test_playbook.yml - hosts: localhost gather_facts: false tasks: - name: Copy directories with json_query file: path: "tmp2/{{ item }}" state: directory loop: "{{ [ lookup('filetree', 'tmp1') ] | json_query('[]') | json_query('[?state==`directory`].path') }}" - name: Copy file with json_query copy: src: "tmp1/{{ item }}" dest: "tmp2/{{ item }}" loop: "{{ [ lookup('filetree', 'tmp1') ] | json_query('[]') | json_query('[?state!=`directory`].path') }}" - name: Copy directories with loop_control file: path: "tmp3/{{ item.path }}" state: directory with_filetree: tmp1 loop_control: label: "{{ item.path }}" when: item.state == "directory" - name: Copy files with loop_control copy: src: "{{ item.src }}" dest: "tmp3/{{ item.path}}" with_filetree: tmp1 loop_control: label: "{{ item.path }}" when: item.state != "directory"
Александр
Александр
и это без diff'ов
Александр
emergy@MacBook-Pro-Emergy:~$ find tmp1 tmp1 tmp1/empty_dir tmp1/one_directory tmp1/one_directory/one_dir tmp1/one_file tmp1/one_file/one_file tmp1/two_directories tmp1/two_directories/directory_1 tmp1/two_directories/directory_2 tmp1/two_files tmp1/two_files/file_1 tmp1/two_files/file_2
Александр
В общем, каждый сам себе художник...
Timur
То же самое. Можно сделать find а потом копи по найденному
Александр
это ещё больше операций + delegate_to
Timur
Чего? При чем тут delegate вообще?
Александр
ну чтобы сделать find, я как понимаю через delegate_to... каталог то локальный
Александр
ну или local_action, что в принципе одно и то же
Timur
Ну и в чем проблема?
Александр
да не в чём. Меня лично lookup filetree с двумя фильтрами больше устраивает
Александр
можно в принципе оптимизировать до одного json_query - когда нибудь и до этого руки дойдут
Александр
казалось бы очевидный json_query('[][?state==`directory`].path'), работает только в js версии. У ансиБоли как обычно свои взгляды...
kbks
приветы
kbks
немного старнный вопрос, но все же. Скажем, у меня есть несколько dict в которых есть разные значения, к примеру app: v2: v3: v5: Есть таски которые разворачивают на хостах app соответствующих версий, какой нибудь командой из сгенерированного тимплейта( к примеру run template_v2 для версии v2 соответственно). приложение может выдавать статус запущенных версий. Вопрос: как можно описать в ансибле удаление уже запущенных версий, но которые удалены из дикта (v1, v4) в данном случае.
kbks
ну это тоже в голову приходило, но думал может есть какой-то более гуманный вариант)
Victor
есть более гуманные варианты
Victor
Но типо у тебя есть приложение с управлением через команду. Самый гуманный вариант - взять готовый модуль под эту приложуху. Менее гуманный вариант - написать модуль под эту приложуху. Другой случай - у тебя приложуха использует conf.d, соотвественно можно просто от туда выкинуть все ненужные файлы потипу https://gist.github.com/gMagicScott/618d7ac29b12664d7482 только генерить список налету. Другой вариант - писать с помощью assemble весь конфиг в один файл.
Stefan
такой интерес возник, раньше использывал ансибл по следующей схеме: 1. создавал в хост_варсах файл с названием хоста, где описывал разного рода переменные, например такие ansible_connection: docker sites: - name: test-lala.com caching: true 2. создавал роль с главным плейбуком в tasks и template 3. добавлял навзание хоста в hosts 4. был создан общий плейбук(default.yml) запуска ролей в зависимости от названия хоста/группы хостов например с таким содержимым - hosts: docker_containers roles: - nginx Возник вопрос, можно же избежать привязки к хост_варсам и создать например такого типа плейбук и объявлять в нем также переменные как и в хост_варсах? --- - name: install packages apt: name={{ item }} state=present with_items: - htop - wget - curl - name: create dir for site command: mkdir -p /var/www/{{ item.name }} with_items: "{{ sites }}" - name: create vhosts template: src=templates/vhost.conf dest=/etc/nginx/conf.d/{{ item.name }}.conf with_items: "{{ sites }}" - name: copy index.html copy: src: files/index.html dest: /var/www/{{ item.name }} with_items: "{{ sites }}" - name: reload nginx command: service nginx reload
Victor
такой интерес возник, раньше использывал ансибл по следующей схеме: 1. создавал в хост_варсах файл с названием хоста, где описывал разного рода переменные, например такие ansible_connection: docker sites: - name: test-lala.com caching: true 2. создавал роль с главным плейбуком в tasks и template 3. добавлял навзание хоста в hosts 4. был создан общий плейбук(default.yml) запуска ролей в зависимости от названия хоста/группы хостов например с таким содержимым - hosts: docker_containers roles: - nginx Возник вопрос, можно же избежать привязки к хост_варсам и создать например такого типа плейбук и объявлять в нем также переменные как и в хост_варсах? --- - name: install packages apt: name={{ item }} state=present with_items: - htop - wget - curl - name: create dir for site command: mkdir -p /var/www/{{ item.name }} with_items: "{{ sites }}" - name: create vhosts template: src=templates/vhost.conf dest=/etc/nginx/conf.d/{{ item.name }}.conf with_items: "{{ sites }}" - name: copy index.html copy: src: files/index.html dest: /var/www/{{ item.name }} with_items: "{{ sites }}" - name: reload nginx command: service nginx reload
Для play и для role можно объявлять свои переменные
Victor
https://docs.ansible.com/ansible/2.7/user_guide/playbooks_variables.html#variable-precedence-where-should-i-put-a-variable
Stefan
Для play и для role можно объявлять свои переменные
ну мне получается нужно чтоб было как-то так sites: - name: bla bla caching: true - name: install packages apt: name={{ item }} state=present with_items: - htop - wget - curl - name: create vhosts template: src=templates/vhost.conf dest=/etc/nginx/conf.d/{{ item.name }}.conf with_items: "{{ sites }}"
Stefan
и чтоб оно всё в одной плоскости это хавало