登録されたvar出力からのAnsibleマップフィルター

2020-02-14 ansible ansible-2.x ansible-inventory

登録済みの変数を介して、1つのサーバーからdhcpd.leasesファイルの完全なコピーをansibleで取得しています。デバッグ可能なデバッグの出力は次のようになります。

TASK [Show passive storage nodes info] *************************************************************************************************************************************************************
ok: [10.241.55.2] => {
    "msg": [
        "# The format of this file is documented in the dhcpd.leases(5) manual page.",
        "# This lease file was written by isc-dhcp-4.2.2",
        "",
        "lease 10.241.55.165 {",
        "  starts 4 2019/12/12 09:30:37;",
        "  ends 4 2019/12/12 21:30:37;",
        "  tstp 4 2019/12/12 21:30:37;",
        "  cltt 4 2019/12/12 09:30:37;",
        "  binding state free;",
        "  hardware ethernet b4:d1:35:00:04:50;",
        "  uid \"\\001\\264\\3215\\000\\004P\";",
        "}",
        "lease 10.241.55.163 {",
        "  starts 1 2019/12/16 08:10:56;",
        "  ends 1 2019/12/16 20:10:56;",
        "  tstp 1 2019/12/16 20:10:56;",
        "  cltt 1 2019/12/16 08:10:56;",
        "  binding state free;",
        "  hardware ethernet b4:d1:35:00:03:d7;",
        "}",
        "lease 10.241.55.159 {",
        "  starts 1 2019/12/16 08:52:20;",
        "  ends 1 2019/12/16 20:52:20;",
        "  tstp 1 2019/12/16 20:52:20;",
        "  cltt 1 2019/12/16 08:52:20;",
        "  binding state free;",
        "  hardware ethernet b4:d1:35:00:03:b4;",
        "}",
        "lease 10.241.55.166 {",
        "  starts 1 2019/12/16 08:54:38;",
        "  ends 1 2019/12/16 20:54:38;",
        "  tstp 1 2019/12/16 20:54:38;",
        "  cltt 1 2019/12/16 08:54:38;",
        "  binding state free;",
        "  hardware ethernet b4:d1:35:00:04:63;",
        "}",
        "lease 10.241.55.164 {",
        "  starts 1 2019/12/16 10:48:10;",
        "  ends 1 2019/12/16 22:48:10;",
        "  tstp 1 2019/12/16 22:48:10;",
        "  cltt 1 2019/12/16 10:48:10;",
        "  binding state free;",
        "  hardware ethernet b4:d1:35:00:04:4e;",
        "}",
        "lease 10.241.55.143 {",
        "  starts 5 2020/02/14 04:38:09;",
        "  ends 5 2020/02/14 16:38:09;",
        "  cltt 5 2020/02/14 04:38:09;",
        "  binding state active;",
        "  next binding state free;",
        "  rewind binding state free;",
        "  hardware ethernet 08:94:ef:9c:80:4a;",
        "  client-hostname \"linux-compute-e7d573cb9fda4e689939e21a7843c4fb\";",
        "}",
        "lease 10.241.55.148 {",
        "  starts 5 2020/02/14 05:03:08;",
        "  ends 5 2020/02/14 17:03:08;",
        "  cltt 5 2020/02/14 05:03:08;",
        "  binding state active;",
        "  next binding state free;",
        "  rewind binding state free;",
        "  hardware ethernet 00:e0:ec:ca:44:84;",
        "  client-hostname \"linux-storage-4391fc6548764de5a15a46b432d3cd37\";",
        "}",
        "lease 10.241.55.235 {",
        "  starts 5 2020/02/14 05:20:28;",
        "  ends 5 2020/02/14 17:20:28;",
        "  cltt 5 2020/02/14 05:20:28;",
        "  binding state active;",
        "  next binding state free;",
        "  rewind binding state free;",
        "  hardware ethernet 00:e0:ec:ca:45:74;",
        "  client-hostname \"linux-storage-58aba44ac09d4f639b9374b9142b1a53\";",
        "}",
        "lease 10.241.55.141 {",
        "  starts 5 2020/02/14 06:01:04;",
        "  ends 5 2020/02/14 18:01:04;",
        "  cltt 5 2020/02/14 06:01:04;",
        "  binding state active;",
        "  next binding state free;",
        "  rewind binding state free;",
        "  hardware ethernet 08:94:ef:9c:80:6c;",
        "  client-hostname \"linux-compute-d228bc79357c4c8b87c280f9efae6ba6\";",
        "}",
        "lease 10.241.55.236 {",
        "  starts 5 2020/02/14 06:12:28;",
        "  ends 5 2020/02/14 18:12:28;",
        "  cltt 5 2020/02/14 06:12:28;",
        "  binding state active;",
        "  next binding state free;",
        "  rewind binding state free;",
        "  hardware ethernet 00:e0:ec:ca:45:75;",
        "  client-hostname \"linux-storage-58aba44ac09d4f639b9374b9142b1a53\";",
        "}",
        "lease 10.241.55.140 {",
        "  starts 5 2020/02/14 06:13:18;",
        "  ends 5 2020/02/14 18:13:18;",
        "  cltt 5 2020/02/14 06:13:18;",
        "  binding state active;",
        "  next binding state free;",
        "  rewind binding state free;",
        "  hardware ethernet 08:94:ef:9c:80:24;",
        "  client-hostname \"linux-compute-d0a9a76a7b5249048f78642220a1958c\";",
        "}",

とにかく、フィールドリースip + client-hostnameをマッピングし、それに基づいてフィルタリングを行い、IPをインベントリファイルに厳密に配置する方法はありますか? IPを直接取得できることは知っていますが、4つのIPを持つサーバーがあり、同じホスト名を持っています。 4つのIPをすべてインベントリに入れるのではなく、それらのIPの1つだけが必要で(どちらでもかまいません)、ホスト名に基づいてフィルタリングを作成しようとしています。また、出力にはclient-hostnameを持たないエントリがあるため、理想的には無視する必要があります。

この質問は、私がここに投稿した別の質問と似ています。 Ansible jina2テンプレート、一意性に基づくフィルター出力

しかし、これで、私は別のアプローチを試みています。

私がこれまで試したのはこれです:

 debug:
   msg: "{{ p_storage_ips.stdout | map(attribute='client-hostname' | list) }}"

しかし、私は何も得ません: タスク[パッシブストレージノード情報を表示]

ok: [10.241.55.2] => {
    "msg": "<generator object do_map at 0x7f40e52785f0>"
}

また、このようにしてみました:

   - set_fact:
       dhcp_hosts: "{{ dhcp.stdout_lines | selectattr('client-hostname', 'defined') | map(attribute='lease') | list }}"

どんな助けでも大歓迎です!

Answers

気にせず、bashから直接ansibleに送信された出力をフィルター処理する方が簡単だと考えました。最終的に私はこれを思いついた:

 awk '!seen[$0]++' /var/lib/dhcp/dhcpd.leases | grep -vE -- 'ends|starts|tstp|cltt|uid|bind|hardware' | grep -B1 storage | awk '{print $2}' | grep '^[0-9]'

その結果、ストレージノードのIPアドレスは2つになります(8つのうち)。

10.241.55.148
10.241.55.235

これは最初の質問を解決しませんが、少なくとも望ましい答えを提供します。

Related