WindowsでもAnsibleを利用する!Vagrant + Ansibleのセットアップ

残念ながらAnsibleをWindowsでネイティブに動かす方法は見つかりませんでした。
ですので、Vagrantによって動かしましたので、エントリーとして残します。

本エントリーは下記環境で実施しています。

Windows OS Windows 10 Pro
Vagrant Version 2.0.1
Virtual Box Version 5.2.2 r119230 (Qt5.6.2)
Box Image ubuntu/trusty64

必要なソフトウェアのインストールとセットアップ

  • Vagrant

Install | Vagrant | HashiCorp Developer

  • Virtual Box

Oracle VM VirtualBox - Downloads | Oracle Technology Network | Oracle

Vagrantによる仮想サーバの起動

1. 必要なboxの取得

今回はUbuntuを利用しました。下記のサイトからboxイメージを取得。(今ならxenialのほうがいいかもしれません)
Vagrant box ubuntu/trusty64 - Vagrant Cloud

# trusty64
vagrant box add ubuntu/trusty64 https://app.vagrantup.com/ubuntu/boxes/trusty64
# xenial64
vagrant box add ubuntu/xenial64 https://app.vagrantup.com/ubuntu/boxes/xenial64
2. 仮想サーバの初期化
rem Vagrantfileの配置先は任意
cd /D d:\vagrant
mkdir ubuntuTrusty64-20170920.0.0
vagrant init ubuntu/trusty64
3. Vagrantfileの修正

指定したプライベートIPアドレスでアクセスできるように下記の35行目辺りをコメントアウトを外す。

  config.vm.network "private_network", ip: "192.168.33.10"
4. Vagrantの起動
vagrant up
5. 仮想サーバに接続
vagrant ssh

無事に仮想サーバに接続できればOK!

(2018/7/5追記)6. PasswordAuthenticationの有効化

vagrantサーバーにsshクライアントから接続することに時間をかけたくないので、
今回はPasswordAuthenticationを有効にします。
これにより、vagrantのデフォルトユーザーでsshクライアントをすぐに利用することが可能

# 仮想サーバーに接続
vagrant ssh

# ここからbashなどの操作になる。
# Ubuntuの場合、sshd_configを修正
sudo su
cd /etc/ssh/
vi sshd_config

# 52行目付近 PasswordAuthenticationをyesに
PasswordAuthentication yes

# sshdの再起動
/etc/init.d/ssh restart

Ansibleのセットアップ

1. インストール

今回はUbuntuサーバにインストールするため、下記サイトを参考にしました。
Installing Ansible — Ansible Community Documentation

sudo apt-get update
sudo apt-get install software-properties-common
sudo apt-add-repository ppa:ansible/ansible
sudo apt-get update
sudo apt-get install ansible

下記コマンドを実行して、無事にAnsibleがインストールされていることを確認

ansible --version

仮想サーバ環境をPackage化する

これまでセットアップした仮想サーバ環境をPackage化して保存しておく。
Vagrantの真髄ですね。

1. Vagrantの起動状態を確認
rem Vagrantファイルがあるディレクトリで実行する
vagrant status
2. 起動中のVagrantを停止する
vagrant halt
3. boxを作成する
vagrant package --output ubuntuAnsible.box

↓Package化できた!これで配布できます!

ハマりポイント

1. Vagrantサーバからの各サーバにSSHアクセスする時に、passphraseを設定していないのに聞かれて、接続できない。

Ansibleの問題というより、自分のUbuntuサーバのセットアップ知識が足りないだけなのですが、
ssh-agentコマンドを実行することで、passphraseを聞かれないようにすることができます。

# 下記のコマンドを入力することで、SSHアクセス時にpassphraseを聞かれるのをスキップできる
ssh-agent bash
ssh-add

Ansible コマンド例

Pingを通してみる

コマンド例:

# IPアドレスと公開鍵を直接指定する方法
ansible {ホストIPアドレス} -m ping -u {接続先ホストのユーザー名} --private-key="{公開鍵のファイル名}"
# 予め用意したホストファイルを利用する方法
ansible {グループ} -i {ホストファイル名} -m ping
yum updateのdry runコマンドをplaybookから実行してみる

コマンド例:

# ホストファイルのみ指定して直接yum updateを実行する方法
ansible {グループ} -i {ホストファイル名} -K -m yum -a "name=* state=latest" --check
# 予め用意したPlayBookを利用する方法
ansible-playbook -i {ホストファイル名} -K {playbookファイル名} --check

yum updateのPlayBookの例:

- name: yum update
  yum:
    name: *
    state: latest
  notify: reboot by handler

handlerの例:
この場合、yum update完了後に再起動する。

- name: reboot by handler
  command: "/sbin/shutdown -r now"
接続先サーバのPythonのバージョンを確認してみる
ansible {グループ} -i {ホストファイル名} -K -m shell -b -a "python --version"

便利なVagrantの自動起動設定

Windows

下記のbatファイルを作成し、タスクスケジューラにてログイン時に起動するよう設定しておくと便利

rem "%vagrant_startup_dir%"は環境変数
cd /D %vagrant_startup_dir%
vagrant up

感想

Ansibleは大量のPlayBookがGitHubなどに転がっており、
初回のサーバー接続設定さえ滞りなく完了させれば、その後の学習コストは低いと思います。

何より、エージェントレスであり、
ローカル環境のセットアップでも利用できますので、
普段から使っていきたいと思える構成管理ツールですね!
使っていて楽しいです!

これからも、Infrastructure As Codeを試み続けていきたいと思います!