首页 文章

与Vagrant合作:从Vagrantfile“extra_vars”中读取库存

提问于
浏览
3

我们的本地开发盒正在运行Virtualbox / Vagrant,由ansible提供 . 现在我们为盒子设置一个固定的IP地址,我们需要在三个不同的地方使用它 . 我们的Vagrantfile看起来像这样:

# Set the Vagrantbox IP address
VAGRANT_NETWORK_IP = "10.0.0.10"

# Set the Ansible configuration environment variable
ENV['ANSIBLE_CONFIG'] = "./ansible/.ansible.cfg"

Vagrant.configure("2") do |config|
  config.vm.box     = "ubuntu-precise-64"
  config.vm.box_url = "http://cloud-images.ubuntu.com/vagrant/precise/current/precise-server-cloudimg-amd64-vagrant-disk1.box"
  config.vm.network "forwarded_port", guest: 80, host: 8080
  config.vm.network :private_network, ip: VAGRANT_NETWORK_IP
  config.vm.synced_folder ".", "/var/www"

  config.vm.provision "ansible" do |ansible|
    ansible.playbook       = "ansible/playbook.yml"
    ansible.limit          = "all"
    ansible.inventory_path = "ansible/hosts/vagrant"
    ansible.extra_vars     = {target: VAGRANT_NETWORK_IP}
  end

end

我们的ansible剧本:

---
- hosts: "{{ target }}"
  sudo: yes
  roles:
    # ...

我们的库存文件:

10.0.0.10 ansible_ssh_user=vagrant ansible_ssh_private_key_file=~/.vagrant.d/insecure_private_key

我们使用变量VAGRANT_NETWORK_IP重用了Vagrantfile中的IP地址 . 但是,我们仍需要在我们的库存中设置此IP地址 . Is it possible to use an ansible variable as host in your inventory file ?只在清单中使用 {{target}} 不起作用 .

或者,有没有办法让这种更容易的花药方式?如果可能,我们希望在单个文件中配置IP地址框 .

1 回答

  • 5

    Vagrantfile只是一个普通的ruby文件,因此您可以从中生成库存文件:

    File.open('ansible/hosts/vagrant' ,'w') do |f|
      f.write "[default]\n"
      f.write "#{VAGRANT_NETWORK_IP} ansible_ssh_user=vagrant ansible_ssh_private_key_file=~/.vagrant.d/insecure_private_key\n"
    end
    

    默认情况下,vagrant box以名称“default”开头,因此我通常将ansible-managed主机限制为vagrant的一个(您可以设置ansible.limit =“default”) .

    如果您想拥有一个带有一个清单的流浪箱,您可以在一个Vagrantfile中定义这些框并为其生成清单 .

相关问题