Ansible Lookupプラグインの極意:静的な設定から「生きている」インフラ構成へ
こんにちは。インフラの自動化を追求し続けていると、ある壁にぶつかります。それは「Playbookの中に書かれたハードコードされた変数」という名の呪縛です。
「本番環境と開発環境で変数を分けなきゃ」「DBのパスワードをGitに含められない」「最新のAPIトークンを毎回手動で更新するのは面倒だ」……そんな悩みを抱えていませんか?
今回は、Ansibleの真骨頂である「Lookupプラグイン」を使い、外部システムとリアルタイムに同期する「生きている構成管理」の極意を伝授します。これをマスターすれば、あなたのインフラは手動更新の泥沼から解放されます。
—
1. Lookupプラグインとは何か?:インフラの「目」を持つ
AnsibleのLookupプラグインは、Playbookの実行時に(Controllerノード上で)外部からデータを「拾ってくる」仕組みです。
通常、変数は `group_vars` などに静的に定義しますが、これでは「刻々と変化する外部システムの状態」に追従できません。Lookupを使えば、実行したその瞬間の値を外部から引き出すことができます。
なぜこれが強力なのか?
- 秘密情報の分離: HashiCorp Vaultから実行時にのみ値を読み込むことで、秘匿情報をディスクに一切残さない。
- 動的インベントリとの連携: 外部APIから最新のクラウドインスタンスIDを取得して設定に反映する。
- 冪等性の担保: 常に「最新の真実(Source of Truth)」を外部システムから取得するため、コードの陳腐化を防げる。
—
2. 最初のセットアップ:まずは「Pipe」で体験する
まずは最もシンプルで強力な `pipe` Lookupから始めましょう。これはシェルコマンドの実行結果を変数として取り込むものです。
動作確認:HelloWorld
適当なディレクトリで `test.yml` を作成してください。
—
- name: Lookupの基本動作確認
hosts: localhost
tasks:
- name: 現在の日時を外部から取得
debug:
msg: “今の時刻は {{ lookup(‘pipe’, ‘date +%Y-%m-%d’) }} です”
- name: ローカルの環境変数を取り込む
debug:
msg: “現在のユーザーは {{ lookup(‘env’, ‘USER’) }} です”
実行コマンド:
ansible-playbook test.yml
これだけで、「静的な設定ファイル」から「動的なシステム」への第一歩が踏み出せました。
—
3. 実践:HashiCorp Vaultから秘密情報を取得する
現場で最も多い要望が「パスワード管理」です。Ansibleの `community.hashi_vault` を使えば、秘密情報は実行時までメモリ上にしか存在しません。
前提条件
`ansible-galaxy collection install community.hashi_vault` を実行しておいてください。
実践コード
—
- name: VaultからDBパスワードを動的取得
hosts: all
vars:
# 実行時にVaultからシークレットを読み込む
db_password: “{{ lookup(‘community.hashi_vault.vault_kv2_get’, ‘secret/data/db_config’, url=’http://vault.example.com:8200′).secret.password }}”
tasks:
- name: DB接続設定を反映
template:
src: db_config.j2
dest: /etc/myapp/db.conf
# ここで変数db_passwordが展開される
ここがポイント:
もしVaultのシークレットが更新されても、Playbookを再実行するだけで常に最新のパスワードが反映されます。これが「冪等性」と「セキュリティ」を両立させるプロのやり方です。
—
4. プロの技:API連携で動的な構成を作る
さらに高度な活用術として、外部REST APIから構成情報を取得するパターンを紹介します。ここでは `url` Lookupを使用します。
- name: 外部APIから動的エンドポイントを取得
set_fact:
api_endpoint: “{{ lookup(‘url’, ‘https://api.internal.service/v1/config/lb_nodes’, split_lines=False) }}”
- name: ロードバランサー設定の更新
template:
src: nginx.conf.j2
dest: /etc/nginx/nginx.conf
notify: reload nginx
この手法を使えば、サービスメッシュやオートスケーリンググループのIPリストを、DBやレジストリから直接読み込んで設定ファイルに流し込めます。「サーバーが増えるたびに設定ファイルを書き換える」なんて作業は、もう過去の遺物です。
—
5. 最後に:インフラをコードの海へ
Lookupプラグインを使いこなすことは、「インフラ構成を、動的なデータパイプラインにする」ことと同義です。
1. 静的記述を捨てる: 可能な限りLookupで動的に取得する。
2. 冪等性を意識する: 外部システムが常に正(Source of Truth)であることを担保する。
3. シークレットを分離する: どんなに小さなプロジェクトでも、秘密情報はVault等の専用ツールへ。
最初からすべてを自動化する必要はありません。まずは今日ご紹介した `pipe` や `env` で遊んでみてください。慣れてきたら、VaultやAPIとの連携に挑む。その積み重ねが、あなたを「単なるオペレーター」から「インフラを設計するエンジニア」へと進化させてくれるはずです。
もし分からないことがあれば、いつでも聞いてください。インフラの深淵で待っています。