インフラ作業をユーザにやってもらう為にAnsible Tower でやったこと


はじめに

度々行っている作業を、依頼元に直接やってもらってハッピーになれないか
AWX(AnsibleTower)ならGUIもあるし良いかも
そう思って取り組んだときのメモから引用しました

課題

  1. ユーザに必要なデータを入力してもらう必要がある(インベントリの編集は不可)
  2. とにかく簡単な手順にする

対応策

  1. AWXのSURVEY機能に頼りました
  2. Ansibleのdelegate_toを利用しました

1. AWXのSURVEY機能について

AWXではジョブテンプレートに対して、SURVEYという機能が利用できます。
SURVEYを使うと、ジョブ実行時にプロンプトを表示してextra_varsの値の入力を求めることができます。
入力値は選択形式にしたり、デフォルト値を決めたり、コメントを付けたりできて、利用者のフォローをすることができます。

例えば、作業対象のサーバを選択させるために以下のようなSURVEYを設定します。

そうすると、ジョブの実行時に以下のようにプロンプトが表示され、入力値の選択が求められます。

なお'選択肢'の形式以外にも、テキストであったりチェックボックスだったりも利用できます。
詳しくは以下の公式ドキュメントがわかりやすいです。
https://docs.ansible.com/ansible-tower/3.4.3/html_ja/userguide/job_templates.html#surveys

2. delegate_toと組み合わせる

作業に利用するパラメータはSURVEYで集めることに成功したけれども、作業対象のサーバを柔軟に変更することが難しい。
実行時にインベントリを選択してもらえれば良いんだけどもインベントリの整備や権限管理が大変。
そんなわけで、SURVEYとAnsibleのdelegate_toと組み合わせて利用しました。

先程の例からだと、SURVEYで取得した作業対象サーバの値(target_server)を、以下のようにAnsible playbook側でdelegate_toとして指定するだけです。

---
- name: Demo
  hosts: localhost
  tasks:
  - name: Create config file to work directory
    template:
      src: ./templates/ifcfg-eth0.jinja2
      dest: /tmp
      owner: root
      group: root
      mode: 0644
    delegate_to: "{{ target_server }}"

こうすることでお手軽に、ユーザ側で作業対象サーバを切り替えることができます。
SURVEYの機能で選択肢を限定することができるので、作業対象外のサーバにアクセスされることを防ぐこともできます。

おわりに

短いですが以上です。
アドベントカレンダー参加登録したものの、書こうと思っていたネタはすでに記事があったので慌てて別のネタを書きました