Vladimir
@hood4real то что ты хотел?
Nikolay
Читаю. Думаю что да, спасибо!
Sergey
Если абстрагироваться от AWS, то вопрос звучит так - как перезапустить упавший джоб с другим значением параметра? было: copy: src: A dest: b Если упало, то попробовать выполнить copy: src: B dest: b
#странное Ansible - не язык программирования. А ты пытаешься обработать исключение, которое ещё и на внешний ресурс завязано O_o
Sergey
А для многих уже да :)
На главной же: automation engine. Я даже хз, как это превращается в automation language.
Антон
На главной же: automation engine. Я даже хз, как это превращается в automation language.
Слишком богатый по возможностям :) Циклы есть, ветвления тоже и переменные - для многих это язык программирования
George
это примерно как использовать гитлаб как ЕТЛ инструмент, ога
Павел П.
Доброе утро! Ничего странного не хочу, хочу в облаке склонировать сервер, включить его, прописать его днс, затем настроить. По отдельным ролям всё работает. Как правильно решается проблема того, что изначально записи о сервере нет в файле inventory? После клонирования и получения айпишника для всех остальные тасков в ролях прописывать delegate_to: new_ansible_ssh_host? Как-то костыльно и роль не многоразовой становится. Или новую запись явно приписать в файл инвентори и для дальнейших тасок подхватится delegate_to: {{new_dns_name}} Или всё это вообще разбивается на два отдельных плейбука?
Timur
Клонирование и прочие инфраструктурные операции в одном плее на мастере
Timur
После того, как инфра готова, добавляем сервер в инвентарь через add_host или банально юзаем dynamic_inventory
Timur
И следующим плеем уже делаем провижн на соответствующую группу хостов, в которую был включен новый хост
Timur
Никаких delegate при этом не требуется
Павел П.
круто! спасибо большое! погуглю как отдельные плеи делаются
Alex
круто! спасибо большое! погуглю как отдельные плеи делаются
там все просто - name: Configure Database hosts: database_instance roles: - { role: common } - { role: docker, when: artifactory_provisioner == "docker" } - { role: application/database } - name: Configure Artifactory hosts: artifactory_instance roles: - { role: common } - { role: docker, when: artifactory_provisioner == "docker" } - { role: application/artifactory }
Alex
это и есть два плея
Timur
- name: Create a sandbox instance hosts: localhost gather_facts: False vars: keypair: my_keypair instance_type: m1.small security_group: my_securitygroup image: my_ami_id region: us-east-1 tasks: - name: Launch instance ec2: key_name: "{{ keypair }}" group: "{{ security_group }}" instance_type: "{{ instance_type }}" image: "{{ image }}" wait: true region: "{{ region }}" vpc_subnet_id: subnet-29e63245 assign_public_ip: yes register: ec2 - name: Add new instance to host group add_host: hostname: "{{ item.public_ip }}" groupname: launched loop: "{{ ec2.instances }}" - name: Wait for SSH wait_for: port: '{{ ssh_port }}' host: '{{ item.public_dns_name }}' delay: 2 timeout: 320 loop: "{{ ec2.instances }}" - name: Configure instance(s) hosts: launched become: True gather_facts: True roles: - my_awesome_role - my_awesome_test Как-то так можно, например
Gleb
https://www.ansible.com/blog/thoughts-on-restructuring-the-ansible-project
inqfen
И приносит новые
Alex
проблем все таки меньше, чем плюшек, но это имхо
inqfen
Ну тут от задач зависит
inqfen
С терраформом плохо, если нужны изменения, он при любом чихе хочет ресурс пересоздать
Eduard
сохронил) еще раз спасибо!
Хай, приходи, есчо)
inqfen
Ну и что-то типа выключить инстанс - сменить тип - проверить что поднялся - перейти к следующему, вырастает в геморрой
inqfen
Я молчу про всякие действия по пути типа сменить мастера
Павел П.
Хай, приходи, есчо)
до вас ехать долго))
Eduard
до вас ехать долго))
Я про лс и линупсы с ансамблями
Eduard
(А бухать и сам приеду)
Павел П.
да я понял) спасибо. Приезжай, да
ep4sh
Можно
Спасибо! А второй вопрос: можно ли использовать интерполяцию в условиях? when: {{ var }} == "blabla"
ep4sh
как быть если надо?
ep4sh
var.stdout?
Alex
да
Alex
> С терраформом плохо, если нужны изменения, он при любом чихе хочет ресурс пересоздать так это плюс. А то тебе надо обновить теги например, а ансибл тебе говорит что ресурс есть, ничего обновлять не надо. Тип инстанса меняется без проблем. Там есть опция ignore_changes как раз для таких случаев
inqfen
А это был какой-то там член кластера, галеры например, ныне пропавший
Alex
а ансибл чудесным образом умеет без пересоздания?
inqfen
а ансибл чудесным образом умеет без пересоздания?
Да, больше ресурсов без пересоздания всего меняется
inqfen
Ну и всякие вещи, типа решил ты в терраформе диск в aws увеличить
inqfen
А он вместо увеличения удаляется и создается новый, большего размера
inqfen
До 0.11.13 и смена типа в терраформе только через пересоздание была
inqfen
В общем пока там часто больше геморроя становится, но для того, что особо изменяться не собирается - самое то
inqfen
Еще бы завезли наконец типа динамик стейт какой
ep4sh
да
Если я получаю ошибку, что нет аттрибута, как быть?: "msg": "The conditional check 'dev_type.stdout == \"xvd\"' failed. The error was: error while evaluating conditional (dev_type.stdout == \"xvd\"): 'ansible.parsing.yaml.objects.AnsibleUnicode object' has no attribute 'stdout'
inqfen
Не использовать этот аттрибут, а использовать какой есть
ep4sh
Не использовать этот аттрибут, а использовать какой есть
defaults.yml: dev_type: ansible_facts['devices'].keys()[0][0:3] task.yml: - name: mount ebs disks become: yes import_tasks: lvm-ebs.yml when: dev_type == "xvd" ********************************************* Если напишу: - name: mount ebs disks become: yes import_tasks: lvm-ebs.yml when: ansible_facts['devices'].keys()[0][0:3] == "xvd" То работает исправно
ep4sh
https://paste.ubuntu.com/p/vcgf55K8Qp/
ep4sh
Если с переменной, то просто скипает task
inqfen
set_fact сделай
inqfen
set_fact: dev_type: ansible_facts['devices'].keys()[0][0:3]
Timur
{{ }}
ep4sh
Спасибо сейчас попробую
ep4sh
В дефолтах вы скобки забыли для значения переменной
Хорошо когда не знал а еще и забыл! Огромное спасибо! =)
𝚔𝚟𝚊𝚙𝚜
блин, ну неужели нет более элегантного решения? {% if lookup('env','MY_ENV') != '' %}{{ lookup('env','MY_ENV') }}{% else %}default_value{% endif %}
Sergey
блин, ну неужели нет более элегантного решения? {% if lookup('env','MY_ENV') != '' %}{{ lookup('env','MY_ENV') }}{% else %}default_value{% endif %}
У ансибла есть встроенный механизм передачи параметров командной строки через extra-vars.
Sergey
Можно ещё правила перечитать.
𝚔𝚟𝚊𝚙𝚜
{{ lookup('env','MY_VAR') | regex_replace('^$', 'default_value') }}но это швах
Sergey
{{ lookup('env','MY_VAR') | regex_replace('^$', 'default_value') }}но это швах
Можно свой lookup_plugin написать - благо, он будет базироваться на существующем.
Sergey
https://github.com/ansible/ansible/blob/devel/lib/ansible/plugins/lookup/env.py#L42
Sergey
Делов-то - убедиться, что os.getenv вернула пустую строку, и бросить ошибку. Тогда нормально будет отрабатывать фильтр default. А как это сделать корректно - вот пример: https://github.com/ansible/ansible/blob/devel/lib/ansible/plugins/lookup/file.py#L80
inqfen
О, кстати, хорошо что напомнил
inqfen
Собирался писать инвентори плагин для linode (половину в виде скрипта кже написал) и подумал, что а вдруг уже есть
inqfen
А он таки есть
Sergey
А он таки есть
Ну тип да, многое нужно либо правильно искать, либо минимально доработать напильником.
Sergey
В данном случае прям идеальный пример, кстати.
Anonymous
@ShadoWalkeR31 будет жить. Поприветствуем!
ShadoWalkeR
Господа! Есть вопрос. Скажем есть такие вот переменные: AAA: INSTALL: - packageA PIP: - python-foo BBB: INSTALL: - packageB Есть переменная ROLE в которой хранится AAA или BBB. Как мне написать чтото вроде такого: - pip: name={{ item }} loop: "{{ ROLE.PIP }}" when: ROLE.PIP is defined - package: name={{ item }} state=present loop: "{{ ROLE.INSTALL }}" when: ROLE.INSTALL is defined
ShadoWalkeR
Я пробовал через vars[] собрать, но vars[ROLE] выводит все содержимое, а вот vars[ROLE + '.INSTALL'] выдает udefined variable
ShadoWalkeR
Странно - работает. Спасибо
Sergey
Ничего странного. Обычный многоуровневый словарь, только что один из ключей задан переменной. Вообще все переменные при запуске «сплющиваются» в hostvars[ansible_hostname] - с учётом приоритетов, конечно. Это стоит запомнить и применять.
ShadoWalkeR
Ну первое что в гугле было - отправило к vars а с ним уже не все так однозначно оказалось - пришлось идти задавать вопросы)
ShadoWalkeR
Благодарю - почитаю на досуге