Ansible チュートリアル (身内向け)

先に [VirtualBox + Vagrant による検証環境セットアップメモ](https://qiita.com/ryo-sato/items/b50b9299ed9cb8855d7f) を読んで環境をセットアップしておくこと。

## 参考文献
- [Emacs 超クイックリファレンス](http://www.cc.kyoto-su.ac.jp/~mmina/bp1/EmacsSuperQuickReference.html)
- [yaml-mode.el : EmacsでYAMLを編集するyaml-modeが進化していた](http://emacs.rubikitch.com/yaml-mode/)
- [PuTTY+screenを256色で使う - 元RX-7乗りの適当な日々](http://d.hatena.ne.jp/rx7/20070904/p2)
- [GNU Screenの起動時やアタッチ時にターミナルをリサイズさせない方法](http://kaworu.jpn.org/kaworu/2008-03-06-1.php)
- [screenの難解な設定ファイルを読み解いてクールなステータスバーを表示する - Qiita](https://qiita.com/t_cyrill/items/54ffb13918cb421a961b)

- [package - Generic OS package manager — Ansible Documentation](http://docs.ansible.com/ansible/latest/package_module.html)
- [systemd - Manage services. — Ansible Documentation](http://docs.ansible.com/ansible/latest/systemd_module.html)
- [Inventory — Ansible Documentation](http://docs.ansible.com/ansible/latest/intro_inventory.html)
- [Become (Privilege Escalation) — Ansible Documentation](http://docs.ansible.com/ansible/latest/become.html)
- [Best Practices — Ansible Documentation](http://docs.ansible.com/ansible/latest/playbooks_best_practices.html)

## 準備
1. Emacs に yaml-mode を追加する。
1. ~/.bash_profile に TERM 環境変数を設定する。
1. ~/.screenrc を新規作成し, 便利機能を設定する。

### Emacs: yaml-mode 追加
事前に **Emacs 超クイックリファレンス** を開いて, 以下の基本操作を確認すること。
なお, `C-` は Ctrl を押し **ながら** の意である。

|操作|コマンド|
|----|--------|
|ファイルを開く|C-x C-f|
|上書き保存|C-x C-s|
|名前を付けて保存|C-x C-w|
|Emacs の終了|C-x C-c|

1. `$ emacs` と入力し, Emacs を起動, すぐに終了する。
   - ~/.emacs.d が自動生成される。
1. `$ emacs ~/.emacs.d/init.el` と入力し, 以下の内容を記載, 上書き保存して終了する。

    ```emacs-lisp:~/.emacs.d/init.el
    ;; yaml-mode.el : EmacsでYAMLを編集するyaml-modeが進化していた
    ;; http://emacs.rubikitch.com/yaml-mode/
    (package-initialize)
    (setq package-archives
          '(("gnu" . "http://elpa.gnu.org/packages/")
            ("melpa" . "http://melpa.org/packages/")
            ("org" . "http://orgmode.org/elpa/")))

    ;; For YAML
    (require 'yaml-mode)
    (add-to-list 'auto-mode-alist '("\\.ya?ml$" . yaml-mode))
    (define-key yaml-mode-map "\C-m" 'newline-and-indent)
    ```

1. 再度 `$ emacs` と入力し, Emacs を起動する。
   - この時点でエラーが出力される。
1. `M-x package-install` と入力する。
   - `M-` は Esc を押し **てから** の意である。
   - 画面下部に `Install package: ` と表示される。
1. `yaml-mode` と入力し, yaml-mode をインストール, 終了する。

### ~/.bash_profile: TERM 環境変数設定
1. `$ echo 'export TERM=xterm-256color' >> ~/.bash_profile` と入力する。

### ~/.screenrc: 新規作成, 設定
1. `$ cp -aiv /etc/screenrc ~/.screenrc` と入力し, 元ファイルをコピーする。
1. 以下のコマンドを実行する。

```sh
$ cat <<- EOF >> ~/.screenrc
> escape ^Z^Z
> defbce "on"
> term xterm-256color
> termcapinfo xterm-256color hs@:is=\E[r\E[m\E[2J\E[H\E[?7h\E[?1;4;6l\E[?1;4;6l
> hardstatus alwayslastline '%{= .y}%H %L=%{= .b}%-w%46>%{= .r}%n %t*%{= .b}%+w'
> EOF
```

### screen テスト
1. 環境変数を再設定するため, `$ exit` でログアウトしてから再ログインする。
1. `$ env | grep -E '^TERM='` と入力し, xterm-256color が設定されていることを確認する。
1. `$ screen` と入力し, screen を起動する。
   - 画面下部にログインホスト名とウィンドウ名: 特に設定してなければ `0 bash*` と表示される。
1. `C-z c` と入力し, bash を複製する。
   - 画面下部に `1 bash*` と表示される。
1. `C-z n` と入力し, ウィンドウを切り替える。
   - ウィンドウが 0 番目の bash に移動する。何回も試してみる。
1. 0 番目の bash で `$ screen ssh centos7-03` と入力し, 新規ウィンドウで ssh 接続する。
   - 画面下部に `2 ssh*` と表示される。
1. `C-z n` と入力し, ウィンドウを切り替える。
   - ウィンドウが 0 番目の bash に移動する。何回も試してみる。
1. `C-z p` と入力し, ウィンドウを切り替える。
   - ウィンドウが逆順で切り替わることを確認する。何回も試してみる。
   - これは, n が next (次) で p が previous (前) の意となっているためである。
1. `C-z d` と入力し, screen をデタッチ (切り離し) する。
   - `[detached from nnnn.pts-0.centos7-02]` と表示される。
1. `$ exit` と入力し, ログアウト, 再ログインする。
1. `$ screen -r` と入力し, screen に再アタッチする。
   - screen を使えば, サーバー上で長時間のタスクを走らせて帰宅できることが理解できると思う。
1. `C-z ?` と入力し, ヘルプを表示する。
   - 色々試してみる。スペースで読み進める。
1. 全てのウィンドウで `$ exit` と入力し, screen を終了する。
   - `[screen is terminating]` と表示される。

## チュートリアル本編
1. `$ screen` と入力し, screen を起動する。
1. `$ mkdir -pv ~/ansible-tutorial/roles/apache-httpd/tasks` と入力し, ディレクトリーを一通り作成する。
1. `$ cd ~/ansible-tutorial; pwd` と入力し, 作業ディレクトリーを変更する。
1. `$ emacs roles/apache-httpd/tasks/main.yml` と入力し, 以下の内容を記載, 上書き保存し, 終了する。
   - yaml-mode が起動するので, 自動的に色付けされ, Tab キーを押下するごとにインデントを調整できる。
   - コピペ後にインデントがズレる場合は, `C-x h` で全選択した後, `M-x indent-region` で *ある程度* 補正できる。

    ```yaml:roles/apache-httpd/tasks/main.yml
    ---
    - name: Install package
      package:
        name: httpd
        state: latest

    - name: Enable and start service
      systemd:
        name: httpd
        enabled: yes
        state: started
    ```

1. `$ emacs hosts.yml` と入力し, 以下の内容を記載, 上書き保存し, 終了する。

    ```yaml:hosts.yml
    ---
    all:
      children:
        ansible:
          hosts:
            localhost.localdomain:
              ansible_connection:
                local
        targets:
          hosts:
            centos7-03.localdomain:
    ```

1. `$ emacs install-apache-httpd.yml` と入力し, 以下の内容を記載, 上書き保存し, 終了する。

    ```yaml:install-apache-httpd.yml
    ---
    - name: Install and start httpd
      become: True
      hosts: targets
      roles:
        - apache-httpd
    ```

1. `$ screen ssh centos7-03` と入力し, ターゲットマシンにログインする。
1. `$ sudo tailf /var/log/messages` と入力し, ターゲットマシンのログを追跡状態で開く。
   - Enter キーを空打ちしてログの開始点を分かりやすくしておくと良い。
1. `C-z S` (S は大文字) と入力し, 画面を分割する。
1. `C-z Tab` と入力してから `C-z n` と入力し, Playbook を作っていたウィンドウに戻ることを確認する。
   - この時点で画面上部がターゲットマシンで画面下部が Ansible マシンとなっている。
1. `$ ansible-playbook install-apache-httpd.yml -i hosts.yml` と入力し, Playbook を実行する。
   - ok が 3, changed が 2 と表示されることを確認する。
   - Playbook の進捗に合わせて, ログも出力されることが確認できる。
1. 自端末の Web ブラウザーを開き, http://centos7-03.localdomain/ にアクセス, テスト用の画面が表示されることを確認する。
1. 再度, `$ ansible-playbook install-apache-httpd.yml -i hosts.yml` と入力し, Playbook を実行する。
   - 今度は ok が 3, changed が **0** と表示されることを確認する。
   - 変更なしで完了された, ということになる。
1. `C-z Tab` と入力してから `C-c` で tailf を終了, `$ exit` でターゲットマシンからログアウトする。
1. `C-z X` (X は大文字) と入力し, 分割していたウィンドウを戻す。
   - この時点で制御は Ansible マシンに移っている。
1. `$ exit` でログアウトし, screen を終了する。




どっとはらい。