Ansible
OriginalゆめみDay 17

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 dockerで動かせて幸せでした.

    • docker-compose.ymlが下記にある為使わせて頂くことにしました
      • https://github.com/ansible-semaphore/semaphore
    • 一部変更して使いました
      1. MySQLにtaskの設定などを設定済みのデータを初期投入
      2. .ssh, ansible-vaultのパスファイルのマウント
        • ansible-vault pass、ssh接続情報は管理を分けたかったので
        • ホストサーバをマウントする形にした
      3. Nginxのproxyサーバは除去 (ローカルで動かす分には不要(そもそも動かなかった))
    • 幸せを感じた画面キャプチャ(リポジトリ名などは情報保護のため変更してます)
      • ansible-semaphore-login.png
      • ansible-semaphore-dashboard.png
      • ansible-semaphore-execute-task.png
  • Web API(認証付き)で、HTTP(S)経由でタスク実行もできた

    • こういう内容
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"

参考


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