はじめに

AnsibleはLinux、Macでは動くがWindowsでは動かない。Windowsで実行するためには、仮想でLinuxを立ち上げて、そこにAnsibleをインストールする必要がある。

Windowsで『初めてのAnsible』の「1.9 テスト用サーバーのセットアップ」相当の内容を実行する方法を、次の構成で確かめていく。
・Windows 7
・VirtualBox 5.0.20
・Vagrant 1.8.4
・CentOS 6.7
・Ansible 2.1.0

WindowsにVirtualBoxとVagrantをインストールする

WindowsにVirtualBoxVagrantをインストールする。

VagrantでCentOSを2台起動する

コマンドプロンプトを開いて、VagrantにCentOSのBOXを追加する。

>vagrant box add bento/centos-6.7

Windows上に今回のテスト用のディレクトリ(test)を作成する。

>cd test

test内にVagrantfileを作成する。
Vagrantfile

Vagrant.configure("2") do |config|

  config.ssh.insert_key = false

  config.vm.define "vagrant0" do |vagrant0|
    vagrant0.vm.box = "bento/centos-6.7"
    vagrant0.vm.network :private_network, ip: "192.168.11.30"
  end

  config.vm.define "vagrant1" do |vagrant1|
    vagrant1.vm.box = "bento/centos-6.7"
    vagrant1.vm.network :private_network, ip: "192.168.11.31"
  end

end

config.ssh.insert_key = false は『初めてのAnsible』でも説明されているが、Vagrantの各ホストごとに異なるSSH鍵を使うというデフォルトの設定をOFFにして、すべてのホストで同じSSH鍵を使う昔の動作にするために行っている。

vagrant0とvagrant1の2台の設定を行い、vagrant0をAnsible用、vagrant1をAnsibleによる構成管理対象用とする。
private_networkの設定を行っている理由は、Vagrantマシン間でSSH通信をできるようにするため。
※参考:vagrantのネットワークについて

Vagrantファイルを保存したら、vagrant upを実行してvagrant0とvagrant1の起動を行う。

>vagrant up
Bringing machine 'vagrant0' up with 'virtualbox' provider...
Bringing machine 'vagrant1' up with 'virtualbox' provider...
==> vagrant0: Checking if box 'bento/centos-6.7' is up to date...
==> vagrant0: Clearing any previously set forwarded ports...
==> vagrant0: Clearing any previously set network interfaces...
==> vagrant0: Preparing network interfaces based on configuration...
    vagrant0: Adapter 1: nat
    vagrant0: Adapter 2: hostonly
==> vagrant0: Forwarding ports...
    vagrant0: 22 (guest) => 2222 (host) (adapter 1)
==> vagrant0: Booting VM...
==> vagrant0: Waiting for machine to boot. This may take a few minutes...
    vagrant0: SSH address: 127.0.0.1:2222
    vagrant0: SSH username: vagrant
    vagrant0: SSH auth method: private key
    vagrant0: Warning: Remote connection disconnect. Retrying...
    vagrant0: Warning: Remote connection disconnect. Retrying...
    vagrant0: Warning: Remote connection disconnect. Retrying...
    vagrant0: Warning: Remote connection disconnect. Retrying...
    vagrant0: Warning: Remote connection disconnect. Retrying...
    vagrant0: Warning: Remote connection disconnect. Retrying...
==> vagrant0: Machine booted and ready!
==> vagrant0: Checking for guest additions in VM...
==> vagrant0: Configuring and enabling network interfaces...
==> vagrant0: Mounting shared folders...
    vagrant0: /vagrant => C:/test
==> vagrant0: Machine already provisioned. Run `vagrant provision` or use the `--provision`
==> vagrant0: flag to force provisioning. Provisioners marked to run always will still run.
### vagrant1は省略

Warning: Remote connection disconnect. Retrying...が出力されても、しばらく待つと接続できるようになる。
vagrant0にアクセスできるかどうか確認する。
確認方法はvagrant sshコマンドを使用するか、Tera Term等で接続するかの2通りがある。

  • vagrant sshコマンドの場合

    >vagrant ssh vagrant0
    
  • Tera Termの場合

    ホスト:192.168.11.30
    ポート:22
    ユーザ:vagrant
    パスワード:パスフレーズにvagrant、あるいはRSA/DSA鍵にC:\Users\%USERNAME%\.vagrant.d\insecure_private_keyを設定
    

Windowsからvagrant0にアクセスできたら、vagrant0からvagrant1にSSHでアクセスできるように、C:\Users\%USERNAME%.vagrant.d\insecure_private_keyをvagrant0にアップロードし、id_rsaとして保存する。

# scp等であらかじめWindows端末からvagrant0にinsecure_private_keyをコピーした状態とする
$ mv insecure_private_key ~/.ssh/id_rsa
$ chmod 600 ~/.ssh/id_rsa
#接続できるか確認
$ ssh 192.168.11.31
$ exit

Ansible用CentOSにAnsibleをインストールする

vagrant0にAnsibleをインストールする。CentOSではyumでAnsibleをインストールする場合、エンタープライズLinux用の拡張パッケージ(EPEL) を使えるようにする必要がある。

$ sudo yum localinstall http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
#もしくは
$ sudo rpm -ivh http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm

$ sudo yum install ansible

別のCentOSにAnsibleでアクセスする

vagrant0からvagrant1にAnsibleでアクセスできるか、『初めてのAnsible』の「1.9.2 テストサーバーのことをAnsibleに知らせる」に沿って確認する。

$ mkdir playbooks
$ cd playbooks
$ echo testserver ansible_ssh_host=192.168.11.31 ansible_ssh_user=vagrant > hosts
$ ansible testserver -i hosts -m ping
testserver | SUCCESS => {
    "changed": false,
    "ping": "pong"
}

次は『初めてのAnsible』の「1.9.3 ansible.cfgによる簡略化」に沿って確認する。

$ echo "[defaults]
hostfile = hosts
remote_user = vagrant
host_key_checking = False" > ansible.cfg
$ echo testserver ansible_ssh_host=192.168.11.31 > hosts
$ ansible testserver -m ping
testserver | SUCCESS => {
    "changed": false,
    "ping": "pong"
}