前言
本章描述了Vagrant与Ansible集成。如果对vagrant 和 ansible不太熟悉,可以先看看前面的两篇文章Ansible 环境部署和vagrant 起航。
linux环境下还没有实际操作实践,所以下面只描述windows环境下的集成。
1. 使用 ansible_local
可以用 ansible_local
在windows下使用ansible。您只需要以下的配置就可以在您的虚拟机上运行 Ansible 。
config.vm.provision "ansible_local" do |ansible|
ansible.playbook = "ansible/playbook.yml"
end
但这需要以下两个条件为前提:
· playbook.yml
文件存储在您的Vagrant的项目主目录中
· 启用默认的共享文件夹(. -> /vagrant)。
2. 如何在虚拟机安装 Ansible
您不需要连接到虚拟机去安装 Ansible,可以通过配置 vagrantfile 让 vagrant 运行预配器进行安装。
下面 ansible.install_mode
选项可以配置在虚拟机安装Ansible的方式,通常有 :default
,:pip
或 :pip_args_only
三种方式,这里使用 :pip
模式,这种模式,vagrant会尝试安装最新的pip版本。您可以通过设置 ansible.version
指定安装的ansible 版本。安装过程中如果你的机器有代理(vpn),可能会发生错误,通常情况关闭代理重新执行 vagrant provision
命令。
config.vm.provision "ansible_local" do |ansible|
ansible.playbook = "ansible/playbook.yml"
ansible.install_mode = "pip"
ansible.version = "2.9.1"
end
3. vagrant 共享文件夹
创建boxs时,Vagrant 会将项目目录默认共享到 /vagrant
,这个配置在Vagrant 主目录下的 Vagrantfile (默认为 Users~.vagrant.d\boxes... )。
配置中的同步文件夹类型是 "rsync"
,
# vagrant 默认共享文件夹
Vagrant.configure("2") do |config|
config.vm.base_mac = "5254008afee6"
config.vm.synced_folder ".", "/vagrant", type: "rsync"
end
Ansible Playbook 等文件,通常作为Vagrant项目的一部分在存储在主机上。您可以自定义共享文件,使用 Vagrant Synced Folder 与虚拟机共享文件。
config.vm.synced_folder ".", "/synced_vagrant", owner: "root", group: "vagrant"
第一个参数是主机目录的路径,相对于 vagrantfile
文件的相对路径。第二个参数是虚拟机的绝对路径, 如果文件夹不存在则去创建,如果必须的话会递归创建。
对于 owner
建议使用 root
, 否则在执行 playbook 时候,会抛出权限的问题。
注意:在设置共享文件夹的情况下,需要安装 vbguest,使用一下命令进行安装。
vagrant plugin install vagrant-vbguest
可以通过设置如下配置,禁用增强模式自动安装
config.vbguest.auto_update = false
config.vbguest.no_remote = true
- 使用以下配置,您只能在单个虚拟机上(
'master'
)安装和执行Ansible,并且去配置所有计算机。
Vagrant.configure("2") do |config|
config.vm.box = "centos/7"
config.vm.define "mysql" do |mysql|
mysql.vbguest.auto_update = false
mysql.vbguest.no_remote = true
mysql.vm.hostname="dbMysql"
mysql.vm.network "private_network" , ip: "172.16.10.3"
mysql.vm.provider "virtualbox" do |vb|
vb.name = "dbMysql"
end
end
config.vm.define "master" do |master|
master.vm.hostname = "master"
master.vm.network "private_network", ip: "172.16.10.1"
master.vm.synced_folder ".", "/synced_vagrant", owner: "root", group: "vagrant"
master.vm.provider "virtualbox" do |vb|
vb.name = "master"
end
master.vm.provision "ansible_local" do |ansible|
ansible.playbook = "ansible/playbook.yml"
ansible.install_mode = "pip"
ansible.version = "2.9.1"
ansible.verbose = true
ansible.install = true
# 禁用默认限制以连接到所有计算机
ansible.limit = "all"
ansible.inventory_path = "inventory"
end
end
end
如果您了解 ansible,应该会知道 inventory
,所以您需要创建一个inventory与您的Vagrantfile计算机定义相对应的静态文件,使用ansible.inventory_path
命令进行关联:
[nodes]
master ansible_host=172.16.10.1 ansible_ssh_private_key_file=/synced_vagrant/.vagrant/machines/master/virtualbox/private_key
mysql ansible_host=172.16.10.3 ansible_ssh_private_key_file=/synced_vagrant/.vagrant/machines/mysql/virtualbox/private_key
最后,您必须还要创建 ansible.cfg
文件, 以完全禁用SSH主机密钥检查:
[defaults]
host_key_checking = no
[ssh_connection]
ssh_args = -o ControlMaster=auto -o ControlPersist=60s -o UserKnownHostsFile=/dev/null -o IdentitiesOnly=yes
- 本章不设计如何使用Ansible或如何编写Ansible剧本,这边只是写个简单的例子,用于测试配置是否正确:
---
- name: say 'hello world'
hosts: all
tasks:
- name: echo 'hello world'
command: echo 'hello world'
register: result
- name: print stdout
debug:
msg: ""
如果您在在使用的过程中有修改配置文件或playbook,在执行性 vagrant provision
之前先执行 vagrant rsync
,因为共享文件夹是使用 "rsync" 类型, 它不会实时的同步文件。
最后
看下成果,完美成功