【问题标题】:Ansible provider running at each Vagrant machine during provision配置期间在每台 Vagrant 机器上运行的 Ansible 提供程序
【发布时间】:2020-06-08 03:48:04
【问题描述】:

我正在创建一个调用 Ansible playbook 的 Vagrantfile。哪个运行良好。

我的问题是,由于我在 vagrant 上使用“每个”循环进行部署,因此每次创建机器时都会运行 Ansible 剧本。预期的行为是 Ansible 提供程序在所有 VM 启动后才运行。

我的 Vagrantfile 编码如下:

    # -*- mode: ruby -*-
# vi: set ft=ruby :
# Define Vagrant API version, the virtualization provider and the location of the param file and its name:
VAGRANTFILE_API_VERSION = "2"
VIRT_PROVIDER="virtualbox"
VM_PARAM_FILE = 'params.yml'
ANSIBLE_PLAYBOOK = "/Users/dzarpelon/Documents/DevOps/Projects/Confluence_Lab/ansible/playbook.yml"
#define secure ssh key location
ssh_pub_key = File.readlines("#{Dir.home}/.ssh/devops_key.pub").first.strip
# Require Yaml module, this is needed to read the 'params.yml' file.
require 'yaml'
# Read 'params.yml' file
servers = YAML.load_file(File.join(File.dirname(__FILE__), VM_PARAM_FILE))
# Create boxes as needed
Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
  config.vm.provision "ansible" do |ansible|
      ansible.playbook = ANSIBLE_PLAYBOOK
      ansible.force_remote_user = TRUE
  end #end ansible provisioning
  # ensure that all Vagrant machines will use the same SSH key pair.
  config.ssh.insert_key = false
  if Vagrant.has_plugin?("vagrant-cachier")
    config.cache.scope = :box
  end #end of cache plugin configuration
  if Vagrant.has_plugin?("vagrant-hostmanager")
    config.hostmanager.enabled = true
    config.hostmanager.manage_host = true
    config.hostmanager.ignore_private_ip = false
    config.hostmanager.include_offline = true
  end # end of hostmanager plugin
  #execute for each entry on the params file
  servers.each do |servers|
    config.vm.define servers["name"] do |srv|
      srv.vm.box = servers["box"]
      srv.vm.network servers["network_type"], ip: servers["ip"]
      srv.vm.hostname = servers["name"]
      srv.hostsupdater.aliases = [servers["name"]]
      srv.vm.provider VIRT_PROVIDER do |v|
        v.name = servers["name"]
        v.memory = servers["ram"]
      end #end provider
    end # end config loop
  end # end servers loop


end #end of Vagrant.Configure

如您所见,Ansible 配置步骤是在“每个”循环之外完成的,并且在创建每个 VM 后仍会运行。

关于如何仅在所有虚拟机都由该循环创建后运行 Ansible 有什么想法吗?

非常感谢您的帮助!

【问题讨论】:

    标签: ansible vagrant vagrantfile


    【解决方案1】:

    The fine manual 似乎解决了您非常担心的问题,他们的建议是保护.provision 块仅在最后一台机器上运行,从而确保 - 根据他们的文档 - 配置将在最后一台机器上运行机器已启动。

    根据您的使用情况,您需要切换到.each_index 以识别您何时到达最后一个:

      servers_length = servers.length
      servers.each_index do |s_idx|
         # your code snippet was also shadowing the global `servers`
         # by your block variable, which is a bug waiting to happen
         server = servers[s_idx]
         is_last = s_idx + 1 == servers_length
    
         config.vm.define servers["name"] do |srv|
           # ... all your other srv statements ...
           if is_last
             srv.vm.provision "ansible" do |ansible|
               ansible.limit = "all"
               ansible.playbook = ANSIBLE_PLAYBOOK
               ansible.force_remote_user = TRUE
             end
           end
         end
      end
    

    【讨论】:

    • 嘿@mdaniel。谢谢你的建议。我正在尝试,但似乎我错过了一些东西。我在 brant validate 后得到的错误是:Vagrantfile:36:in `[]': no implicit conversion of String into Integer (TypeError) 有什么想法吗?
    • 需要注意的一点是我的参数文件如下: --- name: proxy-1 box:bento/centos-8.1 ram: 1024 ip: 192.168.1.10 network_type: private_network #synced_folder_src : "synced/" #synced_folder_dst: "/usr/share/nginx/html/"
    • servers.each_index 做 |s_idx| server = servers[s_idx] is_last = s_idx + 1 == server_length config.vm.define servers["name"] do |srv| srv.vm.provider VIRT_PROVIDER 做 |v| v.name = servers["name"] v.memory = servers["ram"] if is_last srv.vm.provision "ansible" 做 |ansible| ansible.limit = "all" ansible.playbook = ANSIBLE_PLAYBOOK ansible.force_remote_user = TRUE end end end
    • edit your question 而不是试图将代码塞入 cmets; cmets 用于澄清问题,而不是用于代码
    猜你喜欢
    • 2015-01-26
    • 1970-01-01
    • 2016-07-21
    • 1970-01-01
    • 2017-09-26
    • 1970-01-01
    • 2014-06-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多