Lamobot
*set_fact в pre_tasks
Max
я к этому и склонялся. но думал, может есть более лаконичное решение. спасибо
Grek 🇺🇦
более лаконично решение сделать PR в репу
Grek 🇺🇦
вы и себе сделаете хорошо, и всем остальным, кто может столкнуться с таким
Max
Хорошая идея, да. Надо будет как-то подготовить это.
Alexander
Коллеги, привет вам. Смотрите, у меня тут в парке объявилась ОС - RED OS, которая ребрендинговая CentOS. В одной роли я делаю include_tasks: "{{ ansible_facts.os_family | lower}}.yml" Так вот у этой RED OS os_family разрешается как 'red' вместо 'redhat'. =) Как можно выкрутиться, не используя when?
Valiy
симлинк))
Sergey
^^^ +++
Alexander
Ну да ) это был вторй вариант
Alexander
А это норм практика?
Sergey
Пожалуй, ничуть не хуже, чем работать с RED OS.
Dmitriy
А это норм практика?
коллега по несчастью, я обходил вот так when: (ansible_os_family == "RedHat" or ansible_os_family == "RED")
Dmitriy
и все заработало нормально
Alexander
коллега по несчастью, я обходил вот так when: (ansible_os_family == "RedHat" or ansible_os_family == "RED")
Ну, блин, это when ) я хотел оставить лаконичную запись в инклюде таска
Valiy
ну или скопирую просто файл центоса в red.yml
Alexander
ну или скопирую просто файл центоса в red.yml
Ну да. Направление я понял. ) Думал может есть какая хитрость, чтобы кодом решить, а не добавлением файлов.
Valiy
Ну да. Направление я понял. ) Думал может есть какая хитрость, чтобы кодом решить, а не добавлением файлов.
ну ты хочешь кодом, но без when а так по-моему такой вариант укладывается в логику include_tasks: "{{ ansible_facts.os_family | lower}}.yml"
Alexander
ну ты хочешь кодом, но без when а так по-моему такой вариант укладывается в логику include_tasks: "{{ ansible_facts.os_family | lower}}.yml"
Ага. С when не красиво же - будет два таска. А потом у нас тут всякие астры ещё есть, тоже под них мутить отдельное when... В общем, попробую сейчас с симлинком.
Alexander
Ну, с симлинком норм. ) Спасибо.
Ruslan
Всем привет. Подскажите пожалуйста почему так происходит? - name: Include secret vars file include_vars: dir: vars name: secret.yml - name: Create hive user become: yes become_method: su become_user: postgres postgresql_user: name: hive password: "{{ hivedb_password }}" msg: |- The task includes an option with an undefined variable. The error was: 'hivedb_password' is undefined файл и переменная в нем конечно же есть
Ruslan
хм.. ok, но чет у меня без include_vars тоже самое
Ruslan
если именно в отдельном новом файле в vars/main.yml - видим переменную
Sergey
хм.. ok, но чет у меня без include_vars тоже самое
Логично - для роли читается именно varы/main.yml.
Ruslan
а как-то можно сделать чтобы читал из отдельного файла для роли?
Lamobot
а как-то можно сделать чтобы читал из отдельного файла для роли?
Попробуйте убрать dir из параметров. "If the path is relative and the task is inside a role, it will look inside the role's vars/ subdirectory."
Ruslan
ansible_included_var_files: [] message: |- Could not find file on the Ansible Controller.
Ruslan
🤔 да просто мне так кажется удобнее работать с секретными переменными, проще зашифровать волтом отдельный файл с паролями и не смешивать их с несекретными
Lamobot
group_vars/all/credentials.yml. Шифровать файл целиком уже давно не модно.
Здесь разве нет проблемы в том, что теперь на каждый запуск любого плейбука даже без этих переменных нужно будет указывать vault-id/пароль для расшифровки?
Sergey
Здесь разве нет проблемы в том, что теперь на каждый запуск любого плейбука даже без этих переменных нужно будет указывать vault-id/пароль для расшифровки?
Справедливо. Тогда есть смысл затащить это не в группу all, а в ту группу, для которой эти переменные предназначены.
Ruslan
Спасибо
Sergey
Ну или в случае лютой лени: role/vars/main/anyfilename.yml
Ruslan
хорошо бы бота прикрутить к группе и карму накидывать за помощь
Alexander
Ну или в случае лютой лени: role/vars/main/anyfilename.yml
Он получается так будет все файлы в каталоге загружать?
Ruslan
Не понимаю в чем дело.🤔 я просто хочу вычленить bool из query_result и поменять на противоположное значение - name: Check db host status become: yes become_method: su become_user: postgres postgresql_query: db: postgres query: select pg_is_in_recovery() register: pg_is_in_recovery debugger: always - name: debug debug: msg: "{{ not pg_is_in_recovery.query_result | last | bool }}" debugger: always ok: [hadoop1] => msg: true [hadoop1] TASK: hive2 : debug (debug)> p task_vars['pg_is_in_recovery'] {u'changed': False, 'failed': False, u'query': u'select pg_is_in_recovery()', u'query_result': [{u'pg_is_in_recovery': False}], u'rowcount': 1, u'statusmessage': u'SELECT 1'} [hadoop1] TASK: hive2 : debug (debug)> c ok: [hadoop2] => msg: true [hadoop2] TASK: hive2 : debug (debug)> p task_vars['pg_is_in_recovery'] {u'changed': False, 'failed': False, u'query': u'select pg_is_in_recovery()', u'query_result': [{u'pg_is_in_recovery': True}], u'rowcount': 1, u'statusmessage': u'SELECT 1'} [hadoop2] TASK: hive2 : debug (debug)> c дебаг в msq на оба хоста показывает true хотя в query_result они разные 😰
Grek 🇺🇦
потому что ты не "вычленяешь", а пропускаешь через фильтр
Grek 🇺🇦
и вроде как все правильно тебе возвращает
Sergey
Не понимаю в чем дело.🤔 я просто хочу вычленить bool из query_result и поменять на противоположное значение - name: Check db host status become: yes become_method: su become_user: postgres postgresql_query: db: postgres query: select pg_is_in_recovery() register: pg_is_in_recovery debugger: always - name: debug debug: msg: "{{ not pg_is_in_recovery.query_result | last | bool }}" debugger: always ok: [hadoop1] => msg: true [hadoop1] TASK: hive2 : debug (debug)> p task_vars['pg_is_in_recovery'] {u'changed': False, 'failed': False, u'query': u'select pg_is_in_recovery()', u'query_result': [{u'pg_is_in_recovery': False}], u'rowcount': 1, u'statusmessage': u'SELECT 1'} [hadoop1] TASK: hive2 : debug (debug)> c ok: [hadoop2] => msg: true [hadoop2] TASK: hive2 : debug (debug)> p task_vars['pg_is_in_recovery'] {u'changed': False, 'failed': False, u'query': u'select pg_is_in_recovery()', u'query_result': [{u'pg_is_in_recovery': True}], u'rowcount': 1, u'statusmessage': u'SELECT 1'} [hadoop2] TASK: hive2 : debug (debug)> c дебаг в msq на оба хоста показывает true хотя в query_result они разные 😰
Как на оба? У тебя же тут разные значения, а "last" - это последний элемент списка.
Ruslan
а точно
Ruslan
выходит все проще not pg_is_in_recovery.query_result.0.pg_is_in_recovery | bool
Игорь
Подскажите, что такое group в ec2 модуле? Security group? Placement group? Autoscaling group?
Alexander
Подскажите, что такое group в ec2 модуле? Security group? Placement group? Autoscaling group?
Так там же указано: Security group (or list of groups) to use with the instance.
Игорь
Так там же указано: Security group (or list of groups) to use with the instance.
Можно линк на "там"? я читаю https://docs.ansible.com/ansible/latest/scenario_guides/guide_aws.html
Игорь
спасибо
Игорь
а amazon.aws.ec2 это то же самое, что ec2?
Alex
а amazon.aws.ec2 это то же самое, что ec2?
В 2.10 теперь коллекции
Игорь
напомните, если playbook выполняет задачи сперва на localhost, а потом на ремоут, как можно передать зарегистрированную переменную из первого этапа?
Игорь
не понимаю. - name: "Export {{ instance.instances.0.id }}" set_fact: builder_ec2_id: "{{ instance.instances.0.id }}" - hosts: just_created remote_user: ubuntu tasks: - debug: var: "{{ builder_ec2_id }}" FAILED! => {"msg": "The task includes an option with an undefined variable. The error was: 'builder_ec2_id' is undefined
Fire
не понимаю. - name: "Export {{ instance.instances.0.id }}" set_fact: builder_ec2_id: "{{ instance.instances.0.id }}" - hosts: just_created remote_user: ubuntu tasks: - debug: var: "{{ builder_ec2_id }}" FAILED! => {"msg": "The task includes an option with an undefined variable. The error was: 'builder_ec2_id' is undefined
- name: First connection: local hosts: host1 tasks: - name: register real root user to localhost facts set_fact: fact_for_host1="1" - name: Second connection: local hosts: host2 tasks: - debug: msg="{{ hostvars['host1']['fact_for_host1'] }}"
Игорь
т.е. обращаться к map hostvars.host1?
Игорь
вроде заработало
Игорь
не очень ясно зачем так сделано
Fire
не очень ясно зачем так сделано
Чтобы обратиться к переменным другого хоста.
Игорь
Чтобы обратиться к переменным другого хоста.
почему тогда все переменные других хостов/плеев автоматически не экспортируются?
Игорь
память экономим? 😂
Fire
Эм, ну как бы у тебя есть hostvars[]. Там все переменные всех хостов.
Игорь
Эм, ну как бы у тебя есть hostvars[]. Там все переменные всех хостов.
я имею в виду, зачем отдельный экспорт если все равно переменная получается не глобальная
Fire
Где экспорт?
Fire
Через set_facts ты создаёшь переменную, которая живёт только в этой сессии.
Fire
Если у тебя уже есть переменная, то set_fatcs не нужен.
Игорь
Если у тебя уже есть переменная, то set_fatcs не нужен.
то есть в моем примере выше hostvars.locahost.instance.instances.0.id будет доступен и так?
Игорь
Ну если факты о локалхосте соберёшь.
вроде бы facts это отдельная от host vars сущность?
Fire
вроде бы facts это отдельная от host vars сущность?
https://docs.ansible.com/ansible/latest/user_guide/playbooks_vars_facts.html#caching-facts
Игорь
https://docs.ansible.com/ansible/latest/user_guide/playbooks_vars_facts.html#caching-facts
ну вот же факты: hostvars['asdf.example.com']['ansible_facts']
Игорь
хотя натурально hostvars не доступны если не было gather_facts
0xDEFACE
Подскажите пожалуйста в инвентори можно переменные для хоста на разные строки перенести?
0xDEFACE
уж больно длинная линия получается
0xDEFACE
Спасибо
Grek 🇺🇦
Ребят, а как правильно нагородить такую конструкцию: - надо вычитать uuid из файла, но если файла нет - то сгенерить новый uuid чтоб потом передать его в темплейт и создать файл делаю в дефолтах __voodoo_machine_uuid: "{{ lookup('file', '/opt/S3Service/machine.uuid') | default (lookup('password', '/dev/null ') | to_uuid | upper, true) }}" но если файла нет ошибка fatal: [localhost]: FAILED! => {"msg": "An unhandled exception occurred while templating '{{ lookup('file', '/opt/S3Service/machine.uuid') | default (lookup('password', '/dev/null ') | to_uuid | upper, true) }}'. Error was a <class 'ansible.errors.AnsibleError'>, original message: 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: /opt/S3Service/machine.uuid"}