Vladimir
@hood4real то что ты хотел?
Nikolay
Читаю. Думаю что да, спасибо!
Sergey
Антон
Sergey
А для многих уже да :)
На главной же: automation engine. Я даже хз, как это превращается в automation language.
George
это примерно как использовать гитлаб как ЕТЛ инструмент, ога
Павел П.
Доброе утро!
Ничего странного не хочу, хочу в облаке склонировать сервер, включить его, прописать его днс, затем настроить. По отдельным ролям всё работает.
Как правильно решается проблема того, что изначально записи о сервере нет в файле inventory?
После клонирования и получения айпишника для всех остальные тасков в ролях прописывать delegate_to: new_ansible_ssh_host? Как-то костыльно и роль не многоразовой становится.
Или новую запись явно приписать в файл инвентори и для дальнейших тасок подхватится delegate_to: {{new_dns_name}}
Или всё это вообще разбивается на два отдельных плейбука?
Timur
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
Alex
inqfen
И приносит новые
Alex
проблем все таки меньше, чем плюшек, но это имхо
Павел П.
inqfen
Ну тут от задач зависит
inqfen
С терраформом плохо, если нужны изменения, он при любом чихе хочет ресурс пересоздать
Eduard
inqfen
Ну и что-то типа выключить инстанс - сменить тип - проверить что поднялся - перейти к следующему, вырастает в геморрой
inqfen
Я молчу про всякие действия по пути типа сменить мастера
Eduard
(А бухать и сам приеду)
Павел П.
да я понял) спасибо. Приезжай, да
ep4sh
Можно
Спасибо!
А второй вопрос: можно ли использовать интерполяцию в условиях?
when: {{ var }} == "blabla"
Alex
ep4sh
как быть если надо?
ep4sh
var.stdout?
Alex
да
Alex
> С терраформом плохо, если нужны изменения, он при любом чихе хочет ресурс пересоздать
так это плюс. А то тебе надо обновить теги например, а ансибл тебе говорит что ресурс есть, ничего обновлять не надо. Тип инстанса меняется без проблем. Там есть опция ignore_changes как раз для таких случаев
inqfen
inqfen
А это был какой-то там член кластера, галеры например, ныне пропавший
Alex
а ансибл чудесным образом умеет без пересоздания?
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
Timur
{{ }}
Timur
ep4sh
Спасибо сейчас попробую
𝚔𝚟𝚊𝚙𝚜
блин, ну неужели нет более элегантного решения?
{% if lookup('env','MY_ENV') != '' %}{{ lookup('env','MY_ENV') }}{% else %}default_value{% endif %}
Sergey
Sergey
Можно ещё правила перечитать.
𝚔𝚟𝚊𝚙𝚜
{{ lookup('env','MY_VAR') | regex_replace('^$', 'default_value') }}но это швах
Sergey
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
Sergey
ShadoWalkeR
Странно - работает. Спасибо
Sergey
Ничего странного. Обычный многоуровневый словарь, только что один из ключей задан переменной.
Вообще все переменные при запуске «сплющиваются» в hostvars[ansible_hostname] - с учётом приоритетов, конечно. Это стоит запомнить и применять.
ShadoWalkeR
Ну первое что в гугле было - отправило к vars а с ним уже не все так однозначно оказалось - пришлось идти задавать вопросы)
Sergey
ShadoWalkeR
Благодарю - почитаю на досуге