MSYS2のAnsibleを使ってVagrantでプロビジョニング

Pocket

VagrantでゲストOSをセットアップするには、次の3通りがあります。

  1. Vagrantfileの中ではプロビジョニングを使わず、ゲストOSを立ち上げるだけにして、ansible単独でゲストOSを操作する方法
  2. Vagrantfileの中でconfig.vm.provision 'ansible_local'として、Vagrantのansible_localというプロビジョニングを使う方法
  3. Vagrantfileの中でconfig.vm.provision 'ansible'として、Vagrantのプロビジョニングを使う方法

今回は、3番目のVagrantのansibleプロビジョニングを使ってゲストOSをセットアップします。

AnsibleもVagrantも、ansibleプロビジョニングをWindowsホストではサポートしていないのでその点はご了承ください。

前回までに、MSYS2上でAnsibleが動くことがわかりました。

まず、これまでのように、ホストからansible-playbookでゲストOSが操作できることを確認します。

これで素直にVagrantのプロビジョニングのなかでansibleが使えるかというと、エラーが出て使えません。

そこで、Cygwinでの動作例を参考に次のようにしました。

ansble-play.batという次のようなファイルを作ってPATHの通ったところに置きます。

@echo off

REM MSYS2のインストール場所
set MSYS=C:\msys32

REM bash.exeからansible-playbookを起動します
set SH=%MSYS%\usr\bin\bash.exe

"%SH%" -c "/usr/bin/ansible-playbook %*"

これで、Vagrantからansible-playbookを呼び出すことができます。

Vagrantfileは次の通りです。ゲストOSはubuntu/xenial64にしたのですが、このイメージはpythonが含まれていません。そのため、shellプロビジョニングを使ってインストールしました。このとき、aptのソースファイルを書き換えて少し速くインストールするようにしました。

ansibleプロビジョニングでは、Playbookをsite.yml、コンフィグレーションファイルにansible.cfg、インベントリファイルにhostsを指定しました。

Vagrantfile

VAGRANTFILE_API_VERSION = "2"

Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
  config.vm.box = "ubuntu/xenial64"

  config.vm.network "private_network", ip: "192.168.33.10"
  
  config.vm.provision "shell", inline: <<-SHELL
		# aptのソースファイルを書き換え
    sed -i s%archive.ubuntu.com/ubuntu%ftp.jaist.ac.jp/pub/Linux/ubuntu/%g /etc/apt/sources.list
    apt-get update
    apt-get -y install python aptitude
  SHELL

  config.vm.provision "ansible" do |ansible|
    ansible.playbook = "site.yml"
    ansible.config_file = "ansible.cfg"
    ansible.inventory_path = "hosts"
    ansible.limit = 'all'
  end
end

次にansible.cfgファイルです。vagrant ssh-configで表示される結果をもとに作ります。Userをremote_userに、IdentityFileをprivate_key_fileにします。

control_pathの設定は、CygwinやMSYS2を使ったときにエラーになるのを回避するためです。こちらの情報をもとにしました。

ansible.cfg

[defaults]
inventory = hosts
remote_user = ubuntu
host_key_checking = False
private_key_file = .vagrant/machines/default/virtualbox/private_key


[ssh_connection]
# for Cygwin, MSYS2
control_path = /tmp

インベントリファイルは、次の通りです。vagrantsというグループで、ubuntu01という名前にしました。IPアドレスはVagrantfileと合わせます。これが違っていてよくSSHのエラーになりました。

hosts

[vagrants]
ubuntu01 ansible_host=192.168.33.10

最後はPlaybookです。Apache2をインストールすることにしました。

vagrantsというグループにubuntuでアクセスします。aptでapache2の最新版ををインストールしてbecome: trueでスーパーユーザーで行います。

site.yml

---
- hosts: vagrants
  user: ubuntu
  tasks:
    - name: install packages Apache2
      apt: name=apache2 update_cache=yes
      become: true

4つのファイルがそろえば、vagrant upでサーバーが設定され、http://192.168.33.10/にアクセスするとApache2の画面を見ることができます。
使ってみて、VagrantのAnsibleプロビジョニングはVagrantと一緒に使うときは便利ですが、Ansible単独で設定したほうが自由度はあるのかなという感じがしました。

Pocket

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

*

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください