概要
Docker版AWXの構築方法と簡単な使い方について残したいと思います
AWXを使うことで、Ansibleで課題だったセキュリティの問題(権限に合わせたPlaybookの実行、秘密鍵の保管、実行記録)を多く解決してくれます。また、REST API経由でシステム連携も容易になることから幅広くAnsibleを活用できます
やること
- Docker版のAWXのインストール
- githubにあるPlaybookをAWXで実行
(リモートサーバにAWXをインストールするPlaybook) - Playbookの実行後にSlackへ通知
- REST API経由でPlaybookの実行
大事なポイントは★ポイント:
に箇条書きしています
事前準備
- AWX Docker版のため、事前にDockerを導入していること
- AWXのデプロイ先環境(メモリ4GB以上割り当てられる環境)
EC2の場合はt2.medium以上が望ましい - サンプルPlaybookがデプロイする環境(EC2)
インストール
ローカルにAnsibleを実行できる環境があれば、こちらのリポジトリでAWXを簡単にデプロイできます
インストール方法は公式の手順通りに進めて行きます(README.md参照)
github/awxリポジトリをローカルにクローンし、installerディレクトリ配下で以下のコマンドで簡単にインストールできます
※inventoryファイルに各種設定パラメータ(adminパスワード、インストール先)がありますので、必要に応じて編集してください
> ansible-playbook -i inventory install.yml
Web管理画面
1. 管理画面にログイン
ユーザ名:admin、パスワード:passwordでログイン
※初期値はインベントリ変数で上書きできます
2. プロジェクトの作成
組織やユーザなどの作成は置いといて、まずはPlaybookを実行するためのプロジェクトを作成します
SCMタイプでバージョン管理システムや手動(ファイル)が選べます
今回はSCMタイプでhttps://github.com/comefigo/deploy-awx.git
を登録します
3. Gitリポジトリをクローンします
awx_taskコンテナの/var/lib/awx/projects
配下にクローンされます
**★ポイント:**インストール時にインベントリ変数project_data_dir
で上書きしていれば、ホストのディレクトリにAWXプロジェクトフォルダがマウントされます
4. インベントリの登録
Playbookでデプロイ対象となるホストをインベントリに登録します
AWXではインベントリファイルを参照するのではなく、ここに登録されたインベントリを対象にPlaybookを実行します
※インベントリ名=ホストグループ名ではありませんのでご注意ください
4.1. インベントリに関連するホストグループを登録
4.2. ホストを登録
5. ホストのSSH鍵を登録
SSH鍵を登録することで、AWXがインベントリ変数のsecret_keyでSSH鍵を暗号化してDBに保存してくれるのでセキュアに鍵管理ができます。もちろん従来通りに.ssh/で保管された鍵ファイルを直に参照することも可能です
SSH鍵はMachineタイプの認証ファイルになり、登録した認証鍵は暗号化という風に表示されるようになる
ユーザ名にはログインユーザ名を入力
6. 通知の登録
Slackタイプの通知を作成します
トークンはBotトークンもしくはslack legacy apiが登録できます
**★ポイント:**バグと思われるが、初回登録後にトークンが正しく保存されないようなので、登録後に編集でトークンを再度入力してください!
6.1. 通知の確認
**★ポイント:**Botトークンで送信する場合は、通知対象のチャネルにあらかじめBotを招待してください
7. テンプレートの作成
いよいよPlaybookの実行になります
Playbookの実行単位はテンプレートになります
テンプレートではPlaybook、対象のインベントリ、認証キーなどを1つにまとめたものになります
デプロイ対象はインベントリ、Playbookはプロジェクトに含まれているPlaybookファイルを選択、実行時の変数(グループ変数、ホスト変数など)を上書きしたい場合は、追加変数に定義します
**★ポイント:**Playbookと同階層のグループ変数(group_vars)が読み込まれます。なので、inventoryファイルのgroup_varsは読み込まれないのでご注意!(インベントリの外部変数で登録)
**★ポイント:**プロジェクト単位のansible.cfgを適用させたい場合は、プロジェクトのルートに配置してください
**★ポイント:**変数のマージ設定(hash_behaviour=merge)をしておくと、追加変数の設定で部分的に上書きが可能になるので使い勝手がよくなります
7.1. テンプレートの実行
7.2. 実行結果の確認
対象のAWX環境にアクセスし、ログインパスワードが追加変数で定義したtest
になっていることを確認してください
Rest APIでジョブ実行
APIブラウズ(AWXの設定で機能OFFにすることもできます)
http://xxx.xxx.xxx.xxx/api/v2/にアクセスすると以下のようにAPIのパラメータなどを確認することができます
ジョブ実行
HTTPのPOSTで以下のようにデータを送信してあげます
POST /api/v2/job_templates/7/launch/ HTTP/1.1
Host: xxx.xxx.xxx.xxx
Content-Type: application/json
Authorization: Basic YWRtaW46aXJ5S2RGVnFXdE5aWFROSw==
Cache-Control: no-cache
Postman-Token: 67231077-4379-41c7-a0a0-1bfde96b97f0
{
"extra_vars": {
"awx": {
"web": {
"password": "test"
}
}
}
}
URL
エンドポイントはhttp(s)://xxx.xxx.xxx.xxx/api/v2/job_templates/7/launch/
になります
job_templates番号7は実行したいjobテンプレートの番号になります(テンプレートの設定画面のURLで確認してください)
認証
認証方式はいくつかありますが、上記サンプルでは簡単なBasic認証を用いています
接続ユーザ名:パスワード
(admin:test)をbase64でエンコードしてヘッダーのAuthorizationにセットしています
外部変数
API経由で変数を渡したい場合は、
必ずextra_vars配下に渡したい変数をセットし、全体をjsonで送信
**★ポイント:**テンプレートの起動プロンプトを有効にしてください!
ただし、API経由で渡される変数はextra vars扱い(最優先の変数)で処理中にその変数を上書きすることができない
なお、存在しないキーの値を追加したり、変更することはできる
ローカルで動いたが、AWXやTower上で動かないことがあるので要注意!
ジョブの再実行
ジョブの実行結果でジョブの再実行できますが、その時点のパラメータで実行するので、場合によっては思わぬ結果になることもありますので、ご注意を!