初めまして。Ze0と申します。
エンジニア歴およそ半年、ブログ初投稿です。
Ansibleを利用した自動化ソリューションにゼロから携わっています。
お手柔らかに、よろしくお願いいたします。
■ はじめに
さて現在、私が取り組んでいる業務の中で
顧客の疲弊する作業(GUIをひたすらポチポチなど)をAnsibleTowerを使ってワークフローを作成して自動化することがあるのですが、
AnsibleTowerのGUIポチポチって意外と疲れるなと感じています。数が多いと、特に。
つまり、顧客のGUIポチポチ作業の疲弊を無くすために、我々がAnsibleTowerのGUIポチポチで疲弊してしまう構図が生まれるわけで、**IT業界全体を俯瞰で見たときに疲弊総量は結局、一定に保たれてて、変わっていないのでは?**などと
と思うことがあります。
もちろん、一度作ったワークフローなどは使いまわしが効き、その都度作るわけではないので、一概にそうは言えないかもしれませんが、自動化サービス提供側の私たちも効率化し属人化をできるだけ無くしたほうが提供スピードもクオリティも上がり、顧客満足度がさらに向上するのではないかなと思っています。
という理由で、我々、自動化サービスを提供する側の提供手法、開発手法もできるだけ自動化していくべきだと考えています。
今回はその一つとして、
AnsibleTowerの設定(プロジェクト、インベントリー、ジョブテンプレート、ワークフロージョブテンプレートなど)
をエクスポートに挑戦してみようと思います。
##■ 環境
・RHEL7
・AnsibleTower3.4.3
##■ tower_receive
モジュールの基本
今回の主役tower_receive
モジュールの主なオプションは以下のとおりです。
オプション名 | 概要 |
---|---|
all | 全ての設定をエクスポート。True/falseで指定。 |
credential | エクスポートするクレデンシャル名をリストで指定。 |
inventory | エクスポートするインベントリー名をリストで指定。 |
job_template | エクスポートするジョブテンプレート名をリストで指定。 |
project | エクスポートするプロジェクト名をリストで指定。 |
team | エクスポートするチーム名をリストで指定。 |
tower_config_file | Tower config fileへのパス。 |
tower_host | TowerのURL(必須) |
tower_password | Towerのパスワード(必須) |
tower_username | Towerのユーザー名(必須) |
user | エクスポートするユーザー名のリスト |
validate_certs | SSL証明書検証の有無。True/falseで指定。 |
workflow | エクスポートするワークフロー名をリストで指定。 |
シンプルですね。
要するに、全部取ってきたい場合はオプション「all」を使い、
個々のassets(設定)を取ってきたい場合はそれに合うオプションを選んでリストで指定するということですね。
リストでの指定の仕方はallか名前です。
その他のオプション含め、詳細は tower_receiveモジュールのドキュメントを参照してください。
注意点として、tower_host
,tower_password
,tower_username
の3つのオプションの指定は必須です。
AnsibleTowerのAPIをたたくので、その際の認証情報は必須。当然ですね。(公式ドキュメントのExampleに書かれてなかったので、筆者は書かなくてもいいと何故かずっと思い込み、ドツボにハマっていました。)
#■ Playbookの準備
ドキュメント読んでモジュールの使い方をざっと把握したので、
さっそく、AnsibleTowerの設定をエクスポートするPlaybookの準備に取り掛かります。
2つほど検証してみたいと思います。
###・Playbook例1[チームの設定をすべてエクスポート]
チームの設定をすべてエクスポートしたいと思います。
ドキュメントを見ながら・・・材料はこんな感じです。
- name: Export all team
tower_receive:
team:
- all
これをPlaybookにします。
resultに取得結果を格納してdebugモジュールで標準出力し、結果を確認します。
###example1.yml
---
- hosts: tower
gather_facts: no
connection: local
tasks:
- name: Export all team
tower_receive:
validate_certs: no
tower_host: https://XXXXXX
tower_password: XXXXXX
tower_username: XXXXXX
team:
- all
register: result
- name: debug
debug:
msg: "{{ result }}"
playbook example1.yml が完成しました。
###・Playbook例2[名前を指定したジョブテンプレートと全てのプロジェクトの設定情報をエクスポート]
「Ze0Template」という名前のジョブテンプレートの情報と全てのプロジェクトの情報をエクスポートしてみます。
やはりドキュメントを見ながら・・・材料を完成させます。
- name: Export a job template named "Ze0Template" and all projects
tower_receive:
job_template:
- "Ze0Template"
project:
- all
これをPlaybookにします。
こちらも結果をresultに格納してdebugモジュールで標準出力し、結果を確認します。
###example2.yml
---
- hosts: tower
gather_facts: no
connection: local
tasks:
- name: Export a job template named "Ze0Template" and all projects
tower_receive:
validate_certs: no
tower_host: https://XXXXXX
tower_password: XXXXXX
tower_username: XXXXXX
job_template:
- "Ze0Template"
project:
- all
register: result
- name: debug
debug:
msg: "{{ result }}"
playbook example2.ymlが完成しました。
#■ インベントリの準備
今回のインベントリはすごく簡単です。AnsibleTowerのipアドレスを書くだけです。
###hosts.ini
[tower]
XXX.XXX.XXX.XXX #ターゲットとなるAnsibleTowerのipアドレス
#■ Playbookの実行&結果
playbook、インベントリの基本の2点セットがそろったところで、いよいよplaybookを実行します。
###・例1 example1.ymlの実行&結果
$ ansible-playbook -i hosts.ini example1.yml
PLAY [tower] *******************************************************************
TASK [Export all job templates and all Credentials] ****************************
ok: [xxx.xxx.xxx.xxx]
TASK [debug] *******************************************************************
ok: [xxx.xxx.xxx.xxx] => {
"msg": {
"ansible_facts": {
"discovered_interpreter_python": "/usr/libexec/platform-python"
},
"assets": [
{
"asset_type": "team",
"name": "ZeoTeam",
"organization": "Default"
}
],
"changed": false,
"failed": false,
"message": ""
}
}
PLAY RECAP *********************************************************************
XXX.XXX.XXX.XXX : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
見事成功しました。
実行結果からは
ターゲットのAnsibleTowerには
「Ze0Teamというチームがあり、その所属する組織はdefault」であることが読み取れ、
JSON形式で取得することができました。
###・例2 example2.ymlの実行&結果
$ ansible-playbook -i hosts.ini example2.yml
PLAY [tower] *******************************************************************
TASK [Export all job templates and all Credentials] ****************************
ok: [XXX.XXX.XXX.XXX]
TASK [debug] *******************************************************************
ok: [xxx.xxx.xxx.xxx] => {
"msg": {
"ansible_facts": {
"discovered_interpreter_python": "/usr/libexec/platform-python"
},
"assets": [
{
"asset_relation": {
"notification_templates_error": [],
"notification_templates_success": [],
"roles": [
{
"name": "Admin",
"team": [],
"user": []
},
{
"name": "Use",
"team": [],
"user": []
},
{
"name": "Update",
"team": [],
"user": []
},
{
"name": "Read",
"team": [],
"user": []
}
],
"schedules": []
},
"asset_type": "project",
"name": "Demo Project",
"organization": "Default",
"scm_type": "git",
"scm_url": "https://github.com/ansible/ansible-tower-samples"
},
{
"asset_relation": {
"notification_templates_error": [],
"notification_templates_success": [],
"roles": [
{
"name": "Admin",
"team": [],
"user": []
},
{
"name": "Use",
"team": [],
"user": []
},
{
"name": "Update",
"team": [],
"user": []
},
{
"name": "Read",
"team": [],
"user": []
}
],
"schedules": []
},
"asset_type": "project",
"local_path": "training",
"name": "local project",
"organization": "Default"
},
{
"asset_relation": {
"notification_templates_error": [],
"notification_templates_success": [],
"roles": [
{
"name": "Admin",
"team": [],
"user": []
},
{
"name": "Use",
"team": [],
"user": []
},
{
"name": "Update",
"team": [],
"user": []
},
{
"name": "Read",
"team": [],
"user": []
}
],
"schedules": []
},
"asset_type": "project",
"local_path": "answer",
"name": "Ze0Project",
"organization": "Default"
},
{
"asset_relation": {
"credentials": [],
"labels": [],
"notification_templates_error": [],
"notification_templates_success": [],
"roles": [
{
"name": "Admin",
"team": [],
"user": [
"admin"
]
},
{
"name": "Execute",
"team": [],
"user": []
},
{
"name": "Read",
"team": [],
"user": []
}
],
"schedules": [],
"survey_spec": {}
},
"asset_type": "job_template",
"inventory": "Demo Inventory",
"name": "Ze0Template",
"playbook": "Zeo_play0ook.yml",
"project": "local project"
}
],
"changed": false,
"failed": false,
"message": ""
}
}
PLAY RECAP *********************************************************************
XXX.XXX.XXX.XXX : ok=2 changed=0 unreachable=0 failed=0 s kipped=0 rescued=0 ignored=0
こちらもうまくいきました。出力結果が長くなりました。
まず、名前を指定したZe0Templateについての情報ですが、私が事前にGUIで設定した通りのものがまんべんなくとれていました。
次にプロジェクトについても、所属するplaybookの名前は「Ze0_playbook.yml」であるなど、過不足なく情報がしっかりとれていることが確認できました。いい感じです。
#■ まとめ
tower_receive
モジュールを利用して、
AnsibleTowerのGUI画面を見ることなく、設定を取得する方法をご紹介しました。
今回は取得結果の標準出力を行うことにとどめておきましたので、これだけだとあまり役に立たないとは思いますが、
ここから工夫を凝らせば出力結果を整形してパラメーターシートに自動で記録したりできるなど、様々な効率化が見えてきます。
これをきっかけにして、またブログに書いてご紹介できればと思っています。
最後まで読んで頂き、ありがとうございました。
#■ 参考
てくなべ (tekunabe) https://tekunabe.hatenablog.jp/entry/2019/11/124/ansible_towerk_workflow_schema