Kompira Enterprise から Ansible の Playbook を実行する

システム運用の現場では構成管理も重要な作業の一つですが、構成情報の記述から機器へ反映させるための手順書の作成など、比較的、面倒な作業と思います。
このため構成管理ツールなどを使って省力化することが推奨されるわけですが、本稿では、構成管理ツール「Ansible」において構成内容を記述したファイルである Playbook を、Kompira Enterprise から実行する方法を紹介します。

Ansibleを単独で用いるだけではなく、申請に対応したサーバーの払い出しや作業完了後の通知処理などへの連携といった応用が可能となります。

※ 本稿では既に Kompira Enterprise サーバーに Ansible がインストールしてある状態を想定しています。インストール方法に関しては「[インストールガイド](https://docs.ansible.com/ansible/2.9_ja/installation_guide/index.html)」を参照してください。

# 全体構成図

本稿で扱う構成を以下に示します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/94326/923379b8-2386-ff15-cc02-69eb92938d02.png)

# inventory の設定

始めに、Ansible の inventory の設定を行います。

Kompira Enterprise サーバーのコンソール上で inventory ファイルを開いて以下のようにグループ名を [kompira] として、今回 Ansible を実行する接続先の情報を追加してください。
```
[kompira]
<ユーザー名>@<接続先ホスト名 or IP アドレス>
```
inventory ファイルのデフォルトのパスは /etc/ansible/hosts になります。
<ユーザー名> 、<接続先ホスト名 or IP アドレス> は、ご自身の環境の接続先情報に置き換えて入力してください。
<ユーザー名> は root 権限を持っているものにしてください。

# Playbook の作成

次に、今回 Ansible で実行する内容を記述した Playbook を作成します。
Playbookの記述についての詳細は「[Playbook の概要](https://docs.ansible.com/ansible/2.9_ja/user_guide/playbooks_intro.html)」を参照してください。

今回は、
1. Apache httpdをインストール
2. 引数で指定したユーザーID & パスワードをもつユーザーを追加

を行います。

これらを記述した Ansible Playbook「kompira_test.yml」を以下のような YAML 形式で作成します。
これを /tmp ディレクトリに配置します。

kompira_test.yml
```
- hosts: kompira
  become: yes
  tasks:
    - name: install Apache
      yum: 
        name: httpd
    - name: start httpd
      service: 
        name: httpd
        state: started
    - name: add user
      user:
        name: "{{ user_name }}"
        password: "{{ password | password_hash('sha512') }}"
```
# ssh 公開鍵登録

接続先サーバーにて Ansible Playbook を実行するため、公開鍵による ssh 接続を行えるように設定します。

「[公開鍵認証を使ってssh接続をする](https://support.kompira.jp/column/ssh_with_key/)」の「証明書の作成」「リモートサーバーでの証明書の登録」を参考に、鍵ファイル「kompira.key」 を作成し、「kompira」 ユーザーが接続先に対して公開鍵による ssh 接続が行えるように設定してください。

完了したら Kompira Enterprise サーバーのコンソール上で以下のように入力して、パスワード入力無しで ssh 接続ができることを確認してください。

```
$ su kompira -c "ssh -i ~/.ssh/kompira.key <ユーザー名>@<接続先ホスト名 or IP アドレス>"
```

# ジョブフローの作成・実行

以下のようなジョブフロー「Playbook実行」を作成してください。

Playbook実行
```
| user_name |
| password |
 
["ansible-playbook /test/kompira_test.yml --extra-vars 'user_name=${user_name} password=${password}' -i /etc/ansible/hosts"
] =>
{ if $STATUS != 0 |
  then:
    print("エラーが発生しました")
  else:
    [
        __host__ = "<接続先ホスト名 or IP アドレス>",
        __user__ = user_name,
        __password__ = password
    ] ->
    print("ユーザー名")-> ["whoami"] ->
    print("httpd の状態")-> ["systemctl status httpd"]
}
```

* inventory ファイルのパスがデフォルトと異なる場合、「 /etc/ansible/hosts」の部分を正しいパスに書き換えてください。
*  <接続先ホスト名 or IP アドレス> は、inventory で設定したものと同じ値を入力してください
*   Kompira Enterprise 1.5 系の場合は print($RESULT) で結果を出力してください。

このジョブフローでは Playbook の内容を実行した後、作成したユーザーとパスワードで接続先にログインして、ログインユーザー名と httpd の稼働状況を確認します。

作成したらジョブフローのパラメータ「user_name」「password」に、新規登録するユーザー名、パスワードを入力して実行してください。今回はそれぞれ「test」「kompira」とします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/94326/9bd59d40-e1ee-70a1-dec3-7a5b3a1ca2d9.png)

実行結果は以下のようになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/94326/fc56ca57-3819-9bc6-0279-9fd13041ae1e.png)

実行結果をさらに下に進めると、ログインユーザー名が test になっていて、httpd の Active が active (runnning) になっていることから、Playbook の内容が正しく反映されていることがわかります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/94326/5820243c-0007-6706-4b62-db8d05a555e6.png)

以上のようにして、Kompira Enterprise から Ansible Playbook を実行することができました。

これを利用することで既存の Ansible PlaybookをKompira Enterprise に流用できるのはもちろんのこと、定期的にPlaybookを実行したり、構成管理部分を Ansible に任せて、そのほかの処理は Kompira Enterprise が行うといったような作業分担も可能になります。

また応用としては、登録作業の連続処理、Ansible Playbook実行後の結果の通知、外部からのトリガーイベントを受信してからのPlaybookの実行、inventryファイルそのものの管理や、登録されているノードをプルダウンメニューで選択させるようなUIを作ることも可能でしょう。


# Kompira Enterpriseの製品情報
https://www.kompira.jp/
サーバーやネットワーク機器などの運用を自動化するための連携処理基盤ソフトウェアです。
運用手順書の操作作業の自動化、監視ツールやメールなどをトリガーにした保守作業の自動実行など、独自のKompiraジョブフロー言語を用いたスクリプトを用意する事で、個々の機器やワークフローにきめ細かく対応する事が可能です。