search
LoginSignup
68

More than 3 years have passed since last update.

posted at

updated at

Ansible AWX(Docker版)の構築と使い方

概要

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でログイン
 ※初期値はインベントリ変数で上書きできます

awx-dashboard.png

2. プロジェクトの作成

組織やユーザなどの作成は置いといて、まずはPlaybookを実行するためのプロジェクトを作成します
SCMタイプでバージョン管理システムや手動(ファイル)が選べます
今回はSCMタイプでhttps://github.com/comefigo/deploy-awx.gitを登録します

awx-new-project.png

3. Gitリポジトリをクローンします

awx_taskコンテナの/var/lib/awx/projects配下にクローンされます
★ポイント:インストール時にインベントリ変数project_data_dirで上書きしていれば、ホストのディレクトリにAWXプロジェクトフォルダがマウントされます
awx-clone-scm.png

4. インベントリの登録

Playbookでデプロイ対象となるホストをインベントリに登録します
AWXではインベントリファイルを参照するのではなく、ここに登録されたインベントリを対象にPlaybookを実行します

※インベントリ名=ホストグループ名ではありませんのでご注意ください

add-new-inventory.png

4.1. インベントリに関連するホストグループを登録

Playbookのホストグループ名であるawxを登録します
inventory-add-group.png
add-group.png

4.2. ホストを登録

ホストグループに属するホストを登録します
add-group-host.png
add-host-name.png

5. ホストのSSH鍵を登録

SSH鍵を登録することで、AWXがインベントリ変数のsecret_keyでSSH鍵を暗号化してDBに保存してくれるのでセキュアに鍵管理ができます。もちろん従来通りに.ssh/で保管された鍵ファイルを直に参照することも可能です
SSH鍵はMachineタイプの認証ファイルになり、登録した認証鍵は暗号化という風に表示されるようになる
ユーザ名にはログインユーザ名を入力

add-credential.png
add-machine-credential.png

6. 通知の登録

Slackタイプの通知を作成します
トークンはBotトークンもしくはslack legacy apiが登録できます

add-notification.png

★ポイント:バグと思われるが、初回登録後にトークンが正しく保存されないようなので、登録後に編集でトークンを再度入力してください!
add-slack-notification.png

6.1. 通知の確認

★ポイント:Botトークンで送信する場合は、通知対象のチャネルにあらかじめBotを招待してください

testing-notification.png

テスト結果
testing-notification-result.png

7. テンプレートの作成

いよいよPlaybookの実行になります
Playbookの実行単位はテンプレートになります
テンプレートではPlaybook、対象のインベントリ、認証キーなどを1つにまとめたものになります

add-job-template.png

デプロイ対象はインベントリ、Playbookはプロジェクトに含まれているPlaybookファイルを選択、実行時の変数(グループ変数、ホスト変数など)を上書きしたい場合は、追加変数に定義します

★ポイント:Playbookと同階層のグループ変数(group_vars)が読み込まれます。なので、inventoryファイルのgroup_varsは読み込まれないのでご注意!(インベントリの外部変数で登録)
★ポイント:プロジェクト単位のansible.cfgを適用させたい場合は、プロジェクトのルートに配置してください
★ポイント:変数のマージ設定(hash_behaviour=merge)をしておくと、追加変数の設定で部分的に上書きが可能になるので使い勝手がよくなります
add-deploy-awx-template.png

通知にSlack通知を登録
template-notification.png

7.1. テンプレートの実行

execute-template.png

実行ログ
executing-job.png

Slack通知
job-result-notification.png

7.2. 実行結果の確認

対象のAWX環境にアクセスし、ログインパスワードが追加変数で定義したtestになっていることを確認してください

Rest APIでジョブ実行

APIブラウズ(AWXの設定で機能OFFにすることもできます)

http://xxx.xxx.xxx.xxx/api/v2/にアクセスすると以下のようにAPIのパラメータなどを確認することができます
awx-api-browser.png

ジョブ実行

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で送信

★ポイント:テンプレートの起動プロンプトを有効にしてください!
prompt.png

ただし、API経由で渡される変数はextra vars扱い(最優先の変数)で処理中にその変数を上書きすることができない
なお、存在しないキーの値を追加したり、変更することはできる
ローカルで動いたが、AWXやTower上で動かないことがあるので要注意!

変数の優先順位

ジョブの再実行

ジョブの実行結果でジョブの再実行できますが、その時点のパラメータで実行するので、場合によっては思わぬ結果になることもありますので、ご注意を!

job_history.png

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
What you can do with signing up
68