るいすときのこの物語

オタクエンジニアの雑記

Ansible AWX + tower-cli で Toil を無くしていきたい


新社会人になって、気づけばもう半年が過ぎた。
体調を崩すと治るまで時間がかかったり、老いを感じる23歳(童貞)です。

Ansible Advent Calendar 2018 の3日目の記事です。
2日目は、tomonorimatsumura さんの「AnsibleでCentOS7へジョークプログラムをインストールする」でした。

どうせ、AWX のことばっかなんだろうなあと思ってたらそうでもなかったので少し安心。
数年前から今もずっと何故か Ansible を触ってきてやっとちょっと分かってきたので、触ったことがない Ansible AWX を今回のアドベントカレンダーのためにちょっと触ってみました。

Ansible AWX とは

RedHat が開発している Ansible Tower の OSS 版です。
超雑に分かりやすく言うと、Ansible を実行してくれるサーバーです。

WebUI があって、ユーザー認証、ユーザー,グループ,オーガナイゼーション管理、ワークフロー、ジョブスケジューラ、通知とか必要なものは一通り揃っています。

やりたいこと

業務で VM の再作成が必要になったとき、VM を作成した後、Ansible を手元のローカルマシンから流していたのを、自動で行いたい。
そんなこんなで実際にできたのは下記の構成図

VM 作成後に、自動で Ansible を適用したい図
※ EC2 アイコンなのは許してほしい

① User Data を使う

弊社御社では、仮想アプライアンスに OpenStack を使っているので、User Data が使えます。(もちろん EC2 でも)
なので、ここらへんは問題なく Ansible AWX に対してアクションが行えます。

② & ③ tower-cli の登場

tower-cli を使うと、コマンドラインで AWX を制御することができます。
インストール方法も簡単。

インストール

# yum install python-pip -y
# pip install ansible-tower-cli

# tower-cli config username admin
# tower-cli config password password
# tower-cli config host http://10.0.0.2
# tower-cli config verify_ssl False

そして、自ホストを登録するには

# tower-cli host create --name $(hostname -f) --inventory dev-unchi --force-on-exists

--force-on-exists
をつけることで、同じホストネームが居ても上書きすることができます。

自ホストのみに Ansible を実行

tower-cli job launch --job-template=10 --limit "$(hostname -f)" --credential "unchi"

--limit をつけることで、特定のホストに対してのみ実行が可能。
ちなみに --monitor をつけると、AWX の実行画面が出力されたりします。

--job-template=10 に関しては、AWX 上で作成したテンプレートの ID を指定するのですが、
この数値、再利用されることはないので安心してください。

User Data の完成形

#!/bin/bash

# need packages
# ============
yum install python-pip -y
pip install ansible-tower-cli

# prepare
# ======
tower-cli config username admin
tower-cli config password password
tower-cli config host http://10.0.0.2
tower-cli config verify_ssl False

# register this host into inventory
# ========================
tower-cli host create --name $(hostname -f) --inventory dev-unchi --force-on-exists

# execute
# ======
tower-cli job launch --job-template=10 --limit "$(hostname -f)" --credential "unchi" --monitor

詳細

一通りの流れをば。
今回は GitHub(GHE)上にある Playbook たちを使うようにしてみます。

ディレクトリ構成
$ ls
ansible.cfg group_vars  playbooks   roles

AWX 上で定義していくので、inventory は必要ありません。あったとしても無視されます。
inventory をインポートできる機能があれば、AWX が死んだときにローカルで実行できるから良いんだけど。

AWX 上に「インベントリースクリプト」な機能があるので、Dynamic Inventory も使える。
ファイルで定義するなって話かもしれないですね :thinking_face:

GitHub の鍵登録

登録後は暗号化されて表示されなくなる

プロジェクトの追加

f:id:rarirureluis:20181128192943p:plain
ヘルプが日本語化されていて分かりやすい UI

プロジェクトを追加すると、AWX が GitHub(GHE) 上から Clone してきます。
このとき、requirements.yml を配置していても skipping されますが、実際に実行されるときはきちんと解決してくれます。

f:id:rarirureluis:20181128192953p:plain

インベントリーの作成

f:id:rarirureluis:20181128193012p:plain
グルーピングの名前とか、変数とか

f:id:rarirureluis:20181128193003p:plain
各ホストに対して変数を定義することも可能

マシンへの認証情報の登録

f:id:rarirureluis:20181128193108p:plain
鍵認証でも、パスワード認証でも可能

Slack への通知を作成

f:id:rarirureluis:20181128193118p:plain
分かりやすい

テンプレート(ジョブ)の作成

f:id:rarirureluis:20181128193059p:plain
登録した情報たちをここで設定していく

「認証情報」のところをクリックするとエラーで開けないのは日本語設定の既知バグらしいです。
未だに(2018/11/28)直っていません😆

f:id:rarirureluis:20181128193049p:plain
通知の有効化


Tips

雑に述べていく

1. requirements.yml を使うには roles/ に置く

requirements.yml はトップディレクトリではなく、roles/ に置きましょう。

2. パスワード認証も、鍵認証も可能

パスワード認証もできるとかありがてーーー!

3. テンプレート作成時、認証情報をクリックできない

tower-cli 前提なら --credential で渡せる。Web上で実行するなら「起動プロンプト」にチェック、もしくは言語を英語にする。

4. AWX が突然死した

久々に AWX を開いたら開けず、コンテナを見てみると PostgreSQL のコンテナが死んでいた。
10月25日辺りまでのコミットで、PostgreSQL の datadir が /tmp に定義されていてお掃除で死んだ説

5. ダッシュボードは便利そう

f:id:rarirureluis:20181128201307p:plain

6. バックアップとリストア

本家 Tower のはドキュメントには setup.sh によりバックアップ、リストアに関して書かれていますが AWX には setup.sh は存在しない。

バックアップに関しては、Docker 上に展開して Convoy を使って PostgreSQL コンテナのバックアップをする。
このとき、リストアする AWX はバックアップと同じバージョンでないといけない。

他には、tower-cli のドキュメントには書かれていないがコマンドのヘルプにはある、エクスポートする機能がある。
github.com

これの使い方は AWX のアップグレードするために使うために用意されてるけど、バックアップ用途でも使えると思う。

6. クラスタリング

AWX のインストールは、直接インストール、Docker、Kubernetes、OpenShift と使えるわけですが、Kubernetes or OpenShift を使うのが良いと思ふ。

6. はてなブログの画像投稿周りはまじで糞
  • 1枚ずつしかアップロードできない
  • 記事投稿画面で表示される画像選択画面時の画像サイズが小さくて無理
  • 画像をクリックしても拡大表示はできない
  • こういうパット見同じ画像ばっかの記事を書くのは最高に苦痛
  • でも、Mackerel 便利