web-dev-qa-db-ja.com

Ansibleで正規表現を使用してリストから単一のアイテムを抽出する

次のように、ローカルNICを自動的に挿入するために/etc/network/interfaces fileをテンプレート化して、Ubuntu 16.04でブリッジインターフェイスを構成しようとしています。

auto br0
iface br0 inet dhcp
    bridge_ports <interface>

私はbiosdevnameをインストールしていないため、インターフェースはens33(テストシステム上)として表示され、他のホストでは変更されています。歴史的なeth0の代わりに。

{{ ansible_default_ipv4.interface }}を使用してファイルを完成させることはできません。これは、最初の実行時にのみファイルに正しく入力されるためです。再起動後、プレイブックを実行すると、代わりにブリッジbr0ポートでファイルが完成します。

{{ ansible_interfaces }}変数を使用していくつかの異なる反復を試行し、正規表現en。*(これらのポートはすべて固定イーサネットネットワークカードになります)に基づいて照合しようとしましたが、どれもファイルに正しく入力されていません。

私がこれまでに来た最も近いものは:

- debug: msg={{ ansible_interfaces | map('match','ens.*') | list }}

出力する

TASK [openvpn : debug] ****************************************************
ok: [192.168.0.134] => {
    "msg": [
        false,
        false,
        true
    ]
}

しかし、一致があったかどうかだけでなく、一致した実際のアダプター名を抽出できる必要があります。

または、

- debug: msg="{{ item }}"
  when: "{{ item }} | map('match','ens.*')"
  with_items: "{{ ansible_interfaces }}"

この有望な出力を提供しますが、私が一致させようとしているアダプターだけでなく、すべてのアダプターに対して:

TASK [openvpn : debug] *****************************************************
ok: [192.168.0.134] => (item=lo) => {
    "item": "lo",
    "msg": "lo"
}
ok: [192.168.0.134] => (item=br0) => {
    "item": "br0",
    "msg": "br0"
}
ok: [192.168.0.134] => (item=ens33) => {
    "item": "ens33",
    "msg": "ens33"
}
3
Doug

うーん、インターフェース名を取得する必要がある場合は、以下を試してください。

- debug:
    msg: "{{ ansible_interfaces | select('match','ens.*') | list | first }}"
7