Интеграция Vagrant с Ansible
TL;DR: Vagrant автоматически генерирует inventory и запускает плейбук. Блок
config.vm.provision "ansible"в Vagrantfile. Или запуск вручную черезssh-config.
Встроенный провижинер
Vagrant.configure("2") do |config|
config.vm.box = "ubuntu/noble64"
config.vm.network "private_network", ip: "192.168.56.10"
config.vm.provision "ansible" do |ansible|
ansible.playbook = "playbook.yml"
# Группы хостов
ansible.groups = {
"webservers" => ["default"],
"all:vars" => { "env" => "dev" }
}
# Переменные
ansible.extra_vars = { http_port: 8080 }
# Verbose
ansible.verbose = "v"
end
endVagrant автоматически запускает ansible-playbook при vagrant up.
Запуск Ansible вручную
# Сохранить SSH-конфиг
vagrant ssh-config > vagrant.ssh.conf
# Запустить плейбук
ansible-playbook -i "192.168.56.10," playbook.yml \
--user vagrant \
--ssh-common-args="-F vagrant.ssh.conf"Мульти-машинный кластер + Ansible
Vagrant.configure("2") do |config|
config.vm.box = "ubuntu/noble64"
config.vm.define "web" do |web|
web.vm.network "private_network", ip: "192.168.56.10"
end
config.vm.define "db" do |db|
db.vm.network "private_network", ip: "192.168.56.11"
# Ansible запускается ТОЛЬКО после последней машины
db.vm.provision "ansible" do |ansible|
ansible.playbook = "site.yml"
ansible.limit = "all"
ansible.groups = {
"webservers" => ["web"],
"databases" => ["db"]
}
end
end
endТипичные ошибки
| Ошибка | Решение |
|---|---|
| Ansible не установлен на хосте | pip install ansible — Ansible нужен на хосте, не в VM |
ansible_local vs ansible | ansible = запуск с хоста. ansible_local = установка и запуск внутри VM |
| Provisioning не запускается повторно | vagrant provision или vagrant up --provision |