8
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

エーピーコミュニケーションズAdvent Calendar 2019

Day 24

[Ansible] AnsibleでAnsible Towerの設定情報をエクスポートする (tower_receiveモジュール編)

Last updated at Posted at 2019-12-23

初めまして。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

8
4
0

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
  3. You can use dark theme
What you can do with signing up
8
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?