AnsibleでCSVファイルから参照したパスワードでプロビジョニングする

2016.10.31

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

本日、2本目のエントリーとなる渡辺です。

先ほどのエントリー(AnsibleによるIAMユーザの管理)では、IAM User/Groupを管理するiamモジュールを紹介しました。 その中でパスワードを扱う場合、valutを利用すると、サラりと紹介しました。 ところが、正直なところあまりvalutを使いたくありません。 編集する時もansibleを流す時にも、valutパスワードを入力するのが億劫なのです。

というわけで、lookupのcsvfileを使用し、パスワードを外部CSVファイルで管理する方法を紹介します。

外部ファイルを参照するlookup

Ansibleのlookupは、Ansibleから外部リソースを参照するための機能です。 テキストファイルやテンプレートを参照し、Ansibleのタスクに変数のように埋め込むことができます。

  tasks:
    - debug: msg="{{ lookup('file', '/etc/foo.txt') }}"

参照するファイルはリモートマシンではなく、ローカルマシンであることがポイントです。 Ansibleのプロジェクト配下以外からでもファイルを参照できるため、ローカルマシンにある秘密鍵などにアクセスすることも可能です。

CSVファイルのlookup

lookupの1つ目の引数にcsvfileを指定することで、CSVファイルを参照し、任意の行の任意のカラムの値を参照することができます。

  tasks:
    - debug: msg="{{ lookup('csvfile', 'KEY file=password.csv delimiter=,') }}"

第2引数はスペース区切りでパラメータを指定します。 はじめのパラメータは、CSVファイルの何行目から値を取得するかを特定するためのキーです。

CSVファイルでは1つ目のカラムがキーとなっている必要があります。 例えば、次のCSVファイルでは1つ目のカラムがユーザ名です。

NAME,PASSWORD
watanabe,pass1234
tanaka,pass5678

したがって、ユーザ名「watanabe」のパスワードを参照するには次のように指定します。

  tasks:
    - debug: msg="{{ lookup('csvfile', 'watanabe file=password.csv delimiter=,') }}"

KEYの後ろにはスペース区切りで、オプション=値を指定します。 必須となるオプションはファイル名(file)です。 CSVのデリミタのデフォルトはタブなので、カンマ区切りの場合はdelimiterを指定してください。

また、デフォルトで参照する値は2つ目のカラムです。 参照するカラムを変更する場合は、colオプションを指定してください。 colは0開始のインデックスなので、3つ目のカラムを指定する場合は、col=2となるので注意しましょう(デフォルトは1)。 その他のオプションはドキュメントを参照してください。

パスワードをCSVから参照して設定する

というわけで、iamモジュールを利用してパスワードを設定するPlaybookです。 グループ変数ではパスワードを管理せず、パスワードを外部CSVファイルから参照しています。

- hosts: localhost
  connection: local
  gather_facts: False
  vars:
    profile: default
    iam_users:
      - name: user1
      - name: user2
  tasks:
    - iam:
        iam_type: user
        name: "{{ item.name }}"
        state: present
        password: "{{ lookup('csvfile', item.name + ' file=password.csv delimiter=,') }}"
        profile: "{{ profile }}"
      with_items: "{{ iam_users }}"
NAME,PASSWORD
user1,pass1234
user2,pass5678

まとめ

Ansibleの定義ファイルにパスワードなどは含めたくありません。 しかし、valutを使うのは敷居が高いかと思います。

このような場合、lookupを利用し、外部定義ファイルから値を参照すると便利です。 外部定義ファイルはそのままパスワード一覧として利用できるでしょう。