我在裸机主机上运行 KVM 虚拟机。要启动新的虚拟机,我会:
virt-clone
模板virt-sysprep
克隆进行一些基本的更改- 启动克隆的虚拟机
- 使用 Ansible 进行进一步配置
目前前3步使用1个Ansible脚本完成,最后一步使用另一个脚本完成。第一个脚本作用于裸机主机,第二个脚本作用于VM。
我的问题是,这可以在 1 个脚本中完成吗?一种可能性是inventory_hostname
在步骤 3 之后更改剧本中的运行以定位 VM。但是,我认为这是不可能的。
有没有更好的方法?提前谢谢!
答案1
解决方案比我想象的要简单——使用delegate_to
。在我的 Ansible 角色中,一些任务被定向到运行 VM 的物理主机。其余的则针对虚拟主机。
在此示例中,单个脚本在裸机上创建虚拟机,然后配置虚拟机本身。在虚拟机的金属主机上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