aglitke.prism
プリズム
プリズムの役割は、均一なプレイブックインターフェースを持つ多様なターゲットを制御するためのフレームワークを作成します。例えば、異なる種類のストレージアレイにボリュームをプロビジョニングしたり、異なるベンダーのスイッチでVLANを管理したりすることができます。プリズムでは、操作のスイートをサポートするバックエンドを定義し、そのバックエンドを使用する特定のターゲットを構成できます。一度構成されると、プレイブックが特定のターゲットに対して、基盤となる実装を気にせずに特定の操作を行うために生成されます。
この役割は、独自のバックエンドや操作を提供する他の役割のベースとして機能することを意図しています。
要件
Ansible >= 2.3.0 でテストされていますが、古いバージョンでも動作する可能性があります。
構成
この役割を効果的に使用するには、まず操作、バックエンド、およびターゲットの概念を理解する必要があります。操作は遂行したい作業を表します。バックエンドは制御可能なシステムの種類を説明します。最後に、ターゲットは特定のシステムのインスタンスを表します。シンプルな例のために、リモートオブジェクトストレージを抽象化したいと仮定しましょう。必要な操作は「作成」「取得」「更新」「削除」です。多くのバックエンドが考えられますが、明らかな例としては「HTTP/REST」と「FTP」があります。ここで、http://api.example.com/v2 でアクセス可能なREST APIがあり、ユーザー名が「foo」、パスワードが「pass」で、192.168.2.47 に FTP サーバーがあって、ディレクトリ「/pub/api」、ユーザー名が「ftp」、パスワードが「secret」であると仮定します。これらはそれぞれターゲットを表します。
バックエンドを構成するには、まずプレイブックテンプレートを保存するためのディレクトリを作成します。この役割では、デフォルトの場所は templates/
です。次に、サポートしたいバックエンドごとにサブディレクトリを作成します(例:ftp と http)。次に、各バックエンドディレクトリにサポートしたい操作ごとのプレイブックテンプレートを作成します(以下の例を参照)。ファイル名は <operation>.yml.j2
とする必要があります。
ターゲットを構成するには、ターゲット定義ファイルを保存するためのディレクトリを作成します。デフォルトの場所は /etc/prism/targets
です。各ターゲットについて、構成ファイル <target>.yml
を作成します(以下の例を参照)。
操作の例
以下のファイル(templates
ディレクトリの rest/
サブディレクトリに create.yml.j2
として保存)が、'rest' バックエンドの作成操作を定義します。
- hosts: "{{ target_host }}"
remote_user: "{{ target_user }}"
tasks:
- name: REST: Create operation
uri:
url: "{{ backend_config.base_url }}/{{ params.path }}"
method: POST
user: "{{ backend_config.auth.username }}"
password: "{{ backend_config.auth.password }}"
body: "{{ params.object.data }}"
ターゲット定義の例
以下のファイル(web.yml
として保存)が、'web' という名前のターゲットを定義します。
# 生成されたプレイブックを実行する際に使用するホストとユーザー
target_host: host.example.com
target_user: admin
# このターゲットが使用するバックエンド
backend: rest
# ターゲット固有の構成パラメータ
backend_config:
base_url: http://api.example.com/v2
auth:
username: foo
password: pass
プレイブックの生成
以下のプレイブックは、'web' ターゲットを使用してオブジェクトを保存するためのプレイブックを生成するために使えます。
# ローカルマシンを使ってプレイブックを生成
- hosts: localhost
roles:
- prism
vars:
# オプション: デフォルトを使用しない場合は上書き
target_definitions_dir: /etc/prism/targets
# オプション: デフォルトを使用しない場合は上書き
playbook_templates_dir: /etc/prism/templates
# 出力プレイブックの名前を設定します。この変数が省略されると、プレイブックは生成されません。
generated_playbook: /tmp/prism-playbook.yml
# この操作のターゲットを選択
target: web
# 操作を選択
operation: create
params:
path: messages
object:
id: 1
data: TG9yZW0gSXBzdW0gaXMgc2ltcGx5IGR1bW15IHRleHQu=
# プレイブック生成タスクはロール内で定義されているため、タスクは不要です。
これにより、/tmp/prism-playbook.yml
にプレイブックが生成され、ansible-playbook
で実行することでアクションを実行できます。
- hosts: host.example.com
remote_user: admin
tasks:
- name: REST: Create operation
uri:
url: "http://api.example.com/v2/messages"
method: POST
user: foo
password: pass
body: TG9yZW0gSXBzdW0gaXMgc2ltcGx5IGR1bW15IHRleHQu=
'ftp' ターゲットに切り替えるには、1行を変更するだけで、生成されたプレイブックはFTPサーバーと通信するように構成され、FTP操作テンプレートとターゲット構成に基づきます。
target: ftp
ライセンス
GPLv3
作者情報
アダム・リトケ (Adam Litke) によって書かれました - alitke@redhat.com
Control a heterogeneous set of targets from a uniform playbook interface
ansible-galaxy install aglitke.prism