2017年、Ansibleを使ったことについて書く

## はじめに

* この記事は、自分が今年ゆめみで初めて `Ansible` を使った時の思い出を書きつづっています.

* AnsibleはPythonで書かれている構成管理ツールです.

* ここでは個人的な導入背景とかを綴っていきます.
    * コマンド説明とか、チューニングとかの説明は?
        * 公式やQiitaにたくさんありましたのでそちらで.

## 背景(導入まで)

* 以下の背景で、構成管理ツールを使うことを考えました
  * 構築・運用してるシステムがあって
  * しばらくして段階的に状況が変わってきました
      * 日本以外の複数国に展開
      * 諸事情によりど新規でインフラ構築の必要に迫られる
      * 自分以外の人への引き継ぎが必要になる
  * 以下のようなことを構成決めて管理・共有したいと思った
      * 頻繁に行う作業のスクリプト化
          * デプロイ、M/Wインストール・設定、DBへのデータ投入, AWS関連作業など
      * 設定ファイルなど資材の管理
      * 対象サーバ、設定などパラメータ管理
      * 大きなスクリプトは役割や用途ごとに分割(分割単位)
      * 秘匿情報も入ってるので暗号化ルール
      * 複数サーバに対して作業する場合の方法
      * ログ残したりしたい

## なぜ Ansible
* 自分は以下の理由でAnsibleを使うことにしました(正直困っていたので、なんでも良かったのですが、、)
   * 背景に記載した、必要だと思うルールを定めてくれること(ルール制定・共有コストを省略)
   * たくさんの人に使われている(社会的信用,説明しやすい)
   * 情報が多い(学習しやすい)
   * お金がかからない(有償だと導入のハードルになる)
   * プログラミング言語の縛りがない(ない方が望ましい)
   * インストールと使い方が簡単(可能な限り)
   * 商用の鍵など秘匿情報を預けるような(いわゆるSaaS)は避けたい(承認フローの回避)

## 振り返って

* 気づくとほぼYamlを書いていました.
   * Ansible(構文がyml)
   * Docker Compose(ymlで書く)
   * AWS CloudFormation(ymlでも書ける)
* Ansibleで作成するファイルの一部はフォーマットがYAMLではない
   * 設定ファイル(ansible.cfg)
   * 設定対象サーバを記述するinventoryファイル(2.1以降であればyamlでも問題なく書ける)
   * YAMLだけで書けると個人的には楽

* やりたかったことは一通りできて嬉しかったです.
   * 優先度高いものは共有できたと思っている
   * 全自動化とか、一番良い形で共有できたわけではない分があり残念

* あ、GUIが無償で使えた
   * Ansible SemaphoreというOSS (MIT License)、無償で使えるGUI. 
       * Ansible Towerがあるが、これは有償
   * Githubページはこちら
       * https://github.com/ansible-semaphore/semaphore

* Ansible-Semaphore dockerで動かせて幸せでした.
   * docker-compose.ymlが下記にある為使わせて頂くことにしました
       * `https://github.com/ansible-semaphore/semaphore` 

   * 一部変更して使いました
      1. MySQLにtaskの設定などを設定済みのデータを初期投入
      1. .ssh, ansible-vaultのパスファイルのマウント
          * ansible-vault pass、ssh接続情報は管理を分けたかったので
          * ホストサーバをマウントする形にした
      1. Nginxのproxyサーバは除去 (ローカルで動かす分には不要(そもそも動かなかった))
   * 幸せを感じた画面キャプチャ(リポジトリ名などは情報保護のため変更してます)

       * ![ansible-semaphore-login.png](https://qiita-image-store.s3.amazonaws.com/0/79576/ace83351-13cb-54f1-2c66-665d5c274148.png)
       * ![ansible-semaphore-dashboard.png](https://qiita-image-store.s3.amazonaws.com/0/79576/e5944ff6-995f-b1a1-19ec-3ad9fc3c0e71.png)
       * ![ansible-semaphore-execute-task.png](https://qiita-image-store.s3.amazonaws.com/0/79576/59da502d-edf8-55b4-b677-812da2fd7f6a.png)

* Web API(認証付き)で、HTTP(S)経由でタスク実行もできた
   * こういう内容

```bash

curl -X POST \
    --cookie-jar /tmp/semaphore-cookie \
    --header 'Content-Type: application/json' \
    --header 'Accept: application/json' \
    -d '{"auth": "admin@localhost","password": "yumemi"}'
    "http://localhost:18081/api/auth/login"

TOKEN=$(curl -Ss -X POST -b /tmp/semaphore-cookie --header 'Content-Type: application/json' --header 'Accept: application/json' "http://localhost:18081/api/user/tokens" | jq -rc ".id")

curl -Ss -X POST 
    --header "Authorization: Bearer $TOKEN" \
    --header 'Content-Type: application/json' \
    --header 'Accept: application/json' \
    -d "{\"template_id\":1,\"debug\":false,\"dry_run\":true}" \
    "http://localhost:18081/api/project/1/tasks"
```

## 参考
* 公式
    * https://www.ansible.com/
* Ansible徹底入門 (下記、著者インタビュー 2017)
    * http://jp-redhat.com/openeye_online/column/oss-note/5403/

---------
以上, Ansibleと出会えてよかった2017振り返りですm(_ _)m