Могу ли я изменить цель Ansible в полете?
Я запускаю виртуальные машины KVM на железных хостах. Чтобы раскрутить новые виртуальные машины, я бы:
virt-clone
шаблонvirt-sysprep
клон, чтобы сделать некоторые основные изменения- Запустите клонированную ВМ
- Используйте Ansible для дальнейшей настройки
В настоящее время первые 3 шага выполняются с использованием 1 скрипта Ansible, а последний - с другим. Первый скрипт действует на голом железном хосте, а второй - на виртуальной машине.
У меня вопрос, это может быть выполнено в 1 сценарий? Одна возможность состоит в том, чтобы изменить inventory_hostname
во время полета в игровой книге, предназначенной для виртуальной машины после шага 3. Однако я считаю, что это невозможно.
Есть лучший способ сделать это? Заранее спасибо!
1 ответ
Решение проще, чем я думал - используйте delegate_to
, В моей роли Ansible некоторые задачи были направлены на физический хост, на котором запущена виртуальная машина. Остальные были нацелены на виртуальный хост.
В этом примере один скрипт создает виртуальную машину на "голом железе", а затем подготавливает виртуальную машину. delegate_to
выполняет virt-clone
команда на металлическом хосте ВМ.
- name: Clone template's KVM definition
command: virt-clone -o {{ template_name }} -n {{ clone_name }} -f {{ clone_lvm }}
delegate_to: "{{ metal_host }}"
- name: "Wait for VM to bootup"
local_action: wait_for host="{{ ansible_host }}" port=22 timeout=60
- name: Gather facts for first time
setup:
- name: Install packages
apt:
name: auditd,ntp,apache2
state: present