AWX を10分でDeployしちゃうマン(10分でDeployできるとは言ってない)
この記事はAnsible Advent Calendar 2017 - Qiitaの2日目の記事です。
(12/22追記:PostgreSQLのコンテナのデータ保存先がデフォルトでは”postgres_data_dir=/tmp/pgdocker”とデプロイ先の/tmp以下に置かれる設定になっているため再起動時などで削除されてしまう状態でしたので、該当部分の変更を本文中で追記しています。)
どうも、鰻師の方から来ました。
皆さんは日本鰻師同好会という酷いグループをご存知でしょうか。
色々なアドカレに出没しては鰻師の蒲焼きのテーマソング(?)を替え歌にして様々なOSSの普及に努める 酷い 素晴らしいグループです(主な活動は歌って正拳突きをする、です)。
この「Ansible Advent Calendar 2017」もまさか初日と二日目を連続して日本鰻師同好会メンバーに乗っ取られるとは思っていなかったでしょう・・・。しかしご安心ください。初日の初代会長がいろんな意味でgdgdだったので安心して鰻ネタはスルーできます。やったね★
鰻ネタ成分を補充したい人は専用のアドカレがあるのでそっちで補充してください。
ちなみにそもそも鰻ネタの発端となったアドカレはこっち(初日の内容がソレです)。
じゃあAWXの話をしますか。
閑話休題。
本日はAnsible TowerのUpstream版であるAWXのデプロイについて書こうと思います。
このアドカレを見るAnsibleが得意なフレンズのみなさんには今更Ansible Towerのことを書く必要は無いと思いますが、AnsibleのCoreな機能にプラスして次のような機能が利用可能になるという素敵ソリューションです。
- グラフィカルで扱いやすいダッシュボード
- RBACベースの柔軟な権限管理
- ジョブスケジューリング
- 実行監査
- などなどなど
他にも上げればキリがないのですが、大規模環境でよりセキュアに、よりシンプルに、より便利にAnsibleを使おうと思ったときに大きな威力を発揮するプロダクトといって間違いはないでしょう。しかし、一つ問題が・・・そう・・・利用にはサブスクリプションの購入が前提だったのです・・・。
もちろん、企業内で利用する場合はしっかりとサポートがつくサブスクリプションを購入できることは逆に大きなメリットではあるのですが、やはち有償の製品となると使うにも少し敷居が高かったかと思います(ちなみに10ノードまでは無償利用できます)。
しかしご安心ください。それも既に昔の話。
2017年9月にAWXについてのアナウンスがありました通り、Ansible TowerのUpstream版であるAWXが現在は非常に容易に使えるようになりました(RHELに対するFedoraのような存在だと思ってください)。サポートがなかったりpatchの提供が受けられなかったりという制約はありますが、ひとまず使ってみる分には十分でしょう。AWX ProjectについてはこちらにFAQが用意されているので併せてご確認ください。
そいじゃAWXをデプロイしよう!
今回アドカレでAWXデプロイ話を書くかー!と思って登録したんですが、あらためてググったらサイオステクノロジーさんのOSSよろずブログで既に記事になってました。。もうコレでいいじゃないの?って気持ちになったんですが、少し手を変えて解説したいと思います。
当記事における 変態的 独特なポイントは次の通りです。
- 展開先ホストではRancherOS 1.1.0を利用します。
- rootユーザは利用しません。
- 各AWXのコンテナはRancherで監視します。
お前は何故ソレを・・・といわれそうな部分が多いのですが、まぁあまり気にしないでおきます。 ちなみに私はRancher JPのメンバーでもあり、昨日もRancher Advent Calendar 2017 - Adventarでアドカレを書いていたり・・・。
事前準備:インスタンス作成
今回の環境ですが、毎度お世話になっているCloud Garageさんの上にメモリ2GBのインスタンスをRancherOSで構築します。
細かい手順は省きますが、同様の手順でのRancherOSインスタンスの構築方法を説明したスライドを以前に公開しているので気になる人はそちらをご確認ください。
www.slideshare.net
RancherOSをインストールする際の構成ファイル内容は次の通りです。
cloud-config.yml
#cloud-config rancher: console: ubuntu ssh_authorized_keys: - (ご自分のSSH用秘密鍵に対応する公開鍵情報を記入)
consoleをubuntu
としたのは、あとからPython/AnsibleをインストールしてAWXをデプロイするためです。
このファイルをviで作成後、次のコマンドを実行するとRancherOSがインスタンスの仮想ディスクにインストールされます。
$ sudo ros install -c cloud-config.yml -d /dev/vda
尚、Cloud Garadgeさんを利用している場合は、インストール後にISOマウントを解除した後に強制再起動が必要になるので注意してください(普通の再起動ではダメ)。
再起動後、インスタンスにSSHログインし次のコマンドでOSをUpgradeしましょう。
$ sudo ros os upgrade
RancherOSはシステムもDockerコンテナで動いているのでUpgradeも簡単でいいですね。
パッケージのインストール
事前準備で既に10分以上経過している気がしますが、事前はあくまでも事前なのでカウント範囲外とします。しますったらします。
RancherOSではデフォルトでPythonすらインストールされていません。 ここで必要なパッケージをインストールしつつ、Pythonの仮想環境もvirtualenvで作成します。
$ sudo apt update $ sudo apt upgrade -y $ sudo apt install -y git python3-pip $ sudo -H pip3 install pip --upgrade $ sudo -H pip3 install virtualenv $ cd $ virtualenv venv $ source venv/bin/activate $ pip3 install ansible docker-py $ git clone https://github.com/ansible/awx.git
計測したところ、上記の作業はおよそ5分弱程度でした。
AWX構成ファイル(インベントリファイル)の編集
さてではAWXのデプロイの為に構成ファイルを編集しましょう。今回は時間短縮の為にsedで一気に書き換えます。 変更するのはpythonインタプリターの指定と各種パスワードの値およびPostgreSQLのデータ保存先です。次の例では見やすさの為にコマンドを分けましたが1回で実行しても問題ありません。
$ cd awx/installer/ $ cp inventory inventory.orig $ sed -i -e '/ansible_python_interpreter/{s#=[^=]*#="/home/rancher/venv/bin/python"#2}' inventory $ sed -i -e 's/^# default_admin_password/default_admin_password/' inventory $ sed -i -e '/default_admin_password/{s/=[^=]*/=(adminユーザパスワード)/1}' inventory $ sed -i -e '/awx_secret_key/{s/=[^=]*/=(シークレットキー)/1}' inventory $ sed -i -e '/pg_password/{s/=[^=]*/=(データベースパスワード)/1}' inventory $ sed -i -e '/postgres_data_dir/{s#=[^=]*#="/var/tmp/pgdocker/"#1}' inventory $ diff inventory inventory.orig 1c1 < localhost ansible_connection=local ansible_python_interpreter="/home/rancher/venv/bin/python" --- > localhost ansible_connection=local ansible_python_interpreter="/usr/bin/env python" 15c15 < default_admin_password=(adminユーザパスワード) --- > # default_admin_password=password 20c20 < awx_secret_key=(シークレットキー) --- > awx_secret_key=awxsecret 30c30 < postgres_data_dir="/var/tmp/pgdocker/" --- > postgres_data_dir=/tmp/pgdocker 51c51 < pg_password=(データベースパスワード) --- > pg_password=awxpass
これは一瞬ですね。
AWXのデプロイ
AWXのデプロイではansible-playbook
コマンドを利用します。基本的にほっとけばうまいこと全部やってくれるので助かりますね。Ansible便利!
$ ansible-playbook -i inventory install.yml PLAY [Build and deploy AWX] *********************************************************************************************************************************** ( 中 略 ) PLAY RECAP **************************************************************************************************************************************************** localhost : ok=12 changed=5 unreachable=0 failed=0
おおよそですが、デプロイに要した時間は3分ほどでした。
AWXへのアクセス
さて、デプロイができたのでブラウザから今回デプロイしたホストのIPアドレスをURLとしてアクセスしてみます。 すると・・・
ご覧のようにDatabaseのMigration待ちになります。大人しく待ちましょう。 私の環境では、おおよそ2分ほど待っていたらログイン画面が出てきました。
ユーザ名はデフォルトのadmin
、パスワードは先ほどsedで置換したadminパスワードを入力してログインします。
これでデプロイ完了です。事前準備を除けば、だいたい10分くらいでデプロイできたのではないでしょうか。
Rancherでコンテナを監視してみる
ここから完全にオマケです。
これまで使った感じですとPostgreSQLのコンテナが死んでしまうことが何度かありました。原因がはっきりわからないのですが、Restartが何らかの理由で掛かってしまってその際に/tmp/pgdocker
以下のデータベースデータがおかしくなってしまうようでした。同様の症状はググると他にもみつかるので、今後はもう少しなんとかなるかもしれません。
ひとまず各コンテナを管理しやすくするためにRancherの力を借りたいと思います。前述のSlideShareの中でも書いていますが、GitHubのアカウントさえあれば誰でもTry Rancherを無料で利用できるので、こちらを流用してコンテナの監視をしてみたいと思います。
TRY Rancherへログイン&ホスト追加
これはGitHub認証するだけなので楽ちん。詳しい流れは上の方のSlideShareのやつをみてね。
ログインが出来たら今回はいきなりホストの追加に進みます。画面上ホストの追加
のリンクボタン(または文字列)が表示あると思いますのでクリックしてください。
ホストの追加画面ではCustom
を選択し、5番目の手順にあるコマンドをメモリにコピーします。
コピーしたコマンドを今回AWXをデプロイしたRancherOS上で実行すれば、あとは勝手にTry Rancherにホストが追加されて各コンテナが管理可能な状態になります。
ホストが追加されたら画面上部のインフラストラクチャ
の中にあるコンテナ
のメニューを選択します。
Rancherのコンテナもインストールされてますが、AWXに関するコンテナを確認できます。
尚、AWXに関するコンテナは次の5つです。
- awx_task
- awx_web
- memcached
- postgres
- rabbitmq
ここでは、awx_taskのコンテナ名をクリックしてみましょう。すると、Rancher UI上でコンテナのUsage情報を確認できます。
また右上にあるボタンをクリックするとメニューが開くので、
ここからのコンテナのlogを確認したり、
シェルを起動して操作することも可能です。
まぁ、この辺はdockerコマンドでやってももちろんいいんですけどね。お好きなほうをご利用くださいませ。
まとめ
なんかすごい脱線した気もするのですが、AWXのデプロイはいかがだったでしょうか。
リリース直後は公式Dockerイメージもなくて毎回Imageをビルドしていたのでものすごく時間かかっていたんですが、公式Dockerイメージが用意されたことでかなり簡単にAWXも使えるようになったと思います。是非冬休みのお供にAWX(とRancher)を使ってみてください。
明日は@mnagakuさんの投稿だそうです。内容はなんだろう・・・。鰻ではないはず。