【Ansible】AnsibleTowerしか使えない開発環境でサンプルソースを効率よく試す方法

f:id:hira98:20190915191410p:plain

【結論】

  • AnsibleTowerにはSurvery機能がある。

  • この機能を使うことで、ジョブテンプレート実行時に任意の値を渡すことができる。

  • 渡された値によって、読み込む.ymlファイルを可変にすることで効率よくサンプルソースを試せる。

  • Ansibleではfomart()を使うことで、C言語sprintf()と同じ文字列置換を行える。

【目次】

はじめに

CLIで操作可能なAnsibleではなく、GitLabにソース投入してAnsibleTowerで実行する方法しかない開発環境に身を置いている私が、効率よくサンプルソースを試すために考えた手順を紹介します。

Ansibleでサンプルソースを試す場合

CLI環境のAnsibleでサンプルソースを試す手順は以下になります。

【手順】

  1. サンプルソースを作成する。
  2. コマンドを叩いてサンプルソースを実行する。

以上です。これ以上でも以下でもありません。

AnsibleTowerでサンプルソースを試す場合

AnsibleTowerはAnsibleのソースをGUIで実行するためのインタフェースでしかなく、ソースはGitLab等のソース管理ツールで管理する必要があります。

よって、AnsibleTowerでサンプルソースを動かすには、GitLabにソースを投入し、AnsibleToweで実行した時にGitLab上のどのソースを実行するかを設定してあげる必要があります。

事前準備

  1. GitLabにサンプルソースを格納するための任意のプロジェクトを作成する。

  2. AnsibleTowerでプロジェクト作成して、GitLabに作成したプロジェクトを紐づける。

    詳細な手順は以下参照

  https://docs.ansible.com/ansible-tower/3.2.4/html_ja/userguide/projects.html

サンプルソース作成手順

  1. GitLabに作成した任意のプロジェクトにサンプルソースをcommitする。

  2. AnsibleTowerを操作して、サンプルソースを動かすためのジョブテンプレートを作成する。

    下図はジョブテンプレート作成するための設定画面です。

    [1]は事前準備2で作成したプロジェクトをリストから選択します。

    [2]ではプロジェクト(GitLabと連携)に紐づいたソース一覧(※1)から、このジョブテンプレートを実行した時に実行したいソースを選択します。

    ※ Ansibleのコーディング規約に違反している(拡張子が.ymlでない、先頭行が---でないetc...)ファイルはGitLabに登録されていたとしても、一覧に表示されません。

    f:id:hira98:20190915191704p:plain 引用:https://docs.ansible.com/ansible-tower/3.2.4/html_ja/userguide/job_templates.html

  3. 作成したジョブテンプレートを実行する。

AnsibleTowerしか動かせない環境で効率よくサンプルソースを試す方法

Before_1

真っ先に思いついた方法ですが、チームみんなで共有しているAnsibleTowerのジョブテンプレートが増えまくるので却下しました。

f:id:hira98:20190915191438p:plain

Before_2

AnsibleTowerについて無知だった私は、以下の方法でサンプルソースを試していました。

サンプルソースを作成するたびに、ジョブテンプレートを設定し直す必要があり手間です。。

f:id:hira98:20190915191451p:plain

After

AnsibleTowerのジョブテンプレートにはSurvery機能があります。この機能を使うことで、ジョブテンプレート実行時に任意の値を渡すことができます。

Survery機能でワイが入力したidによって、どのサンプルソースを実行するかを判断する「サンプルソースxx」という仲介役をかましてあげることで、ファイルを追加するだけでサンプルソースを動かすことができるようになります。

f:id:hira98:20190915191507p:plain

効率よくサンプルソースを動かすためのyml

以下になります。

---
- hosts: localhost  # 自分自身に接続する
  tasks:

  # 実際はAnsibleTowerのSurvery機能で宣言される変数
  - name: Survery入力で定義された変数
    set_fact:
      task_id: 01

  - name: タスク名のフォーマット指定
    set_fact:
      task_name_format: "sample_%02d.yml"

  - name: 実行するタスク名確定    
    set_fact: 
      task_name: "{{ task_name_format | format(task_id) }}"

  - debug: msg="{{task_name}}"

  - name: "{{task_name}}を実行する"
    include_tasks: "{{ task_name }}"

[task_name_formatで指定したサンプルソース命名規則] + [surveryで入力したtask_id]から、include_tasksで実行する.ymlを決めるようにすることで実現しています。

ジョブテンプレートでSurveryを設定する方法は以下を参照ください。

https://docs.ansible.com/ansible-tower/3.2.4/html_ja/userguide/job_templates.html#surveys

参考

https://docs.ansible.com/ansible-tower/3.2.4/html_ja/userguide/index.html#ansible-tower-user-guide-versionshortest

さいごに

なぜ私はこのようなブログを書いているのだろう??

DockerかVagrantをローカルPCにインストールできる環境であれば、やる必要もない効率化の方法について考えているのだろう??

と自問自答してて、改めて気づかされる。。

現在の自分は、開発環境が優遇されたモダンなIT企業ではなく、好きなツールをインストールできなシンクラ端末という無人島みたいな開発環境でサバイバル生活をしているのだと。。