AnsibleでParameterStoreから値を取得した後に環境変数として使用する

2018.07.12

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

こんにちわ、クラスメソッドの吉江です。

Ansibleを使うにあたって、APIキーなどの情報をハードコーディングはセキュリティ面で不安が残ります。
AWSではこのようなパラメーター情報をParameterStoreに預けることが可能です。
今回はParameterStoreにAPIキーを保管し、プレイブックへのハードコーディングすることなくmackerel-agentをインストールしてみます。

プレイブック

---
- hosts: all
  become: yes
  environment:
       MACKEREL_APIKEY: "{{ lookup('aws_ssm', 'MACKEREL_APIKEY')}}"

  tasks:
      # Mackerel-Agentインストーラーダウンロード
      - name: "Get Mackerel-Agent"
        get_url:
            url: "https://mackerel.io/file/script/amznlinux/setup-all-yum.sh"
            dest: "/tmp/setup-all-yum.sh"

      # Mackerel-Agentインストーラー権限変更
      - name: "Permission Mackerel-Agent"
        file:
            state: file
            path: /tmp/setup-all-yum.sh
            group: root
            owner: root
            mode: 0755

      # Mackerel-Agentインストーラー実行
      - name: "Install Mackerel-Agent"
        command: "/tmp/setup-all-yum.sh"

      # Mackerel-Agentサービス停止
      - name: "Stopped Mackerel-Agent"
        service:
            name: mackerel-agent
            state: stopped

      # Mackerel-AgentホストID削除
      - name: "HostID Delete"
        file:
            path: "/var/lib/mackerel-agent/id"
            state: absent

修正箇所

こちらの記載内容を修正しました。

  environment:
       MACKEREL_APIKEY: "{{ lookup('aws_ssm', 'MACKEREL_APIKEY')}}"

lookupをParameterStoreに対して実行し、APIキーを取得してます。
このAPIキーを環境変数に代入するためにenvironmentで指定してます。

躓いたところ

私がansibleの仕様を把握出来なかったことでモヤモヤしてました。

私はpackerでAMIを作成する際にansibleを使ってプロビジョニングを行ってますが、
AMI作成中のインスタンスに対してIAMロールを設定していないにも関わらずParameterStoreが参照できてました。
(当時の予想では権限が足りない旨のエラーを吐く想定でした)

確認した結果、ansibleを実行するクライアントPCで指定されているIAMユーザーでParameterStoreへ値を
参照、その値をansibleが実行時にクライアントからansible実行対象インスタンスに渡されて実行されている模様です。

そのため、今回のlookupを用いたプレイブックをEC2インスタンス上(プロビジョニングサーバー)で実行する際はParameterStoreに 問い合わせが実行出来ることを確認してから実行することで無用なトラブルは避けられるかと思います。

最後に

少しずつ一つのプレイブックを育ててます、楽しいです。