Mac
Ubuntu
vagrant
Ansible

MacでAnsible+Ubuntu仮想環境を0から構築する。

この記事で書いたこと

CentOS関係の仮想環境を用いたAnsibleはよく記事がありますが、Ubuntu環境を構築したうえでAnsibleを行うやり方を書いたものがあまりなかったので、macで0から作ってみました。

この記事では、Mac上にVirtualBoxのUbuntu環境を作ります。さらに、Mac上のansibleでUbuntuにソフトをインストールするところまで書きます。

環境

  • Mac OSX 10.12.4(16E195)

HomeBrewでVagrantとVirtualBoxをインストール

brewとcaskのインストール

ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
brew install caskroom/cask/brew-cask

VagrantとVirtualBoxのインストール

brew cask install virtualbox
brew cask install vagrant

Ansibleのインストール

Ansible動作にはpythonが必要です。
macにpythonが入っていない人は、インストールしておきます。

brew install python

ansibleをインストールします。

brew install ansible

簡単ですね。

仮想環境Ubuntuのインストール

vagrant initでVagrantの初期設定を作ります。vagrantのボックスはこちらから参照しました。→Vagrant box ubuntu/trusty64 v20170619.0.0 - Vagrant Cloud

 vagrant init ubuntu/trusty64

成功すると、Vagrantfileが作られています。vagrantは基本的にこちらにサーバ設定を書きます。

ローカルのansibleからにubuntuにアクセスするため、ローカルIPアドレスを設定します。Vagrantfile以下の文のコメントアウトを外します。

  config.vm.network "private_network", ip: "192.168.33.10"

Vagrantfileから必要箇所だけ取り出すと以下のようにすっきりします。

Vagrant.configure("2") do |config|
  config.vm.box = "ubuntu/trusty64"
  config.vm.network "private_network", ip: "192.168.33.10"
end

さて、いよいよUbuntuを起動します。コマンドは以下。
初期化時に自動でubuntu/trusty64のイメージをダウンロードしてくれます。

vagrant up

大きいファイルを落としてくるので、やや時間がかかります。うまく行きましたでしょうか?赤文字でエラーなどでなければ成功です。

ではこちらでubuntuにログインします。

vagrant ssh

vagrant@vagrant-ubuntu-trusty-64:~$とでて、ログインできたことが確認できます。

(※vagtantはデフォルトだとユーザー:vagrant, パスワード: vagrantという設定になっています)

sshでログインする。

vagrant sshを使用せず、macからsshでログインするように設定します。
まず、秘密鍵と公開鍵のペアを作成し、公開鍵をubuntuにssh-copy-idで送り込みます。

ssh-keygen -t rsa

問いかけがでますが、すべてEnter。すでに~/.ssh/id_rsaの秘密鍵が存在していれば、このコマンドは不要です。

ssh-copy-idで、公開鍵をubuntuに送ります。このコマンド一つでアクセス許可してくれるので、便利です。

ssh-copy-id -i ~/.ssh/id_rsa vagrant@192.168.33.10

入れるか試しましょう。

ssh vagrant@192.168.33.10

パスワードを聞かれずログインできれば成功です。

Ansibleを試してみる。

とりあえず最初のplaybook(Ansibleで行いたい構成を書いたファイル)を作ってみます。

./test.yml:

- hosts: ubuntu
  user: vagrant
  tasks:
    - name: output message.
      debug: msg="hello ansible"

ubuntuという名前のサーバに対して、vagrantというユーザー名でログインし、ログを出してみます。

hosts: ubuntuとしてサーバーにubuntuという名前を付けています。任意の名前でOKです。
user: vagrantについて、今回、ubuntuへはデフォルトでvagrantというユーザーでしかログインできないので、vagrantと設定します。

さらに、同じディレクトリにホストの情報を別ファイルhostsに書きます。

./hosts:

[ubuntu]
192.168.33.10

注意!ubuntuというところは、先程hosts:に設定したホスト名です。
その下にvagrantのIPを書きました。

さて、以下コマンドでAnsibleをためします。

ansible-playbook -i hosts test.yml

hostsファイルに設定したターゲットのubuntuサーバに対して、test.ymlに書いたアクションを実行します

以下出力がでて、うまくメッセージが出力されました。

PLAY [ubuntu] ******************************************************************

TASK [Gathering Facts] *********************************************************
ok: [192.168.33.10]

TASK [output message.] *********************************************************
ok: [192.168.33.10] => {
    "msg": "hello ansible"
}

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

aptでソフトをインストール

aptで最新のNTPをインストールしてみます。
以下のプレイブックを作成します。

apt.yml(名前は任意です):

- hosts: ubuntu
  user: vagrant
  become: yes
  tasks:
    - name: install latest ntp package
      apt: pkg=ntp state=latest

sudoユーザーでないとパッケージのインストールができないため3行目にbecome: yesを付けています。
(ansible1.8以前はsudo:yesでよかったのですが、deplicationになり文法が変わりました。)
パッケージインストールは最終行のapt: コマンドで実行します。

以下コマンドで実行します。

ansible-playbook -i hosts apt.yml

エラー無く終了したら成功です。

以前chefを使用したことがありますが、それと比べるとymlに設定項目を描くだけで、ansibleは比較的覚えることが少なく扱いやすい印象を受けました。

あとは、ansible公式ドキュメント等を参照していろいろ作っていけそうです。

Ansible Documentation — Ansible Documentation

参考

大変参考になりました😄 Ansibleとはそもそも何か?と言うところから学びたい人はこちら。
Ansibleをはじめる人に。 - Qiita

ベストプラクティスの構成例が書いてあります。
Ansible チュートリアル | Ansible Tutorial in Japanese