zaki work log

作業ログやら生活ログやらなんやら

[NetBox / Ansible] NetBoxインベントリプラグインでホストのエンドポイントとAPIトークンを外部から変数指定する

NetBoxのダイナミックインベントリは以前さわったときに使い方を以下にざっくりまとめてた。

zaki-hmkc.hatenablog.com

今回はインベントリファイルというより接続情報の書き方についておさらい。

docs.ansible.com

基本的な書き方

以下のようにapi_endpointにNetBoxのURLを、tokenにアクセストークンを記述する。

---
plugin: netbox.netbox.nb_inventory
api_endpoint: https://netbox.k3s-node.naru.jp-z.jp/
token: curry_oishii_mainichi_taberu
validate_certs: false

group_by:
  - device_roles
  - device_types
  - status

が、エンドポイントはともかくトークンをハードコードするのは運用上あまり良くないので回避したいところ。
また、エンドポイントも本番と開発でアドレスが異なるような使い方をしたい場合にはやはり可変にしたい。

環境変数を使った外部からの変数指定

ドキュメントに書かれているが、api_endpointtokenはそれぞれ環境変数で指定できる。

モジュールパラメタ 対応する環境変数
api_endpoint NETBOX_API
token NETBOX_TOKEN

これを踏まえると、上記のインベントリファイルはapi_endpointtokenを除いて以下のように書ける。

plugin: netbox.netbox.nb_inventory
validate_certs: false

group_by:
  - device_roles
  - device_types
  - status

そしてansible-inventoryCLIコマンドであれば、(正確には環境変数でなくシェル変数だが)以下のように変数指定して実行可能。

$ NETBOX_API=https://netbox.k3s-node.naru.jp-z.jp/ NETBOX_TOKEN=curry_oishii_mainichi_taberu ansible-inventory -i netbox-dynamic-inventory.yml --list
{
    "_meta": {
        "hostvars": {
            "pve01": {
                "ansible_host": ...,
                :
                :
}

これで、トークンをハードコードせずに済むし、環境によって異なる変数を外部から与えることもできる。
validate_certs環境変数でセットできないので、falseを指定しておくのが無難。

最初にやりがちだけど、以下のようにJinja2テンプレートで記述し、-eを使ったExtra Vars指定したりしても動作しない。
(正確にはtokenは変数参照できるapi_endpointは変数参照がプラグイン側に実装されていない)

---
plugin: netbox.netbox.nb_inventory
api_endpoint: "{{ netbox_api_endpoint }}"
token: "{{ netbox_token }}"

AWX/AAPの場合

これもExampleの「For use in Ansible Tower (AWX)」の部分に載っているが、エンドポイントとトークンを格納するための認証情報タイプを作成し、そこへ使用したいアクセス情報をセットすればよい。

認証情報タイプ

認証情報

taskでの作成

この内容の認証情報タイプ・認証情報を作成するタスクは以下の通り。

- name: create netbox-inventory credential type
  awx.awx.credential_type:
    name: netbox_inventory
    kind: cloud
    inputs:
      fields:
        - id: NETBOX_API
          type: string
          label: NetBox Host URL
        - id: NETBOX_TOKEN
          type: string
          label: NetBox API Token
          secret: true
      required:
        - NETBOX_API
        - NETBOX_TOKEN
    injectors:
      env:
        NETBOX_API: "{% raw -%}{{ NETBOX_API }}{%- endraw %}"
        NETBOX_TOKEN: "{% raw -%}{{ NETBOX_TOKEN }}{%- endraw %}"

- name: create netbox-inventory credential
  awx.awx.credential:
    name: netbox_inventory
    credential_type: netbox_inventory
    organization: Default
    inputs:
      NETBOX_API: https://netbox.k3s-node.naru.jp-z.jp/
      NETBOX_TOKEN: curry_oishii_mainichi_taberu

リソースの作成方法については以下参照。

zaki-hmkc.hatenablog.com