Ansibleもくもく会 （サーバ編）2019.06のブログ枠

# ansible もくもく会 2019/06/13

## 場所

レッドハット恵比寿オフィス 3階

## オープニング

- AWS Summit or interop (どっちも幕張メッセ)行った人
    - (自分)ノ
    - Red Hatブースも盛り上がってました
        - ソフトウェアデザイン(Ansible回)をばらまいてた
	
- ansibleアップデート
    - 今年に入ってからの活動共有
    - Trelloで持ち込み企画募ってます
    - 運営側のサポートしてくれる方募集してます


## やること

### もくもく会の位置づけ 

- 参加者自身のペースで学習していく
- Engine と Towerが今回のテーマ
- 運営側で環境と教材を用意しています
- RedHatからサポートメンバー(数名)と、Google Docsで随時質問受け付けてます

- サポートしてくださる方(メンター枠)います
	- QAのサポートくらいのレベル感で大丈夫です
- 成果共有枠
	- 30分枠で順番にその日やったことを共有してくれる方
- ブログ枠
	- アウトプット枠 ← 今回参加したとこ(connpass見たときにはすでに一般参加枠が埋まってた…)

などなどアウトプットいただける方大歓迎。

## 環境とコンテンツ

### 環境の方

- 50インスタンス x2セット用意
- ↓はログイン後に気になって確認した
  
```bash:terminal
[xxx@ansible ~]$ cat /etc/redhat-release
Red Hat Enterprise Linux Server release 7.4 (Maipo)
```

ﾃﾞｽﾖﾈｰ

### コンテンツ(教材)の方

- [Ansible Engine演習](https://github.com/ansible/workshops/blob/master/exercises/ansible_engine/README.ja.md)
- [Ansible Tower演習](https://github.com/ansible/workshops/tree/master/exercises/ansible_tower)

私自身触るのは初めてではないのですが、まともに触ってた頃(5,6年くらい前)から浦島太郎状態だったのもあり、
今回は基本的なところから思い出したかったのでAnsible Engineに集中しました。

## 演習内容とか

### Ex1. アドホックコマンドの実行

ここでは、インベントリファイルの場所の確認方法だったり、インベントリファイルの中身の確認を行った。

```bash
# インベントリファイルの場所の確認
[ansible ~]$ cat ~/.ansible.cfg
[defaults]
stdout_callback = yaml
connection = smart
timeout = 60
deprecation_warnings = False
host_key_checking = False
retry_files_enabled = False
inventory = <inventoryファイルの絶対パス>    # ココ

# 実際のインベントリファイルの中身
[ansible ~]$ cat <インベントリファイルの絶対パス>
[all:vars]
ansible_user=xxxx
ansible_ssh_pass=xxxx
ansible_port=22

[web]
node1 ansible_host=<ipv4 addr1>
node2 ansible_host=<ipv4 addr2>
node3 ansible_host=<ipv4 addr3>

[control]
ansible ansible_host=<ipv4 addr4>
```
こんな感じになってました。

これを踏まえた上で、

```bash
$ ansible web -m ping
$ ansible web -m command -a "uptime" -o
$ ansible control -m command -a "uptime" -o
$ ansible all -m command -a "uptime" -o
```

などなど確認してました。


自分で改めて基本的な操作やってて気づいたというか発見したのは、
-o(--one-line)オプションの存在
manの解説では、"condense output"とのことで複数行の結果でも
1行にまとめてくれる模様

```bash
# つけるパターン
$ ansible all -m command -a "uptime" -o
node2 | CHANGED | rc=0 | (stdout)  06:23:18 up 20:39,  1 user,  load average: 0.00, 0.01, 0.05
node1 | CHANGED | rc=0 | (stdout)  06:23:18 up 20:42,  1 user,  load average: 0.00, 0.01, 0.05
node3 | CHANGED | rc=0 | (stdout)  06:23:18 up 20:37,  1 user,  load average: 0.00, 0.01, 0.05
ansible | CHANGED | rc=0 | (stdout)  06:23:18 up 20:44,  2 users,  load average: 0.04, 0.03, 0.05

# つけないパターン
$ ansible all -m command -a "uptime"
node2 | CHANGED | rc=0 >>
 06:24:57 up 20:40,  1 user,  load average: 0.00, 0.01, 0.05

node1 | CHANGED | rc=0 >>
 06:24:57 up 20:43,  1 user,  load average: 0.00, 0.01, 0.05

node3 | CHANGED | rc=0 >>
 06:24:57 up 20:38,  1 user,  load average: 0.00, 0.01, 0.05

ansible | CHANGED | rc=0 >>
 06:24:57 up 20:46,  2 users,  load average: 0.01, 0.02, 0.05

```

今まできにしたこともなかったけど、
実際に(このレベルの出力なら)見やすくなるなぁと。
※-vvvvとかするとヤバイ

### Ex2. 初めてのplaybook作成

肩の力も抜けたあたりでplaybookを作成してみる演習。
この章ではしれっとyaml開始を定義～とあるんだけど
いきなり見た人は???ってなるのか、なるほどそういうもんかってなるのかどうなんだろう。
※個人的には、初めて触るものは後者のほうが(最初の頃は)余計なつまづきが少なくていいと思ってる

実際の内容は、前の章で確認したwebサーバ群(3node分)に
httpdをインストール/アンインストールさせるもの。
チュートリアル的な解説はインストールまでで、
アンインストールはヒントが出されて解く感じ。

やってみてアンインストールのときに気になったのは、
state句に定義する内容が、removed(削除された)ではなくabsent(存在しない)であること
※実際に試したけど、このレベルで出力や動作に差分はほぼなかったが

ansibleの冪等性を鑑みると、removedだと"常に削除された状態"を保とうとするが
absentだと、"存在しない状態"を保とうとすることになる。
日本語レベルの違いかもしれないが、後者のほうが収まりが良いと思った。
※削除された、だと常にyum remove(して失敗)するような気もするが、
存在しない、だと調べて存在しなければ何もしないので、気持ち無駄が少なく感じる。

###  Ex3. 変数、ループ、ハンドラを使う

この章では、ansible内の変数やループやハンドラといった
およそプログラミング言語らしい機能を触ってみようという内容。
正直自分も意識して変数や制御構文的な部分は理解したことがなかったので
掘り下げる良い機会だった。

ちなみに、この章の最後にしれっと構文チェック方法(--syntax-check)が紹介されてた。
※記憶違いか、--dry-runとかなかったっけ

### Ex4. apache-basic-playbookを実行する

ここでは、前章で作成したplaybookを実行してみる内容。
※手動でコピペしていってたら、一行漏れててエラーでたから
最後のやつ丸コピした(うまく動いた

### Ex5. Roles：Playbookを再利用可能にする

ここまで作ってきたplaybookを再利用可能にするようにいじっていく。
Ansible Galaxyでroleを初期化するんだけど、
またしてもいきなりGalaxyが出てきて( ﾟдﾟ)ﾎﾟｶｰﾝとした。
やっている内容はなんとなくわかったけど
Galaxy含めて何度かおさらいしとこう。。。


## 成果共有枠の方々

- はるかさん
	- ansible歴2日です(嘘 ※後日、2日は本当！というコメントいただきました)
	- 前回何事もなく終わったのに、今回まだ終わってません！(2本開けたから…？)
	- つまずいたとこ
		- Playbookを実行してみよう(Ex1.2)
			- httpdを止める順番を変えずに実行してしまった
			- 順番変えてもfailed=1だったが、(インストールされて)ないものを止めようとしていたから
		- Ex4
			- 謎のエラー(WARNING)がでた
			- Playbookのインデントが余計に入っていた。
			- 1インデント=1インシデントという名言をもらった
	
- umimaさん
	- 本物のansible歴2日です
	- 普段は上流工程をやっているが、ansibleの話をもらっていて触ってみたかった
	- 変数やハンドラといったことを知れて業務でも使えそう！
	- ansible galaxyという存在をしった！
		- 時間切れなのでまた今度参加したい！
	
- kmizutaさん
	- もくもく会2回目の参加
	- Engineは復習、Towerは初めて
	- 今回は浅い部分を触ったので、もう少し掘り下げてみたい

- mizuto1217さん
	- 業務では使ったことがなく、先週くらいからAWS上にansible入れて触っていた
	- 普段はNWを触っていてあまりサーバ系はやったことがなかった
	- teratermでマクロを作っているのをansibleに置き換えると、構文チェックもあるし便利！
	- towerも引き続き勉強したい

ここでコメント

- インデントチェックには、yaml lintやansible lintを活用するのもいい
- 実際にはCI/CDと絡めて使ったりする


## あとがき

後半の方の分量が少ないのは、
短時間で噛み砕いて理解しきれてないので
おいおい調べ直そうと思います。

また、参加するときにテーマとかあるのかなぁ～なにやるのかなぁ～と、
~~優柔不断に~~気軽に参加しちゃったのでそこは反省かなと。。。
※もちろんansibleこれから触ってみたい！って方は丁寧にサポートしてもらえる場だと思うので
気にせず参加して大丈夫だと思いました。

ノベルティで頂いたansibleキーホルダー？はちゃんと通勤用の
カバンにつけました。
※ちょこちょこ #旅するAnsible 上げていくぞ～～