Vagrant和Ansible集成

前言

本章描述了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" 类型, 它不会实时的同步文件。

最后

看下成果,完美成功


7BE24B65-FD7F-4278-B3BF-1F31D2E4007D.png

参考文献

Ansible Local Provisioner
Basic UsageBasic Usage

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容