初心者がAnsibleに挑戦してみるお

chef, itamae, ansibleのいずれかで動作環境を作って人に渡す必要がありまして。
プロビジョニングツール(構成管理ツール)って言うらしいです。
Dockerみたいな感じなのかな？っていうふわっとした印象からお勉強スタート。





# どれを選ぶか

とりあえずGoogle先生で「chef itamae ansible」で検索かけて、
上から10記事くらい流し見してみました。

ふむふむ。

おおざっぱにまとめると
・chefはいろいろできるけど学習コストが高い。ボツ。
・itamaeはシンプルで学習コスト低い。日本人が開発してる。Rubyで書く。
・Ansibleも学習コスト低い。利用者が多い。YAMLで書く。
って感じ。

シンプルで学習コストが低いものを求めている場合で、
Rubyに慣れていればitamae、そうじゃなければAnsibleっていう選び方でいい気がする。
利用者が多いっていう点も鑑みて、今回はAnsibleを使うことにします。

読み方調べたら「アンシブル」でした。
参考）http://yomikata.org/word/ansible





# ドットインストールでお勉強開始

うーん、ネットに情報はいっぱい落ちてるけど断片的だしどうやってざっくり勉強しようかな…
あ、ドットインストールにAnsible講座ありました。ありがとうドットインストール！
Ansible講座は有料だったので、迷わず課金しました。
参考）https://dotinstall.com/lessons/basic_ansible





# Vagrantでサーバーを立ち上げる

ローカルでAnsibleを使うこともできるらしいんだけど、調べてるとほぼ全員がVagrantを入れてました。
Vagrantは仕事でも使ってたけど、ほかの子に設定してもらったから自分ではいじったことない。。。
ま、やってみましょ。


```
# フォルダをつくって移動
$ mkdir Vagrant
$ mkdir Vagrant/ansible_lessons
$ cd Vagrant/ansible_lessons
```

VagrantCloudというサイトで、
参考）https://app.vagrantup.com/boxes/search

`centos` で検索、最新バージョンのcentosからコマンドをコピーしてきて、

```
$ vagrant init centos/7
-bash: vagrant: command not found
```

これでvagrantファイルができるはず… と思ったら、
そんなコマンドないよって怒られちゃいました。
いきなりはやっぱだめですよねぇ…

Vagrantを使えるようにするため、またまたドットインストールをざっと流し見していきます。
参考）https://dotinstall.com/lessons/basic_vagrant

まずはバーチャルボックスの最新版をダウンロード、インストール。
参考）https://www.virtualbox.org/

Vagrantの最新版をダウンロード、インストール。
参考）https://www.vagrantup.com/

そんでVagrantのバージョンを調べると…？

```
$ vagrant --version
Vagrant 2.1.1
```

よかった、無事vagrantコマンドが使えるようになりました。

気を取り直してもう1回。

```
$ vagrant init centos/7
A `Vagrantfile` has been placed in this directory. You are now
ready to `vagrant up` your first virtual environment! Please read
the comments in the Vagrantfile as well as documentation on
`vagrantup.com` for more information on using Vagrant.
```

よし、ちゃんとcentOSが入ったみたいですね。
次はVagrantfileファイルを編集します。

```
# vim立ち上げ
$ vi Vagrantfile

# インサートモードに切り替え（今後省略）
i

# 下記をコメントアウトして、
# config.vm.box = "centos/7"

# 以下を追加
config.vm.define "host" do |node|
  node.vm.box = "bento/centos-7"
  node.vm.hostname = "host"
  node.vm.network :private_network, ip: "192.168.100.101"
end

config.vm.define "web" do |node|
  node.vm.box = "bento/centos-7"
  node.vm.hostname = "web"
  node.vm.network :private_network, ip: "192.168.100.101"
end

config.vm.define "db" do |node|
  node.vm.box = "bento/centos-7"
  node.vm.hostname = "db"
  node.vm.network :private_network, ip: "192.168.100.101"
end

# ノーマルモードに戻して（今後省略）
ESC

# 上書き保存して終了（今後省略）
ZZ
```

そしたらVagrantを立ち上げます。

```
$ vagrant up
```

ちょっと時間がかかります。
うええ、なんかIPアドレスを変更してよ！ってエラー吐かれたお。
Macのネットワーク環境設定に載ってたIPアドレスをそのままコピペしたんだけど、
外部と繋がっちゃうIPアドレスはプライベートネットワークに使っちゃいけないんだって。
なるほど。

これ自分で決めていいのかな？
調べていくと"192.168.33.10"を割り当てている人が多い。
ドットインストールだと"192.168.43.51"、"192.168.43.52"、"192.168.43.53"って3つ使ってる。
そっか！それぞれにIPアドレス変えないと見分けつかないよね。

"192.168.33.11"、"192.168.33.12"、"192.168.33.13"に書き直して試してみました。
気を取り直してもう一回！

```
$ vagrant up
```

今度はサクサク進み出しました。数分待つ。
無事終わったので、ステータスを確認。

```
$ vagrant status
```

無事3台とも走ってます!

![スクリーンショット 2018-06-09 10.36.40.png](https://qiita-image-store.s3.amazonaws.com/0/186046/fb745861-cd3c-dc53-04de-1b6cc55f1d36.png)





# Ansibleをインストール

host側からwebサーバーとdbサーバーをいじくるので、まずはhostにssh接続をします。

```
$ vagrant ssh host
```

Ansibleをインストールするにはepel（いーぺる）というリポジトリが必要なんだって。
「epel download」で検索して、epel-releaseのリンクをコピー。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/186046/ba56b894-e642-b774-f034-263fd436e97a.png)

```
# コピーしたリンクをwgetしてダウンロード
$ wget https://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
...(省略)...
2018-06-09 01:50:29 (91.9 KB/s) - `epel-release-6-8.noarch.rpm' へ保存完了 [14540/14540]

# epelのリポジトリを有効にする（↑のファイル名使う）
$ sudo rpm -Uvh epel-release-6-8.noarch.rpm

# Ansibleをインストール
$ sudo yum -y install ansible
...(省略)...
問題を回避するために --skip-broken を用いることができます。
これらを試行できます: rpm -Va --nofiles --nodigest
```

うええ、エラーがいっぱいあるって言われてるよぅ。
調べてみたら、依存関係にあるファイルがあるとエラーになるんだって。
例えば、こっち入れる前にこっち入れといて〜みたいなのが依存関係。
1つ2つならいいけど、いっぱいあると解決難しそう。

そういうのを無視して、インストールできるところだけやっちゃうのが `--skip-broken` らしい。
やってみよ！

```
$ sudo yum -y install ansible --skip-broken
...(省略)...
パッケージは依存関係に問題があるため、飛ばします:
    PyYAML-3.10-11.el7.x86_64 (base から)
    ansible-2.5.3-1.el6.noarch (epel から)
    libtomcrypt-1.17-26.el7.x86_64 (extras から)
    libtommath-0.42.0-6.el7.x86_64 (extras から)
    libyaml-0.1.4-11.el7_0.x86_64 (base から)
    python-babel-0.9.6-8.el7.noarch (base から)
    python-backports-1.0-8.el7.x86_64 (base から)
    python-backports-ssl_match_hostname-3.5.0.1-1.el7.noarch (base から)
    python-cffi-1.6.0-5.el7.x86_64 (base から)
    python-crypto2.6-2.6.1-2.el6.x86_64 (epel から)
    python-enum34-1.0.4-1.el7.noarch (base から)
    python-httplib2-0.9.2-1.el7.noarch (extras から)
    python-idna-2.4-1.el7.noarch (base から)
    python-ipaddress-1.0.16-2.el7.noarch (base から)
    python-jinja2-26-2.6-3.el6.noarch (epel から)
    python-keyczar-0.71c-1.el6.noarch (epel から)
    python-markupsafe-0.11-10.el7.x86_64 (base から)
    python-paramiko-2.1.1-4.el7.noarch (extras から)
    python-ply-3.4-11.el7.noarch (base から)
    python-pycparser-2.14-1.el7.noarch (base から)
    python-setuptools-0.9.8-7.el7.noarch (base から)
    python-six-1.9.0-2.el7.noarch (base から)
    python2-crypto-2.6.1-15.el7.x86_64 (extras から)
    python2-cryptography-1.7.2-2.el7.x86_64 (base から)
    python2-pyasn1-0.1.9-7.el7.noarch (base から)
    sshpass-1.06-2.el7.x86_64 (extras から)
```

一応できました。
26個のパッケージが依存関係に問題あるから飛ばしましたってメッセージでました。
飛ばされたやつはどうなるんや？

調べたらやっぱりこのままじゃまずいらしい。
参考）http://oxynotes.com/?p=6777

依存関係の解消にこれが効くらしいので叩いてみる。

```
$ package-cleanup --problems
-bash: package-cleanup: コマンドが見つかりません
```

Umm... 参考サイトに
> 「package-cleanup」を使った解決法も提示されていますが、そもそもyum-utilsがインストールされていないと利用することができません

とあるので、yum-utilsをインストールしてみます。

```
$ yum install yum-utils
このコマンドを実行するには root である必要があります。

# くっ。sudoさんつけてみる。
$ sudo yum install yum-utils
...(省略)...
完了しました！

# よっしゃ。では再チャレンジ！
$ package-cleanup --problems
読み込んだプラグイン:fastestmirror
No Problems Found
```

えええ、そんなのないって言われたお(´Д⊂ヽ
さっきの26個をひとつずつインストールしていくのかしら…

> すこし手間がかかりますが、上記の検索等を利用して依存関係を解決するのが正攻法です。

って参考サイトのコメントを信じて、とりあえず `$ sudo yum install` を上から順にかけていきました。
26個中13個がインストール完了、9個がすでに入ってる、4個がやっぱり依存関係でエラーでした。
エラーになった4個をもう1回ずつ `$ sudo yum install` かけたけどダメ。
もう一回 `$ sudo yum -y install ansible --skip-broken` をやってみたけど、
やはり4つだけ残りました。

このまま無視して進めたりしないかな？と思ってAnsibleのバージョンを聞いてみました。

```
$ ansible --version
-bash: ansible: コマンドが見つかりません
```

あ、ダメでした。
調べていくと、CentOS6までのやり方と、今回入れようとしたCentOS7とではやり方が違うらしいです。
参考サイトを真似してコマンド打ってみます。
参考）https://teratail.com/questions/86173

```
$ sudo yum install epel-release
...(省略)...
完了しました！
```

だがしかし、そのあとAnsibleをインストールしようとしても状況は変わらじ…
ググってもなかなか解決方法が出てこない。

困ったときは、英語が苦手でも公式サイトを見る！
pipというものを使ってインストールすることもできるらしいので、そちらでやってみます。
参考）https://docs.ansible.com/ansible/latest/installation_guide/intro_installation.html

```
# pipをインストール
$ sudo easy_install pip

# pipでAnsibleをインストール
$ sudo pip install ansible

# ちゃんとインストールできたか、Ansibleのバージョン確認
$ ansible --version
ansible 2.5.4
  config file = None
  configured module search path = [u'/home/vagrant/.ansible/plugins/modules', u'/usr/share/ansible/plugins/modules']
  ansible python module location = /usr/lib/python2.7/site-packages/ansible
  executable location = /usr/bin/ansible
  python version = 2.7.5 (default, Apr 11 2018, 07:36:10) [GCC 4.8.5 20150623 (Red Hat 4.8.5-28)]
```

あんなに苦労したのに、あっさりできちゃいました。ホッ。





# SSH接続の設定

SSH接続はGitとか、レンタルサーバーとの接続でやったことあるぞ。
設定したIPアドレスを使ってweb側とdb側に接続することもできる(らしい)けど、
いちいちIPアドレスを打たなくても「web」「db」でアクセスできるようにします。

```
# configファイルを作る
$ vi .ssh/config

# 設定を書く
Host web
  HostName 192.168.33.12
Host db
  HostName 192.168.33.13

# パーミッションを変更
$ chmod 600 .ssh/config
```

次は秘密鍵と公開鍵を設定していきます。

```
# 鍵を作るお
$ ssh-keygen -t rsa
# ファイル名聞かれたらデフォルトのまま何も入れずにエンター
# パスフレーズも練習だし空のままエンター

# 公開鍵(id_rsa.pub)をwebにコピーする
$ ssh-copy-id web
# パスワード聞かれたら、vagrant

# 公開鍵(id_rsa.pub)をdbにもコピーする
$ ssh-copy-id db
# パスワード聞かれたら、vagrant
```

無事 `$ ssh web` や `$ ssh db` で接続できるようになりました！
hostに戻ってくるときは、 `$ logout` とか `$ exit` ですよ！←よく忘れる。




# Ansibleを軽く使ってみる

Inventory（いべんとり）ファイルを作ります。

```
# hostsという名前でInventoryファイルを作る
$ vi hosts

# 処理対象となるサーバのアドレスを書く
[web]
192.168.33.12

[db]
192.168.33.13
```

Ansibleを使ってサーバーに処理を加えます。

```
# 全部のサーバーに
# iオプションでInventoryファイルの場所を指定して
# テスト用のpingモジュールを実行
$ ansible all -i hosts -m ping
192.168.33.12 | SUCCESS => {
    "changed": false, 
    "ping": "pong"
}
192.168.33.13 | SUCCESS => {
    "changed": false, 
    "ping": "pong"
}
```

「ピン」っていうと「ポン」って返ってくる。かわいい。すき。
次に、 `-i hosts` を毎回書かなくてもいいように設定していきます。

```
# ansible.cfgファイルを作る
$ vi ansible.cfg

# デフォルトのホストファイルを書く
[defaults]
hostfile = ./hosts

# -i hostsを省略して実行できる…
$ ansible all -m ping
[DEPRECATION WARNING]: [defaults]hostfile option, The key is misleading as it can also be a list of hosts, a directory or a list of 
paths , use [defaults] inventory=/path/to/file|dir instead. This feature will be removed in version 2.8. Deprecation warnings can be 
disabled by setting deprecation_warnings=False in ansible.cfg.
```

WARNING出ちゃいましたね。
仰せのままに、 `hostfile =` と書いたところを `inventory =` に変更しました。
無事WARNING消えました。




# Playbookを作る

さっきみたいにansibleコマンドをつらつら書くこともできるけれど、
Playbookの中にやりたいことをまとめて書くことができるそうです。
Playbookってネーミングセンスがすき。楽しそう。

```
# YAML（やむる）ファイルを作成
$ vi playbook.yml

# ｈｉｔｏｍｉユーザーを追加する指示を書く
- hosts: all
  sudo: yes
  tasks:
    - name: add a new user
      user: name=hitomi

# 実行
$ ansible-playbook playbook.yml
[DEPRECATION WARNING]: Instead of sudo/sudo_user, use become/become_user and make sure become_method is 'sudo' (default). This feature 
will be removed in version 2.6. Deprecation warnings can be disabled by setting deprecation_warnings=False in ansible.cfg.

PLAY [all] ******************************************

TASK [Gathering Facts] ******************************
ok: [192.168.33.12]
ok: [192.168.33.13]

TASK [add a new user] *******************************
changed: [192.168.33.12]
changed: [192.168.33.13]

PLAY RECAP ******************************************
192.168.33.12              : ok=2    changed=1    unreachable=0    failed=0   
192.168.33.13              : ok=2    changed=1    unreachable=0    failed=0   
```

ドットインストールと違うWARNINGが出ましたね。
`sudo` はもうださいから `become` を使ってねって感じ。書き直して実行します。

```
$ vi playbook.yml

# sudoをbecomeに書き直し
- hosts: all
  become: yes
  tasks:
    - name: add a new user
      user: name=hitomi

# 再実行
$ ansible-playbook playbook.yml

PLAY [all] ******************************************

TASK [Gathering Facts] ******************************
ok: [192.168.33.13]
ok: [192.168.33.12]

TASK [add a new user] TASK [add a new user] *******************************
ok: [192.168.33.12]
ok: [192.168.33.13]

PLAY RECAP PLAY RECAP ******************************************
192.168.33.12              : ok=2    changed=0    unreachable=0    failed=0   
192.168.33.13              : ok=2    changed=0    unreachable=0    failed=0   
```

無事WARNINGが消えました。
Ansibleの冪等性（べきとうせい）の恩恵で、2回目はchanged=0になってます。
ちゃんとユーザーが追加されているかも確認します。

```
# webにログイン
$ ssh web

# ユーザーの一覧を出す
$ cat /etc/passwd
...(省略)...
vagrant:x:1000:1000:vagrant:/home/vagrant:/bin/bash
vboxadd:x:997:1::/var/run/vboxadd:/bin/false
hitomi:x:1001:1002::/home/hitomi:/bin/bash
```

最後にひとみちゃんが追加されていますね。よしよし。
`$ exit`してhostに戻っておきます。

モジュールについては公式ドキュメントをみるといろいろあります。
参考）https://docs.ansible.com/ansible/latest/modules/modules_by_category.html





# Apacheのインストールと起動

webサーバーでApacheのインストールと起動をするよう、playbookに書いてみます。

```
# playbook.yml編集
$ vi playbook.yml

# インストールと起動
- hosts: all
  become: yes
  tasks:
    - name: add a new user
      user: name=hitomi

- hosts: web
  become: yes
  tasks:
    - name: install apache
      yum: name=httpd state=latest
    - name: start apache and enabled
      service: name=httpd state=started enabled=yes

# 実行
$ ansible-playbook playbook.yml
```

webサーバーのIPアドレス192.168.33.12をブラウザで叩くと、Apacheが入ってるのが分かります。





# 静的ページの表示

```
# 静的ページを作るよ
$ vi index.html

# いつものやーつ
<html>
Hello World！
</html>

# playbookで
$ vi playbook.yml

# オーナーを変えて、さっきのindex.htmlをコピー（前回までのところは省略）
    - name: change owner
      file: dest=/var/www/html owner=vagrant recurse=yes
    - name: copy index.html
      copy: src=./index.html dest=/var/www/html/index.html owner=vagrant

# 実行
$ ansible-playbook playbook.yml
```

192.168.33.12をブラウザで叩くと、無事にHello World！されました。こんにちは世界！





# PHPの表示

```
# playbookで
$ vi playbook.yml

# php関連ファイルをインストールしてApacheを再起動（前回までのところは省略）
    - name: install php packages
      yum: name={{item}} state=latest
      with_items:
        - php
        - php-devel
        - php-mbstring
        - php-mysql
      notify:
        - restart apache
    - name: copy hello.php
      copy: src=./hello.php dest=/var/www/html/hello.php owner=vagrant
  handlers:
    - name: restart apache
      service: name=httpd state=restarted

# phpが動いているか確認するためのテストファイルを用意
$ vi hello.php

# いつものやーつ
<?php
echo "Hello PHP！";

# 実行
$ ansible-playbook playbook.yml
```

ブラウザで下記を叩くと、無事にHello PHP！されました。こんにちはPHP！
http://192.168.33.12/hello.php

私の今回の目的だとドットインストールで勉強するのはここまでかな。





# 動作環境を人に渡すには？

なんとなくAnsibleの基本動作は分かったけれど、
今回の目的は「あるWEBアプリケーションを作って、その動作環境を用意して渡すこと」です。
「Ansibleで作った動作環境を人に渡す」って、最終的にはどういうカタチになるんでしょう？
メール添付なのか、Git管理なのか、なんか予想つかないカタチなのか。
調べていきます。

......ネットサーフィン中......

なんとなくイメージ沸いてきました。
こんな↓構成で作って、圧縮してメールで送ればいいのかな。
それかGitHubに公開して落としてもらうか。

```
app/
 ├─ html/            ・・・WEBアプリケーションのソースコード
 ├─ ansible.cfg
 ├─ hosts
 ├─ playbook.yml
 └─ Vagrantfile
```

練習ではVagrantで3つ仮想サーバーを立ち上げたうちの1つをホストにしたけれど、
今回はローカルをそのままホストにする。

共有する相手には下記2つのコマンドを実行してもらえれば、
同じ環境で動作確認ができるって感じ？

```
$ vagrant up
$ ansible-playbook playbook.yml
```

相手のPCにVagrantやAnsibleが入ってなかったら入れてもらわないとだけど… 大丈夫な気がする。
さて、こんな素人考えが本当に実行できるのか試してみましょ。





# Vagrantでサーバー立ち上げ2

Vagrantfileファイルは横着して、vim使わないでansible_lessonsのときに作ったものをコピペしちゃいました。
今回はdbサーバー不要なので、中身の設定はwebだけにします。

```
  config.vm.define "web" do |node|
    node.vm.box = "bento/centos-7"
    node.vm.hostname = "web"
    node.vm.network :private_network, ip: "192.168.33.10"
  end
```

さて立ち上がるでしょうか。

```
$ vagrant up
$ vagrant status
```

無事webサーバーが走ってます。




# ローカル環境にAnsibleをインストール

さっきと同じ方法でAnsibleをインストールしてもいいけど、
Macにインストールするもっと簡単な方法あるんじゃないの？
って調べてみたらHomebrew使うと一発みたいです。

あれ？仕事ではHomebrew使うけど、自宅のMacにHomebrew入ってたっけ？

```
$ brew help
-bash: brew: command not found
```

はい、入ってませんでした。まいっか、ついでに入れちゃおう。
参考サイトを元に、ガシガシ行きます。
参考）https://weblabo.oscasierra.net/homebrew-1/
参考）https://weblabo.oscasierra.net/ansible-homebrew-install-1/

まずXcodeをインストール。
https://itunes.apple.com/jp/app/xcode/id497799835

って、ダウンロードまでしてたのにインストールしてなかったの？過去の私！？
って、インストールいつまでかかんだよ！終わらないじゃん！って2度ツッコミ。
ググッたら私と同じで、Xcodeのインストールが終わらない人続出らしい。

ここ見てiTunesHelperってプロセスを強制終了したら、インストールできました。
参考）https://gabekore.org/app-store-xcode-install

次にコマンドラインツールをインストール。

```
$ xcode-select --install
xcode-select: error: command line tools are already installed, use "Software Update" to install updates
```

と思ったらすでに入ってたw
しかしどうも様子が変なので調べてみました。
こちらのサイトの方と同じ現象の模様。コマンドラインツールのパスがおかしいんだって！
参考）https://techracho.bpsinc.jp/hachi8833/2016_09_09/25454
対応方法はこちら↓

```
$ xcode-select -p
# 「/Library/Developer/CommandLineTools」と表示されれば正常なのでここでおしまい
# 「/Applications/Xcode.app/Contents/Developer」と表示されたらパスがおかしいので次に進む

# パスを変更
$ sudo xcode-select -switch /Library/Developer/CommandLineTools

$ xcode-select -p
# 「/Library/Developer/CommandLineTools」と出力されることを
```

気を取り直して、コマンドラインツールをインストール。

```
$ xcode-select --install
xcode-select: error: command line tools are already installed, use "Software Update" to install updates
```

と思ったけど同じメッセージ。そふとうぇああっぷでーとって、あれか。
私がずっとmacOSのアップデートを面倒臭がってるせいかな。やってみる。

......macOSのアップデート......

再起動の後、画面が真っ黒になってマウスカーソルだけ表示される不具合onz
そういえばこれずっと続いてるんでした… 放置してた…
2回再起動したけど全然アップデートできないでやんの。

今はmacのクリーンインストールとかしてる時間はないので、
Homebrew使う方法はいったん諦めてさっきと同じくpipでやります。

```
# pipをインストール
$ sudo easy_install pip

# pipでAnsibleをインストール
$ sudo pip install ansible

# ちゃんとインストールできたか、Ansibleのバージョン確認
$ ansible --version
ansible 2.5.4
  config file = None
  configured module search path = [u'/Users/topstar0624/.ansible/plugins/modules', u'/usr/share/ansible/plugins/modules']
  ansible python module location = /Library/Python/2.7/site-packages/ansible
  executable location = /usr/local/bin/ansible
  python version = 2.7.10 (default, Jul 15 2017, 17:16:57) [GCC 4.2.1 Compatible Apple LLVM 9.0.0 (clang-900.0.31)]
```

ﾊｧﾊｧ。たったこれだけのことに1時間以上かかったぞ。
最初からpipにすればよかった… まなんとかなりました。





# ローカルからplaybook実行

秘密鍵の設定とかあれこれ考えてこねくりしたけど、
お相手の手間を減らさないとAnsibleで動作環境を作る意味がないよな〜とウンウンうなりまして。
「こんな書き方できたらいいのにな」を想像しては検索してを繰り返して、なんとか形になりました。
お相手は基本的にこの2つだけコマンド打てば、ブラウザでWEBアプリケーションを確認できます。

```
$ vagrant up
$ ansible-playbook playbook.yml
# パスを聞かれたら、vagrant
```

秘密鍵とか.ssh/configの設定とか一切いらない！いい感じな気がする。
どうやったかをまとめていきます。

ファイル構成は、最初思いついたやつのままでいけました。

```
app/
 ├─ html/            ・・・WEBアプリケーションのソースコード
　｜   └─ index.html   ・・・Hello World！を表示するだけの簡単なお仕事
 ├─ ansible.cfg
 ├─ hosts
 ├─ playbook.yml
 └─ Vagrantfile
```

```index.html
<html>
Hello Worldだよ！
</html>
```

```ansible.cfg
[defaults]
inventory = ./hosts
ask_pass = True
```

```txt:hosts
[app]
192.168.33.10 ansible_ssh_pass=vagrant ansible_ssh_user=vagrant
```

```playbook.yml
- hosts: app
  become: yes
  tasks:
    - name: Apacheをインストール
      yum: name=httpd state=latest
    - name: Apacheを起動
      service: name=httpd state=started enabled=yes
    - name: オーナーチェンジ
      file: dest=/var/www/html owner=vagrant recurse=yes
    - name: htmlディレクトリのコピー
      copy: src=./html dest=/var/www/ owner=vagrant
```

```text:Vagrantfile
Vagrant.configure("2") do |config|
  config.vm.define "app" do |node|
    node.vm.box = "bento/centos-7"
    node.vm.hostname = "app"
    node.vm.network :private_network, ip: "192.168.33.10"
  end
end
```

```txt:共有した相手の操作方法

# appディレクトリに移動
$ cd /path/to/app/

# vagrant立ち上げ
$ vagrant up

# playbook実行
$ ansible-playbook playbook.yml
# パスを聞かれたら、vagrant

# ブラウザで下記にアクセスして動作確認
# 192.168.33.10

# vagrantを止める
$ vagrant halt
```

よしよし、なかなかいいものができた気がするお！(●´ϖ`●)