首页 文章

多窗口安装与窗户上的流浪汉

提问于
浏览
2

目的

我想要在Windows上运行虚拟机vm 's on my windows 8 machine [via Vagrant]. Everything needs to run locally and since Ansible doesn' t,我使用ansible作为控制机器来引导debian vm . This code就是一个例子 . 在与系统挣扎之后我得到了一些工作,但并不完全(虽然ansible不告诉我) .

问题

What configuration is required for a multi-machine setup using ansible [in a vm], vagrant and virtualbox [on windows host] 如果我们想要:

  • ssh从主机访问ansible-vm以及所有从站

  • ssh从ansible-vm访问所有从属服务器

如果可能的话,

  • 能够保护多机网络免受主机网络的影响

问题

运行 ansible -m ping -all -i path-to-hosts 会产生ssh错误 . 似乎ansible试图到达名为web1和db1的机器,但找不到这样的主机 .

Build 用户连接:vagrant REMOTE_MODULE ping ESTABLISH CONNECTION FOR USER:vagrant REMOTE_MODULE ping EXEC ['ssh',' - C',' - pet',' - vvv',' - o','ControlMaster = auto',' -o','ControlPersist = 60s',' - o','ControlPath = / home / vagrant / .ansible / cp / ansible-ssh-%h-%p-%r',' - o','KbdInteractiveAuthentication = no',' - o','PreferredAuthentications = gssapi-with-mic,gssapi-keyex,hostbased,publickey',' - o','PasswordAuthentication = no',' - o','ConnectTimeout = 10','web1 ',“/ bin / sh -c'mkdir -p $ HOME / .ansible / tmp / ansible-tmp-1398362619.41-142470238612762 && chmod a rx $ HOME / .ansible / tmp / ansible-tmp-1398362619.41-142470238612762 && echo $ HOME / .ansible / tmp / ansible-tmp-1398362619.41-142470238612762'“] EXEC以前已知的主机文件找不到web1 EXEC ['ssh',' - C',' - t'',' - vvv',' - o ','ControlMaster = auto',' - o','ControlPersist = 60s',' - o','ControlPath = / home / vagrant / .ansible / cp / ansible-ssh-%h-%p-%r' ,' - o','KbdInteractiveAuthentication = no',' - o','PreferredAuthentications = gssapi-with-mic,gssa pi-keyex,hostbased,publickey',' - o','PasswordAuthentication = no',' - o','ConnectTimeout = 10','db1',“/ bin / sh -c'mkdir -p $ HOME / . ansible / tmp / ansible-tmp-1398362619.41-4982781019922 && chmod a rx $ HOME / .ansible / tmp / ansible-tmp-1398362619.41-4982781019922 && echo $ HOME / .ansible / tmp / ansible-tmp-1398362619.41-4982781019922'“]为db1 web1 |找不到EXEC以前已知的主机文件FAILED => SSH遇到未知错误 . 输出为:OpenSSH_6.0p1 Debian-4,OpenSSL 1.0.1e 2013年2月11日debug1:读取配置数据/ etc / ssh / ssh_config debug1:/ etc / ssh / ssh_config第19行:应用* debug1:auto-mux的选项:尝试现有主调试器1:控制套接字“/home/vagrant/.ansible/cp/ansible-ssh-web1-22-vagrant”不存在debug2:ssh_connect:needpriv 0 ssh:无法解析主机名web1:名称或服务未知db1 | FAILED => SSH遇到未知错误 . 输出为:OpenSSH_6.0p1 Debian-4,OpenSSL 1.0.1e 2013年2月11日debug1:读取配置数据/ etc / ssh / ssh_config debug1:/ etc / ssh / ssh_config第19行:应用* debug1:auto-mux的选项:尝试现有主调试器1:控制套接字“/home/vagrant/.ansible/cp/ansible-ssh-db1-22-vagrant”不存在debug2:ssh_connect:needpriv 0 ssh:无法解析主机名db1:名称或服务未知

代码

以下代码尝试配置1. ansible-master:运行ansible的控制机器1. db1:数据库服务器1. web1:Web服务器

Vagrantfile

Vagrant.configure("2") do |config|
  config.vm.box = "wheezy64"
  config.vm.box_url = "http://puppet-vagrant-boxes.puppetlabs.com/debian-70rc1-x64-vbox4210.box"
  config.vm.synced_folder ".", "/vagrant", :mount_options => ['dmode=777','fmode=666']

  config.vm.network :public_network

  config.vm.provider "virtualbox" do |v|
      v.customize [
          "modifyvm", :id,
          "--groups", "/Vagrant/Ansible",
         # "--natdnshostresolver1", "on"
      ]
  end

  config.vm.define :ansiblemaster do |ansiblemaster|
   # ansiblemaster.vm.network :private_network, ip: "192.168.111.101"
   ansiblemaster.vm.hostname = "ansiblemaster"
   # ansiblemaster.vm.network :forwarded_port, guest: 80, host: 8080
    ansiblemaster.ssh.forward_agent = true


    ansiblemaster.vm.provider :virtualbox do |vb|
      vb.customize ["modifyvm", :id, "--memory", 512]
      vb.customize ["modifyvm", :id, "--name", "ansible-master"]
      vb.name = "ansiblemaster"
    end

    ansiblemaster.vm.provision :shell, :inline =>
      "if [[ ! -f /apt-get-run ]]; then sudo apt-get update && sudo touch /apt-get-run; fi"



    ansiblemaster.vm.provision :shell do |sh|
      sh.path = "provision.sh"
      sh.args = "./ansible provisioning/site.yml provisioning/hosts/dev_hosts"
    end
  end

  config.vm.define :web1 do |slave|
   slave.vm.hostname = "web1"
   # slave.vm.network :private_network, ip: "192.168.111.201"
    slave.vm.synced_folder "./src", "/var/www/site", id: "proj-root"
    slave.vm.provider :virtualbox do |vb|
      vb.name = "web1"
      vb.customize ["modifyvm", :id, "--memory", "512"]
    end
  end

  config.vm.define :db1 do |slave|
    slave.vm.hostname = "db1"
    #slave.vm.network :private_network, ip: "192.168.111.202"
    slave.vm.provider :virtualbox do |vb|
      vb.name = "db1"
      vb.customize ["modifyvm", :id, "--memory", "512"]
    end
  end
end

Provision.sh

#!/bin/bash

ANSIBLE_DIR=$1
ANSIBLE_PLAYBOOK=$2
ANSIBLE_HOSTS=$3
TEMP_HOSTS="/tmp/ansible_hosts"

if [ ! -f /vagrant/$ANSIBLE_PLAYBOOK ]; then
  echo "Cannot find Ansible playbook"
  exit 1
fi

if [ ! -f /vagrant/$ANSIBLE_HOSTS ]; then
  echo "Cannot find Ansible hosts"
  exit 2
fi

if [ ! -d $ANSIBLE_DIR ]; then
  echo "Updating apt cache"
  apt-get update
  echo "Installing Ansible dependencies and Git"
  apt-get install -y git python-yaml python-paramiko python-jinja2
  echo "Cloning Ansible"
  git clone git://github.com/ansible/ansible.git ${ANSIBLE_DIR}
fi

cd ${ANSIBLE_DIR}
cp /vagrant/${ANSIBLE_HOSTS} ${TEMP_HOSTS} && chmod -x ${TEMP_HOSTS}
echo "Running Ansible"
echo "dir is nu: " $(pwd)

source hacking/env-setup
echo "source ${ANSIBLE_DIR}/hacking/env-setup" >> /home/vagrant/.bashrc
ansible-playbook /vagrant/${ANSIBLE_PLAYBOOK} --inventory-file=${TEMP_HOSTS} --connection=local

rm ${TEMP_HOSTS}

provsioning / hosts / dev_hosts

[webservers]
web1

[dbservers]
db1

3 回答

  • -1

    这是一个非常长的问题 . Ansible无法弄清楚dns“ ssh: Could not resolve hostname web1: Name or service not known

    选项1

    我喜欢简化我使用静态IP vm.network :private_network, ip: "xxx.xxx.xxx.xxx" 启动我的流浪者vm并编辑我的ansible主机文件

    provsioning/hosts/dev_hosts

    [webservers]
    web1     ansible_ssh_host=xxx.xxx.xxx.xxx
    
    [dbservers]
    db1     ansible_ssh_host=xxx.xxx.xxx.yyy
    

    选项2

    使用DNS或hosts文件

    希望有所帮助

  • 1

    回答我自己的问题:通过升级ansible并导入 Provision.sh 中其他机器的ssh键来解决问题 .

    # fix permissions on private key file
    chmod 600 /home/vagrant/.ssh/id_rsa
    
    # add web/database hosts to known_hosts (IP is defined in Vagrantfile)
    ssh-keyscan -H 192.168.51.4 >> /home/vagrant/.ssh/known_hosts
    ssh-keyscan -H 192.168.52.4 >> /home/vagrant/.ssh/known_hosts
    chown vagrant:vagrant /home/vagrant/.ssh/known_hosts
    
    # reload ssh in order to load the known hosts
    /etc/init.d/ssh reload
    
  • 1

    使用"normal" Ansible模块来管理Windows框是不可能的 . 相反,你必须使用windows modules之一 . ping也是如此 . 它试图通过SSH连接到Windows框,这不起作用 .

    就像skinnedknuckles已经说过的那样,Ansible使用原生的Powershell远程处理(和WinRM)而不是SSH来与Windows机器进行通信 . 所以win_ping module是在Windows机器上ping Ansible的正确方法:

    ansible -m win_ping -all -i path-to-hosts
    

    我假设您准备了Windows 8 VM,如docs are describing!?!如果没有,有this blog post解释如何执行所有步骤,包括 . 以非常紧凑的形式使用 winrm 连接进行流动设置 .

相关问题