Ansible 2.9とVagrantをMacで使ってみた

早起きしたのでAnsible勉強することにしました:sunny:
日曜日に早起きってなかなかレアです

## 検証環境:cat:
macOS Catalina（10.15.1）
余談。この本体自体はMacbook Air(11インチ 2012)
思ってたより長生き。メモリが4GBしかない:tea:
cpuも最近買った私のスマホに負けている（とほほ

## Virtual boxをmacにインストールしてみる:mouse2:
https://www.virtualbox.org/wiki/Downloads
![スクリーンショット 0002-02-02 7.19.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/194135/7647095b-9a31-e98e-fa78-bead8c19a52b.png)
OS X hostsのやつをダウンロードする
あとはいつものようにdmgファイルからインストール進めるだけ、、:relaxed:
と思ったらなにやらうまくいかなかった
![スクリーンショット 0002-02-02 7.10.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/194135/b97ec3c7-0161-f2d2-1a4c-d6ba62dfcd76.png)
![スクリーンショット 0002-02-02 7.11.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/194135/86e55d12-de5a-1208-c143-d20b58744c10.png)
えぇ、、:expressionless:
![スクリーンショット 0002-02-02 7.20.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/194135/b2bfc895-e1d7-0e7a-bb81-01889e8222b6.png)
環境設定のセキュリティとプライバシーのとこから↑のスクショの下あたりにvirtualBoxからの要求が残っているので、左下のカギマークを押して解除してからvirtualBoxを許可してあげる
※↑のスクショは既に解決済みスクショ（撮り損ねた、、）

再度インストールを実行すると上手く行った:ok_hand:
![スクリーンショット 0002-02-02 7.12.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/194135/72ac0412-98ec-db86-b84b-5c2ecbb3c77f.png)


```console
$ VBoxManage -v
6.1.2r135662
```
## Vagrantをmacにインストールしてみる:cow2:
https://www.vagrantup.com/downloads.html
![スクリーンショット 0002-02-02 7.19.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/194135/728185cd-9d2d-3639-6499-cdf6f2d29613.png)
りんごのやつをダウンロード
![スクリーンショット 0002-02-02 7.17.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/194135/bffe9221-af27-da6d-ac55-4ffc8c419606.png)
問題なくインストール完了:thumbsup:

```console
$ vagrant -v
Vagrant 2.2.7
```

## Ansibleをmacにインストールしてみる:tiger2:

brewでインストールしてみる

```console
$ brew install ansible
~~🍺省略~~
==> Installing ansible
==> Downloading https://homebrew.bintray.com/bottles/ansible-2.9.3.catalina.bottle.tar.gz
==> Downloading from https://akamai.bintray.com/69/693228e5f7c7b2b02581ae94589d28eac2b6b1128d97c87f08e8acfa22f8f035?__gda__=exp=1580596919~hmac=dafa919db241a7985a6b6023e8f64090da920dcfffbbb17bf
######################################################################## 100.0%
==> Pouring ansible-2.9.3.catalina.bottle.tar.gz
🍺  /usr/local/Cellar/ansible/2.9.3: 16,933 files, 211.1MB
~~省略🍺~~

$ ansible --version
ansible 2.9.3
  config file = None
  configured module search path = ['/Users/ユーザー名/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules']
  ansible python module location = /usr/local/Cellar/ansible/2.9.3/libexec/lib/python3.8/site-packages/ansible
  executable location = /usr/local/bin/ansible
  python version = 3.8.1 (default, Dec 27 2019, 18:06:00) [Clang 11.0.0 (clang-1100.0.33.16)]

$ ansible #Tabキー入力候補
ansible             ansible-connection  ansible-doc         ansible-inventory   ansible-pull        ansible-vault
ansible-config      ansible-console     ansible-galaxy      ansible-playbook    ansible-test
```
たぶん問題ないのでおっけ〜　`バージョンは2.9.3`（これが後の苦労に繋がる、、）

## AnsibleとVagrantをMacで使ってみる（表題）:rabbit2:

Ansibleがインストールできたので、環境準備していく:snake:

### vagrant用のディレクトリを作成

```console
$ cd /Users/ユーザー名 ※権限アリそうなところに適当に移動する
$ mkdir vagrants
$ mkdir vagrants/ansible_test
$ cd vagrants/ansible_test/ # これからずっと作業することになる場所
$ vagrant box list
There are no installed boxes! Use `vagrant box add` to add some.
```
ぼ、boxがなにも無いーーー！！（当然）

### boxを追加する

```console
$ vagrant box add centos/7 --provider virtualbox
==> box: Loading metadata for box 'centos/7'
    box: URL: https://vagrantcloud.com/centos/7
==> box: Adding box 'centos/7' (v1905.1) for provider: virtualbox
    box: Downloading: https://vagrantcloud.com/centos/boxes/7/versions/1905.1/providers/virtualbox.box
    box: Download redirected to host: cloud.centos.org
==> box: Successfully added box 'centos/7' (v1905.1) for 'virtualbox'!
$ vagrant box list
centos/7 (virtualbox, 1905.1)
```
一応デフォルトで適切なプロバイダーを選ぶ的なことが記載されていたがaddするとき聞かれて入力するのは手間なので最初から指定しておく
オプションとして`--provider virtualbox`をつけることにした
[Command: vagrant box](https://www.vagrantup.com/docs/cli/box.html)
> --provider PROVIDER - If given, Vagrant will verify the box you are adding is for the given provider. By default, Vagrant automatically detects the proper provider to use.

### VagrantFileを作る

```console
$ vagrant init centos/7
$ ls -la
Vagrantfile
```
作成したVagrantFileの設定を以下のように設定していくお:sushi:

```config:VagrantFile
15行目くらい
  config.vm.box = "centos/7" #これはinitの時に指定したのでokですね
26行目くらい
  # config.vm.network "forwarded_port", guest: 80, host: 8080
  のコメントアウト外す
  config.vm.network "forwarded_port", guest: 80, host: 8080
35行目くらい
  # config.vm.network "private_network", ip: "192.168.33.10"
　のコメントアウト外す
  config.vm.network "private_network", ip: "192.168.33.10"
```

ここでいったんvagrantの起動と接続に成功するか試す

```console
$ vagrant up
$ vagrant ssh
```
okならいよいよAnsibleの設定をしてみようの巻
ダメならグーグル先生に聞いてみようのコース

## Ansibleの設定をしてみる :dragon:

### VagrantFileにAnsibleの設定を追加してみる

```config:VagrantFile
70行目くらいに追加
　config.vm.provision "ansible" do |ansible|
    ansible.playbook = "provisioning/ansible.yml"
    ansible.inventory_path = "provisioning/hosts"
    ansible.limit = 'all'
  end
```

### InventoryやPlaybookを作成してみる

まずはInventoryやPlaybookを入れてくためのディレクトリ作成してみる

```console
$ mkdir provisioning
```

inventoryファイルを作成してみる ※ エディタはお好みの物でok
`$ vim provisioning/hosts`

```yaml:provisioning/hosts
[vagrant]
192.168.33.10 #ここにssh-configのホスト名を記述することも可能（らしい、試してない）
[vagrant:vars]
ansible_ssh_private_key_file=/Users/ユーザー名/vagrants/ansible_test/.vagrant/machines/default/virtualbox/private_key
ansible_become=yes
ansible_user=vagrant
ansible_become_method=su
ansible_become_user=root
ansible_become_password=vagrant
```
ansible_ssh_private_key_fileのパスは/からのパスで書くのをおすすめします

private_keyの場所はこのコマンドで確認できます

```console
$ vagrant ssh-config
```

Ansibleやってる感でてきた:flushed:

### playbookを作成してみる

わりと公式のドキュメントからのコピペです（公式ドキュメントのExample参考になります！）
[yum – Manages packages with the yum package manager](https://docs.ansible.com/ansible/latest/modules/yum_module.html)

nginx入れたかったのでnginxで書いてますが、
apache入れたい方はコメントアウトのとこ外してみてください（試してないけど多分動く

`$ vim provisioning/ansible.yml`

```yaml:provisioning/ansible.yml
- name: my ansible start
  hosts: vagrant

  tasks:
  # Note: これ実行すると初回は時間がかかります
  - name: upgrade all packages
    yum:
      name: '*'
      state: latest
  # apache入れたい方はこちら〜
  # - name: install the latest version of Apache
  #   yum:
  #     name: httpd
  #     state: latest
  - name: install the nginx rpm from a remote repo
    yum:
      name: http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm
      state: installed
  - name: Install a list of packages
    yum:
      name:
        - nginx
        - postgresql
        - postgresql-server
        - git
      state: installed
  - name: nginx service started
    service:
      name: nginx
      state: started
      enabled: yes
  - name: create public directories
    file:
      path: /home/vagrant/app
      state: directory
      mode: '0755'
      owner: vagrant
      group: vagrant
```

実際にはバージョンの指定だとか、設定ファイルだとかphpやらrubyやら他にも、色々必要な事はあると思いますが、
今回はAnsibleに触れてみよ〜っていう気軽さなので、ここでは解説しません、、
（jinja2:shinto_shrine:とかの話も入れないといけなくなっちゃう:sob:)
あとは公式ドキュメントを読むだけ

### ドライランとか

```console
# syntax-check
$ ansible-playbook -i provisioning/hosts provisioning/vagrant.yml --syntax-check
YAML形式に慣れてないとここで泣かされる、、、

# dry-run
$ ansible-playbook -i provisioning/hosts provisioning/vagrant.yml --check
初回実行時（まだrunしてない）はパッケージインストールのとこでエラーがでるかもしれない、リポジトリ周りで
```
↑dry-runだけで大丈夫です（syntax-check書いたけど）
どうしてもsyntaxの檻から抜け出せない方はこちらの拡張をおすすめしときます！
__vscode用です！__
https://marketplace.visualstudio.com/items?itemName=vscoss.vscode-ansible

## Ansibleをうごかしてみよう！（やっと）:snake:

```
$ ansible-playbook -i provisioning/hosts provisioning/vagrant.yml
```

おそらくここでも数多の壁が立ちはだかるかも知れないですが、ログを見てがんばりましょう、応援してます！:innocent:
~~めんどくさくなったとか、もうしばらく英語は読みたくないとかではない~~

### てきとうな確認

nginxはいりましたの確認

```
[root@localhost ~]# nginx -v
nginx version: nginx/1.16.1
[root@localhost ~]# systemctl status nginx
● nginx.service - nginx - high performance web server
   Loaded: loaded (/usr/lib/systemd/system/nginx.service; enabled; vendor preset: disabled)
   Active: active (running) since Sun 2020-02-02 05:56:25 UTC; 13min ago
     Docs: http://nginx.org/en/docs/
  Process: 7508 ExecStart=/usr/sbin/nginx -c /etc/nginx/nginx.conf (code=exited, status=0/SUCCESS)
 Main PID: 7509 (nginx)
   CGroup: /system.slice/nginx.service
           ├─7509 nginx: master process /usr/sbin/nginx -c /etc/nginx/nginx.conf
           └─7510 nginx: worker process
```
ブラウザからもnginxのウェルカムページが表示されるか確認してみる
![スクリーンショット 0002-02-02 15.11.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/194135/f74f53e7-a332-0b8d-ab7c-82c3a75f63bc.png)

見れました！:confetti_ball:

ついでにディレクトリ作成されてるか確認

```console
$ vagrant ssh
[vagrant@localhost ~]$ ll
合計 0
drwxr-xr-x. 2 vagrant vagrant 6  2月  2 05:56 app
```
755のvagrant:vagrantのappディレクトリができてますね
時間はなんかおかしいですね、、、というか時刻的にGMTだ、、
これも普段日本の時刻に合わせる時のやり方をすれば良いと思われます
あと作成時間のタイムスタンプとかの設定もできるっぽいので、詳しくは公式ドキュメントご確認ください
[file – Manage files and file properties](https://docs.ansible.com/ansible/latest/modules/file_module.html)

## 感想:racehorse:
ちょっと早起きしたからってなんでも出来る気分になっていました。
やってみたら奥が深くて私のような初心者には難しいのではと思いつつも、
現時点で最新のバージョンでやってみました。
Macもぶっちゃけガタがきてて不安だったのですけど（ありがとう:apple:)
反省します、、後悔はしてない！

## ひそかにトラブったやつ。。。

```
$ ansible-playbook -i provisioning/hosts provisioning/vagrant.yml --check

PLAY [my ansible start] *************************************************************************************************************************************************************************

TASK [Gathering Facts] **************************************************************************************************************************************************************************
The authenticity of host '192.168.33.10 (192.168.33.10)' can't be established.
ECDSA key fingerprint is SHA256:rDFlObtISFdpBb5500Sl+PDQ6Xk1RKoa8tndjwvpukY.
Are you sure you want to continue connecting (yes/no)? yes
fatal: [192.168.33.10]: UNREACHABLE! => {"changed": false, "msg": "Failed to connect to the host via ssh: Warning: Permanently added '192.168.33.10' (ECDSA) to the list of known hosts.\r\nvagrant@192.168.33.10: Permission denied (publickey,gssapi-keyex,gssapi-with-mic).", "unreachable": true}

PLAY RECAP **************************************************************************************************************************************************************************************
192.168.33.10              : ok=0    changed=0    unreachable=1    failed=0    skipped=0    rescued=0    ignored=0
```
ひみつのカギが！？ダメっていわれるやん！！

```
$ ansible-playbook -i provisioning/hosts provisioning/vagrant.yml --check --private-key=~/vagrants/ansible_test/.vagrant/machines/default/virtualbox/private_key
う、動いた〜
```
※この設定はInventoryに記述したためコマンド引数で渡す必要はなくなった、R.I.P...:innocent:

__become周りにはさらに壮絶な試行錯誤が行われましたが、履歴が汚すぎるのでこの世から葬り去りました__:skull_crossbones:

## 参考文献
非常に勉強になりました。全てのドキュメント著者に感謝
[yum – Manages packages with the yum package manager](https://docs.ansible.com/ansible/latest/modules/yum_module.html)
[Understanding privilege escalation: become](https://docs.ansible.com/ansible/latest/user_guide/become.html)
[How to build your inventory](https://docs.ansible.com/ansible/latest/user_guide/intro_inventory.html)
[file – Manage files and file properties](https://docs.ansible.com/ansible/latest/modules/file_module.html)
[Ansible Quick Start video](https://www.ansible.com/resources/videos/quick-start-video)
[MacにVagrantでCentOS7環境を作成](https://qiita.com/sudachi808/items/3614fd90f9025973de4b)
[Ansibleをはじめる人に。](https://qiita.com/t_nakayama0714/items/fe55ee56d6446f67113c)
[AnsibleとVagrantで開発環境を構築する](https://knowledge.sakura.ad.jp/2882/)
[Ansible ～serviceモジュール～](https://qiita.com/moiwa/items/c320c7073a7ef086c5c9)
[ansible-playbookコマンドをInventoryファイルなしで実行する](https://qiita.com/ariarijp/items/503f6fdcc9ff8b35f374)