Oleksandr
кстати, на месте шаблонизатор научился работать?
Oleksandr
без двигания файлов туды-сюды
Max
с как минимум с 2.0 можно было писать jinja вместо параметров, т.е. почти все этапы можно шаблонить. т.е. без вызова template.
Max
в баше есть библиотеки, можно сорсить файл функций.
Oleksandr
джинджсибл какой-то )
Max
но если это вдруг нужно писать на баше с библиотекой, это уже знак что пора съезжать на нормальный я.п.
Артём
Подскажите, как заэкранировать дефис, пожалуйста. tasks: - name: Get package versions package_facts: manager: rpm - name: Set pkg version-release set_fact: pkg_installed_version: '{{ ansible_facts.packages.my-package[0].version }}-{{ ansible_facts.packages.my-package[0].release }}' Тут если в my-package есть дефис, то оно фэйлится с "The task includes an option with an undefined variable. The error was: ‘package is undefined’
Vladislav 👻
так вроде нельзя использовать дефис в переменных
Timur
Какой таск?
Артём
TASK [Set pkg version-release]
Timur
так вроде нельзя использовать дефис в переменных
С чего вдруг? Переменная - это просто строка
Timur
Там может быть что угодно
Timur
TASK [Set pkg version-release]
Тогда проблема не в дефисе
Timur
Он не может факт с вашим пакетом найти вообще
Vladislav 👻
С чего вдруг? Переменная - это просто строка
я наверно что-то путаю, но у меня были проблемы с дефисом в переменных, с тех пор их не использую...
Timur
А, вы про имя переменной?
Timur
Да, там строки с дефисом недопустимы
Timur
Просто не нужно давать переменным имена с дефисами
Артём
Неа. Если дефис убрать, будет ошибка ненайденного пакета с именем mypackage, а так - именно о неопределённости package
Timur
Просто не нужно давать переменным имена с дефисами
Timur
Если же речь идет о свойствах словаря (которые могут быть с дефисами), то их можно вызывать вот так: ansible_facts["packages"]["my-package"][0]["version"]
Артём
Вот ошибка отсутствия пакета (элемента в словаре) : The error was: 'dict object' has no attribute ‘packagename’ Вот при попытке заэкранировать только один элемент: {"msg": "template error while templating string: expected name or number. String: {{ ansible_facts.packages.[\»my-package\»][0].version }}-{{ ansible_facts.packages.[\»my-package\»][0].release }}"}
Артём
Кавычки - телеграм портит.
Артём
При вот таком обращении: ansible_facts.packages.[«package-name»][0].version
Артём
Если всё экранировать - то же самое. '{{ ansible_facts.["packages"].["package"][0].["version"] }}' {"msg": "template error while templating string: expected name or number. String: {{ ansible_facts.[\"packages\"].[\"package\"][0].[\"version\"] }}"}
Timur
Если вызываете свойства словаря через квадратные скобки - точки уже не нужны
Timur
Я же написал правильный пример
Артём
Если вызываете свойства словаря через квадратные скобки - точки уже не нужны
Спасибо, невнимательность. Можно даже часть точками разделять, главное, чтобы .[ не было. Завелось.
George
Скажите, в ансибле есть штатные функции сравнения даты/времени (надо понять, кто новее)?
Timur
А сравнивать время можно, да. Как обычные числа
George
А) есть б) не придирайся.
George
я нашёл to_datetime, но его трудно накормить stat.mtime.
Timur
Опиши задачу конкретнее
George
Есть файл (mtime), есть строка вида "Modified: 10 Apr 19 12:52 UTC". Нужно выполнить действие, если файл свежее, чем эта строка.
George
(есть - 19).
Timur
А, понятно
Timur
Питон знаешь?
George
- debug: msg={{(my_string_data|to_datetime("%d %b %y %H:%M %Z")-"1970"|to_datetime("%Y")).total_seconds()}}
George
Задачу решил, но ощущение, что лучше бы не.
Timur
Вот-вот :)
k
command: "test {{ file1 }} -nt {{ file2 }}"
George
У меня нет второго файла, только дата из вывода утилиты.
Oleg
Что за утилита?
Oleg
Stat умеет возвращать в юникстайме
George
Stat умеет возвращать в юникстайме
stat - модуль у ансибла, и он возвращает в timestamp (всё хорошо). Утилита - вывод kapacitor'а, и там только строка. Мне их надо сравнить. Я решил задачу, но как же мерзко-то...
Max
есть еще встроенная переменная ansible_datetime, емнип
Timur
есть еще встроенная переменная ansible_datetime, емнип
Задача не в получении даты из встроенных источников (файлы, система), а в парсинге даты из произвольной текстовой строки
Timur
Это в любом скриптовом движке та еще задача
Max
ну да еще локаль надо брать в счет.
Отделение Bereke Bank
Подскажите как вы проверяете запущен ли сервис? Есть ли какой-нибудь фен-шуйный метод без костылей через shell/command? В доке модуля systemd не нашел. нужно проверять запущен ли firewalld на сервере
Отделение Bereke Bank
Зачем это проверять?
есть серверы у которых firewall провайдера и firewalld на них отключен. Следовательно таски с firewalld модулем на таких серверах должны пропускаться
alx
https://docs.ansible.com/ansible/latest/modules/service_facts_module.html
alx
это?
Timur
Ну, или использовать модуль service_facts, как выше правильно заметили
Отделение Bereke Bank
Спасибо, попробую
Sergey
есть серверы у которых firewall провайдера и firewalld на них отключен. Следовательно таски с firewalld модулем на таких серверах должны пропускаться
Эти серверы в отдельную группу inventory, а на неё уже всё остальное вешать. Тогда конструкции будут прозрачнее.
/warn
- debug: msg={{(my_string_data|to_datetime("%d %b %y %H:%M %Z")-"1970"|to_datetime("%Y")).total_seconds()}}
Та напиши ты под это модуль на питоне за 5 минут. Будет в разы лучше.
Anton
товарищи, а есть ли возможность как либо передать в hosts: имена хостов через -e аргумент?
Anton
а более просто нельзя? :))
Sergey
а более просто нельзя? :))
Это точно проще, чем страдать :-)
Timur
товарищи, а есть ли возможность как либо передать в hosts: имена хостов через -e аргумент?
А не проще нужный инвентарь просто подсовывать с теми же группами?
Timur
И никаких извратов с передачей хостов через отдельные переменные не нужно
Timur
Anton
мне нужно работать именно с существующей inventory, динамик не подойдет. сейчас я в hosts передаю параметром один хост, это работает, все ок, все корректно. выглядит примерно так hosts: '{{ host }}' ansible-playbook -e host=hostname
Anton
но вот я захотел передать больше чем один хост :)
Timur
-i hosts.yml
Anton
у меня он уже есть, я на нем базируюсь
Anton
мне нужно используя уже существующий файл инвентаря использовать только нужные hosts, передавая их переменными
Sergey
Но ты делаешь странное
Sergey
Не надо так ;-)