mcpField
I
infrahub-managing-transforms

infrahub-managing-transforms

github.com/opsmillデータ・データベース27155 回インストール1 日前に更新
リポジトリ

infrahub-managing-transforms について

infrahub-managing-transforms は、Infrahub データをファイルやテキスト形式に変換する Infrahub transform を開発する人向けのスキルです。Python、Jinja2、ハイブリッド方式に加え、Artifact の設定、登録、テストを扱います。

主な機能

  1. 01Python と Jinja2 の transform ガイダンス
  2. 02GraphQL クエリ設計
  3. 03テキストと構造化出力の生成
  4. 04Artifact との連携
  5. 05Transform の登録と依存関係の追跡
  6. 06自動テストとローカルテスト

活用シーン

  1. 01インフラデータからデバイス設定を生成
  2. 02インベントリを CSV で出力
  3. 03クエリ結果で Jinja2 テンプレートをレンダリング
  4. 04transform の出力を Artifact に接続

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/opsmill/infrahub-skills --skill infrahub-managing-transforms

インストール後、Claude Code で/infrahub-managing-transformsを入力して読み込まれたか確認します。

同梱ファイル

SKILL.md と一緒にインストールされる参考資料やスクリプト。

examples.md
reference.md
rules/
_sections.md
_template.md
api-reference.md
artifacts-async-regen-polling.md
artifacts-definitions.md
artifacts-watch-dependencies.md
hybrid-python-jinja2.md
jinja2-template.md
patterns-common.md
python-transform.md
queries-union-fragments.md
testing-commands.md
testing-resource-framework.md
types-overview.md

詳細

Infrahub Transform Creator

概要

Infrahub トランスフォームを作成するための専門的なガイダンスです。 トランスフォームは Infrahub のデータをさまざまな形式 -- JSON、テキスト、CSV、デバイスコンフィグ、または任意のテキストベースの 出力 -- に変換します。Python クラスまたは Jinja2 テンプレートを使用します。

プロジェクトコンテキスト

Infrahub 設定: !cat .infrahub.yml 2>/dev/null || echo "No .infrahub.yml found"

既存のトランスフォーム: !find . -name "*.py" -path "*/transforms/*" -o -name "*.j2" -path "*/templates/*" 2>/dev/null | head -20

使用する場面

  • データ変換の構築 (Infrahub データ -> 別の形式)
  • インフラストラクチャデータからのデバイスコンフィグの生成
  • CSV レポート、ケーブルマトリクス、またはインベントリエクスポートの作成
  • クエリデータを使用した Jinja2 テンプレートのレンダリング
  • Python ロジックと Jinja2 レンダリングの組み合わせ
  • 自動出力のためにトランスフォームをアーティファクトに接続
  • 既存のトランスフォームまたはテンプレートがレンダリングする内容の変更
  • 誤った出力、または生成に失敗するアーティファクトのデバッグ

ルールカテゴリ

優先度カテゴリプレフィックス説明
CRITICALTypestypes-Python と Jinja2 の選択
CRITICALPythonpython-InfrahubTransform クラス
CRITICALJinja2jinja2-テンプレート構文、フィルター
HIGHHybridhybrid-Python + Jinja2 の組み合わせ
HIGHArtifactsartifacts-出力ファイル、ターゲット
HIGHAPI Refapi-クラス属性、メソッド
MEDIUMPatternspatterns-ユーティリティ、CSV、共有
HIGHTestingtesting-Resources Testing Framework、transform/render コマンド

このスキルが依存するスキーマ機能

トランスフォームはスキーマ形式のデータを読み取り、ファイルを生成します。トランスフォームとスキーマの不一致は遅い段階で失敗します — 成果物のレンダリング時、誰かが出力を待っているときに。

トランスフォームが...スキーマ(または .infrahub.yml)は...参照
artifact_definitions エントリに供給する対象ノードは inherit_from: CoreArtifactTarget を持つ必要がある。そうすることで成果物パイプラインがそれをアタッチできる../infrahub-managing-schemas/rules/extension-artifact-target.md
ノードから属性を読み取るGraphQL でそれらの属性を完全な __value アクセスパスとともに定義する — 沈黙の空文字列は値ではなくノードにアクセスすることで生じる../infrahub-managing-schemas/rules/attribute-defaults-and-types.md
プラットフォーム/ロールごとにデバイスごとのテンプレートを選択するスキーマはそのプラットフォーム/ロールを実際の属性またはリレーションシップとして公開する必要がある — display_label の文字列マッチングは壊れやすい../infrahub-managing-schemas/rules/display-human-friendly-id.md
artifact_definitions.transformation から参照されるトランスフォームの登録された name は transformation: フィールドと完全に一致する必要がある — 不一致はレンダリング時に「transformation not found」を引き起こすrules/artifacts-definitions.md
Jinja2(Python ではなく)を使用するトップレベルの query: フィールドとともに jinja2_transforms に登録する — python_transforms はクラス上でクエリをバインドし、2 つのキーは互換性がないrules/api-reference.md
Python トランスフォームであるインポートするすべてのファーストパーティモジュールを列挙する watch: ブロックを持つ — インポートは決して追跡されないため、兄弟モジュールも含める。このキーがないと、Infrahub は依存関係リストを信頼できず、コミットのたびに成果物を再レンダリングするrules/artifacts-watch-dependencies.md
実行時にデータファイルを読み取る、または変数名でテンプレートをインクルードするそれらのパスを watch.files に指定する — 検出は文字列としてのみ存在するパスを認識できないため、変更時に成果物が古くなり、エラーも発生しないrules/artifacts-watch-dependencies.md
呼び出し元(カタログページ、CI ジョブ、オーケストレーター)によって成果物が再生成されるその呼び出し元は各成果物がボディ準備完了になるまで CoreArtifact をポーリングする必要がある — POST は再生成をキューに入れるだけであり、ノードはそのコンテンツより先に存在するrules/artifacts-async-regen-polling.md

Python を記述する前に

変換処理の本体が文字列フォーマット(f 文字列、連結、条件付きセクション)であれば、Jinja2 を使うと同じ出力をより少ない行数で表現でき、変更提案 UI で直接レンダリングされます。また、.infrahub.yml の python_transforms ではなく jinja2_transforms の下に記述します。InfrahubTransform を使う前に、次の段階を確認してください。

シグナルより簡易なレイヤールール
変換処理の本体が return f"..." またはクエリ結果から作成した "\n".join([...])Jinja2 テンプレートファイルyagni-python-transform-that-could-be-jinja2
変換処理が計算せずにクエリデータをそのままコピーするGraphQL クエリのみ — 変換処理は不要段階 1(要件を取り除く)。判断が必要で、ルールはありません
条件分岐が if x: out += ...; else: out += ... のみで、それ以外は何もないJinja2 の {% if %} ブロックyagni-python-transform-that-could-be-jinja2

解析、計算、または再構成を行う変換処理では Python を使います。たとえば、IP/サブネット計算、ハッシュ化、順序付きの集約、構造を維持した JSON の再構成などです。適切なケースについては、rules/python-transform.md を参照してください。

変換処理で SDK を介してオブジェクトを読み取る場合は、文字列の種類ではなく、生成されたプロトコルクラスで呼び出しに型を付けてください。たとえば kind="NetworkLink" ではなく client.filters(NetworkLink, ...) とします。こうすることで、スキーマの変更によって返されたオブジェクトの属性読み取りに問題が生じた場合、型チェック時に検出できます。create() に渡すフィールド名は型チェックされません。protocols-adopt-typed-kinds を参照してください。

変換の基本

変換処理には 2 種類あります。

種類出力エントリーポイント
Pythonアーティファクトの content_type に応じた形式:application/json または application/yaml の場合のみ dict、それ以外の 6 種類では strInfrahubTransform.transform()
Jinja2テキスト.j2 テンプレートファイル
from infrahub_sdk.transforms import InfrahubTransform

class MyTransform(InfrahubTransform):
    query = "my_query"

    # Returns a dict, so the artifact definition has to declare
    # content_type: application/json (or application/yaml). Under any
    # other content type this dict is stored as str(dict), with no
    # error. See rules/artifacts-definitions.md.
    async def transform(self, data: dict) -> dict:
        device = data["DcimDevice"]["edges"][0]["node"]
        return {"hostname": device["name"]["value"]}

ワークフロー

トランスフォームを作成するときは、次の手順に従ってください。

  1. トランスフォームの種類を選択する — JSON/dict や複雑なロジックには Python、テキストテンプレートには Jinja2、両方にはハイブリッドを使用します。詳しくは rules/types-overview.md をお読みください。
  2. GraphQL クエリを作成する — トランスフォームするデータを取得する .gql ファイルを作成します。クエリのパターンについては ../infrahub-common/graphql-queries.md をお読みください。
  3. トランスフォームを実装する — Python の場合は、InfrahubTransform を継承し、transform() を実装します。詳しくは rules/python-transform.md をお読みください。 Jinja2 の場合は、.j2 テンプレートを作成します。詳しくは rules/jinja2-template.md をお読みください。 ハイブリッドの場合は、 rules/hybrid-python-jinja2.md をお読みください。
  4. アーティファクトに接続する — トランスフォームの出力をファイルとして保存する場合は、アーティファクト定義を構成します。詳しくは rules/artifacts-definitions.md をご覧ください。
  5. .infrahub.yml に登録する — python_transforms または jinja2_transforms の下に追加します。詳しくは rules/api-reference.md をご覧ください。 次に、watch.files でトランスフォームの依存関係を宣言します。エントリーポイントのインポートと実行時のファイル読み取りを確認し、それらが解決するすべてのファーストパーティパスを指定してください。Python トランスフォームは常にこのキーを持つべきです — 自身のファイル以外に依存関係が本当にない場合は files: [] とします。詳しくは rules/artifacts-watch-dependencies.md をお読みください。このドキュメントでは、既存の watch ブロックについて、欠落しているエントリー、古くなったエントリー、誤ったエントリーを確認する方法も説明しています。
  6. テストを追加する — トランスフォームと一緒に YAML 駆動のテスト定義(スモーク、ユニット、統合)を作成し、提案された変更パイプラインで自動的に検証されるようにします。詳しくは rules/testing-resource-framework.md をお読みください。
  7. ローカルでテストする — infrahubctl transform または infrahubctl render を実行して検証します。詳しくは rules/testing-commands.md をご覧ください。

関連リファレンス

コメント