Got Some \W+ech?

Could be Japanese. Could be English. Android, セキュリティ, 機械学習などをメインに、たまにポエムったり雑感記載したりします。

VagrantとAnsibleを触ってみたのでメモ

構成管理に手を出してみたので、メモ。 AnsibleとVagrantで。 本ドキュメントでは手順とハマリポイントを紹介しますが、手順は他の本やブログでもさんざん上がってるので、最小限にとどめます。

目的

実践的な意味での構成管理、プロビジョニングの勘所を探したい

Ansibleを選んだ理由

最初、Itamae かAnsible で迷ってたが、以下の観点からAnsibleを選択

記述方法

ItamaeじゃなくてAnsibleを選択したのは、rubyに詳しくなく、多少離れてるyaml記述の方が学習コストが少なそうだったから。docker fileもyml記述だし。複雑なことをするとツライっぽいけど、そこまで複雑じゃないからいいかな、とも。ここらへんは感覚値です。

ドキュメント

ドキュメントの総数やSOFの記事数も多かったのがポイント。公式ドキュメントの充実度もAnsibleが上だった。

後、moduleがAnsibleのが充実してたし、Andsible-Galaxyもよさげだった。

とか、色々言ったけど、結局決定打はない。というか決定できるほど知らないので、Ansible暫くやってつまったらitamaeでゴニョゴニョしに行く方針。

構成

Mac + VM on VirtualBox + Vagrant + Ansible

構築

Vagrant構築

mkdir ~/workspace/ansibleDemo
cd ~/workspace/ansibleDemo
% vagrant box add centos6-7 https://github.com/CommanderK5/packer-centos-template/releases/download/0.6.7/vagrant-centos-6.7.box
vagrant init centos6-7
  • Vagrantfile作成(下記を追加)
# vim Vagrantfile実行
config.vm.box = "centos6-7
config.vm.network "private_network", ip: "192.168.33.10"
  • VM起動
vagrant up
  • Ansibleインストール
brew install ansible
  • Inventory登録
echo "[TestServer]" > hosts                                                                       
echo "192.168.33.10" >> hosts                                                                       
  • ssh接続先設定
vagrant ssh-config --host 192.168.33.10 >> ~/.ssh/config                                           
% ansible -i hosts 192.168.33.10 -m ping
192.168.33.10 | SUCCESS => {
    "changed": false, 
    "ping": "pong"
}
  • playbook作成
# vim playbook.yml
- hosts: TestServer
  become: yes
  tasks:
      - ping:
  • playbook実行
% ansible-playbook -i hosts playbook.yml 

とりあえず、出来たところはここまで

ハマりポイント

Guest VMpingが通らない

  • ansible経由どころか、hostマシン(Mac)からもできなかった
  • vagrantのVagrantFileにprivate_networkを記述すれば、staticにIPを決定出来るのかと思ったが、vagrant upしても接続できない。VM内でifconfigうつも、private_networkに記述したIPは表示されず
  • VirtualBoxからみるとVMのネットワークのアダプタ1にhost_onlyのインターフェースがあるはず。
  • 仕方ないので /etc/sysconfig/network-scripts/ifcfg-eth1を直接編集して、ネットワーク再起動
BOOTPROTO=none
ADDR=192.168.33.10
NETMASK=255.255.255.0
ONBOOT=yes
DEVICE=eth1
/etc/init.d/networks restart
  • 上記で解決

Vagrant up時にWarning: Authentication failure. Retrying...が出る

  • sshの設定を調査
% vagrant ssh-config --host 192.168.33.10
Host 192.168.33.10
  HostName 127.0.0.1
  User vagrant
  Port 2222
  UserKnownHostsFile /dev/null
  StrictHostKeyChecking no
  PasswordAuthentication no
  IdentityFile /Users/Kengo/workspace/ansibleDemo/.vagrant/machines/default/virtualbox/private_key
  IdentitiesOnly yes
  LogLevel FATAL
  • IdentifyFile内のprivate_keyにマッチするpublic_keyがゲスト側にいなければいけないので、作る
% ssh-keygen -yf .vagrant/machines/default/virtualbox/private_key > public_key
% cat public_key
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCg4qWCq3mPom9TzcAdDoDHt61s7tjsmeHaD0pLePYW0p4+qZCr2u8cLk0gJElB7BQc3c3mMuo5iCsYoxrjXbVHpNNUDmRHNLdSxNVO3Z7qLY7VzyQWwoqyqrCcbN3fG/MV+6cs+8d0dcvHGrEYnR9O6Q81VS4sdBucM0J8jQ2oyzumr8QZdXFEEeQbG9SKOVIFpuPHBiOFV+skc22VfgZNlxANBizFV7uguCxhEoQs74L1XMvC1ae7TjVhnIZbZ1063QyXtPgO25TwFqZUsCltqFxgBA032YKZFAtFXyF5vu0pootG91biS9f43dccp8cFuizgLc5FkUYUhjDtNRLV
  • ゲスト側にpublic_keyを登録....けど、すでに存在した。
% vagrant ssh
Last login: Sun Aug  7 18:41:24 2016 from 10.0.2.2
[vagrant@localhost ~]$ cat .ssh/authorized_keys 
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCg4qWCq3mPom9TzcAdDoDHt61s7tjsmeHaD0pLePYW0p4+qZCr2u8cLk0gJElB7BQc3c3mMuo5iCsYoxrjXbVHpNNUDmRHNLdSxNVO3Z7qLY7VzyQWwoqyqrCcbN3fG/MV+6cs+8d0dcvHGrEYnR9O6Q81VS4sdBucM0J8jQ2oyzumr8QZdXFEEeQbG9SKOVIFpuPHBiOFV+skc22VfgZNlxANBizFV7uguCxhEoQs74L1XMvC1ae7TjVhnIZbZ1063QyXtPgO25TwFqZUsCltqFxgBA032YKZFAtFXyF5vu0pootG91biS9f43dccp8cFuizgLc5FkUYUhjDtNRLV vagrant <- ★あれこれはssh-keygenして作ったものと同じ...
  • ぐぐったら.sshの設定がいけなかったらしい
[vagrant@localhost ~]$ chmod 0700 /home/vagrant/.ssh/
[vagrant@localhost ~]$ chmod 0600 /home/vagrant/.ssh/authorized_keys 

これでおk

ansibleでpingができない

% ansible -i hosts 192.168.33.10 -m ping
192.168.33.10 | UNREACHABLE! => {
    "changed": false, 
    "msg": "SSH encountered an unknown error during the connection. We recommend you re-run the command using -vvvv, which will enable SSH debugging output to help diagnose the issue", 
    "unreachable": true
}
  • どうもssh実行時の送信先の情報を保存していなかった
vagrant ssh-config --host 192.168.33.10 >> ~/.ssh/config                    
  • これでpingができた
% ansible-playbook -i hosts playbook.yml 

PLAY ***************************************************************************

TASK [setup] *******************************************************************
ok: [192.168.33.10]

TASK [ping] ********************************************************************
ok: [192.168.33.10]

PLAY RECAP *********************************************************************
192.168.33.10              : ok=2    changed=0    unreachable=0    failed=0   

以上。ヨサそう