JQ фильтр на существование подраздела - PullRequest
0 голосов
/ 18 октября 2018

У меня есть некоторые средства автоматизации для настройки кластерного сервиса [Galera], который использует etcd для определения местоположения сервиса.Затем я получил балансировщик нагрузки, который считывает эту информацию для инициализации и запуска.

Проблема в том, что при тестировании автоматического заживления я заметил, что есть пустые etcd 'каталоги', где были старые узлы,ака не хватает nodes подключа.Это вызывает проблемы в конфигурации балансировщика нагрузки.

Ниже приведен результат curl http://etcd/... | jq .node.nodes[], который иллюстрирует проблему.

Как отфильтровать подобъекты, у которых нет *Клавиша 1009 *, например: 172.17.0.16?

{
  "key": "/galera/mariadb_galera/172.17.0.8",
  "dir": true,
  "nodes": [
    {
      "key": "/galera/mariadb_galera/172.17.0.8/ipaddress",
      "value": "172.17.0.8",
      "modifiedIndex": 9,
      "createdIndex": 9
    },
    {
      "key": "/galera/mariadb_galera/172.17.0.8/wsrep_local_state_comment",
      "value": "Synced",
      "expiration": "2018-10-17T21:24:48.94524993Z",
      "ttl": 2,
      "modifiedIndex": 52905,
      "createdIndex": 52905
    },
    {
      "key": "/galera/mariadb_galera/172.17.0.8/seqno",
      "value": "1367",
      "expiration": "2018-10-17T21:24:49.213778533Z",
      "ttl": 2,
      "modifiedIndex": 52907,
      "createdIndex": 52907
    }
  ],
  "modifiedIndex": 9,
  "createdIndex": 9
}
{
  "key": "/galera/mariadb_galera/172.17.0.16",
  "dir": true,
  "modifiedIndex": 48,
  "createdIndex": 48
}
{
  "key": "/galera/mariadb_galera/172.17.0.17",
  "dir": true,
  "modifiedIndex": 111,
  "createdIndex": 111
}
{
  "key": "/galera/mariadb_galera/172.17.0.11",
  "dir": true,
  "nodes": [
    {
      "key": "/galera/mariadb_galera/172.17.0.11/wsrep_local_state_comment",
      "value": "Synced",
      "expiration": "2018-10-17T21:24:55.990291814Z",
      "ttl": 9,
      "modifiedIndex": 52909,
      "createdIndex": 52909
    },
    {
      "key": "/galera/mariadb_galera/172.17.0.11/seqno",
      "value": "1367",
      "expiration": "2018-10-17T21:24:56.113268568Z",
      "ttl": 9,
      "modifiedIndex": 52910,
      "createdIndex": 52910
    }
  ],
  "modifiedIndex": 50749,
  "createdIndex": 50749
}
{
  "key": "/galera/mariadb_galera/172.17.0.14",
  "dir": true,
  "nodes": [
    {
      "key": "/galera/mariadb_galera/172.17.0.14/wsrep_local_state_comment",
      "value": "Synced",
      "expiration": "2018-10-17T21:24:49.029444262Z",
      "ttl": 2,
      "modifiedIndex": 52906,
      "createdIndex": 52906
    },
    {
      "key": "/galera/mariadb_galera/172.17.0.14/seqno",
      "value": "1367",
      "expiration": "2018-10-17T21:24:49.358067474Z",
      "ttl": 2,
      "modifiedIndex": 52908,
      "createdIndex": 52908
    }
  ],
  "modifiedIndex": 52076,
  "createdIndex": 52076
}

Обычно я использовал бы jq .node.nodes[].key, и результат был бы следующим, представляя живые узлы:

"/galera/mariadb_galera/172.17.0.8"
"/galera/mariadb_galera/172.17.0.11"
"/galera/mariadb_galera/172.17.0.14"

Но без фильтрацииэто пустые узлы, которые включают в себя узлы, которые больше не существуют:

"/galera/mariadb_galera/172.17.0.8"
"/galera/mariadb_galera/172.17.0.16"
"/galera/mariadb_galera/172.17.0.17"
"/galera/mariadb_galera/172.17.0.11"
"/galera/mariadb_galera/172.17.0.14"

1 Ответ

0 голосов
/ 18 октября 2018

Ваш оригинал не выполняет никакой фильтрации, добавьте его:

.node.nodes[] | select(.nodes != null).key
...