1. ホーム
  2. jinja2

[解決済み] Ansible: 属性でリストをフィルタリングする

2023-01-26 23:20:02

質問

Ansibleに"network"という変数が登録されているのですが、これは何ですか?

{
    "addresses": {
        "private_ext": [
            {
                "type": "fixed",
                "addr": "172.16.2.100"
            }
        ],
        "private_man": [
            {
                "type": "fixed",
                "addr": "172.16.1.100"
            },
            {
                "type": "floating",
                "addr": "10.90.80.10"
            }
        ]
    }
}

このようにtype="floating"でIPアドレス("addr")を取得することは可能でしょうか?

- debug: var={{ network.addresses.private_man | filter type="fixed" | get "addr" }}

構文がおかしいですが、イメージはつかめると思います。

どのように解決するのですか?

私は プルリクエスト (Ansible 2.2+ で利用可能) を提出し、この種の状況をより簡単にするために jmespath クエリのサポートを追加することで、この種の状況を容易にします。あなたの場合、次のように動作します。

- debug: msg="{{ addresses | json_query(\"private_man[?type=='fixed'].addr\") }}"

は返すだろう。

ok: [localhost] => {
    "msg": [
        "172.16.1.100"
    ]
}