Мультимашинная настройка с помощью vagrant на Windows

Цель

Я хочу, чтобы ansible предоставил виртуальные box vm's на моей машине с Windows 8 [через Vagrant]. Все должно работать локально, и поскольку Ansible не работает в Windows, я загружаю Debian VM с ansible в качестве управляющего компьютера. Этот код послужил примером. После борьбы с системой у меня все получилось, но не полностью (хотя ansible не говорит мне).

Вопрос

Какая конфигурация требуется для установки на нескольких машинах с использованием ansible [в vm], vagrant и virtualbox [на хосте windows], если мы хотим:

  1. SSH получает доступ от хост-компьютера к ansible-vm, а также ко всем ведомым

  2. SSH доступ от ansible-vm всем рабам

  3. возможность экранирования сети с несколькими машинами от сети хоста, если это возможно

проблема

Бег ansible -m ping -all -i path-to-hosts выдает ssh ошибки. Кажется, ansible пытается получить доступ к машинам с именами web1 и db1, но не может найти такие хосты.

УСТАНОВИТЬ СОЕДИНЕНИЕ ДЛЯ ПОЛЬЗОВАТЕЛЯ: vagrant REMOTE_MODULE ping УСТАНОВИТЬ СОЕДИНЕНИЕ ДЛЯ ПОЛЬЗОВАТЕЛЯ: vagrant REMOTE_MODULE ping EXEC ['ssh', '-C', '-tt', '-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, на базе хоста,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', '-tt', '-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, на базе хоста,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.41224927999 EXEC предыдущий известный файл хоста не найден для db1 web1 | FAILED => SSH обнаружил неизвестную ошибку. Вывод был следующим: OpenSSH_6.0p1 Debian-4, OpenSSL 1.0.1e 11 февраля 2013 г. debug1: чтение данных конфигурации /etc/ssh/ssh_config debug1: /etc/ssh/ssh_config строка 19: применение параметров для * debug1: auto-mux: Попытка существующего главного debug1: сокета управления "/home/vagrant/.ansible/cp/ansible-ssh-web1-22-vagrant" не существует debug2: ssh_connect: needpriv 0 ssh: Не удалось разрешить имя хоста web1: Имя или служба неизвестна

дб1 | FAILED => SSH обнаружил неизвестную ошибку. Вывод был следующим: OpenSSH_6.0p1 Debian-4, OpenSSL 1.0.1e 11 февраля 2013 г. debug1: чтение данных конфигурации /etc/ssh/ssh_config debug1: /etc/ssh/ssh_config строка 19: применение параметров для * debug1: auto-mux: Попытка существующего главного debug1: управляющего сокета "/home/vagrant/.ansible/cp/ansible-ssh-db1-22-vagrant" не существует debug2: ssh_connect: needpriv 0 ssh: не удалось разрешить имя хоста db1: имя или служба неизвестна

Код

Следующий код пытается обеспечить 1. ansible-master: управляющий компьютер, на котором выполняется ansible 1. db1: сервер базы данных 1. web1: веб-сервер

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 / хосты /dev_hosts

[webservers]
web1

[dbservers]
db1

3 ответа

Решение

Чтобы ответить на мой собственный вопрос: проблема была решена путем обновления ansible и импорта ключей ssh ​​других машин в Provision.sh,

# 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

Это действительно длинная проблема вопроса. Ansible не может определить DNS "ssh: не удалось разрешить имя хоста web1: имя или служба не известны"

Опция 1

Мне нравится упрощать, я загружаю свой vagrant vm со статическим ip vm.network: private_network, ip: "xxx.xxx.xxx.xxx" и редактирую свой ANSIBLE файл хоста

provsioning / хосты / dev_hosts

[webservers]
web1     ansible_ssh_host=xxx.xxx.xxx.xxx

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

Вариант 2

Используйте DNS или hostsfile

надеюсь, это поможет

Использование "обычных" Ansible модулей для управления Windows-боксами невозможно. Вместо этого вы должны использовать один из модулей Windows. Это то же самое для пинга. Он пытается подключиться через SSH к коробке с Windows, которая не работает.

Как уже говорилось в skinnedKnuckles, Ansible использует удаленное взаимодействие с Powershell (и WinRM) вместо SSH для связи с машиной Windows. Таким образом, модуль win_ping - это правильный способ выполнить пинг с Ansible на Windows-коробке:

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

Я предполагаю, что вы подготовили свою виртуальную машину Windows 8, как описано в документации!?! Если нет, то есть этот пост в блоге, объясняющий, как сделать все шаги вкл. Настройка Vagrant с winrm связь в довольно компактной форме.

Другие вопросы по тегам