Как получить первичный MongoDB путем фильтрации stdout_lines в Ansible? - PullRequest
0 голосов
/ 20 мая 2019

В моей книге воспроизведения есть следующая задача, которая должна получить первичную копию в наборе реплик MongoDB:

- name: get primary
  shell: mongo --host {{ mongodb_replicaset_name }}/{{ mongodb_hosts }} --quiet --eval "rs.isMaster().primary"
  register: primary_result
  changed_when: false
  run_once: true

Ожидаемый результат должен выглядеть следующим образом в оболочке:

rs0: PRIMARY> rs.isMaster (). Primary

mongotest1: 27017

Я пытался использовать следующую задачу, чтобы получить результат, но этоне работает, потому что выходные данные содержат все сетевые сообщения, и порядок не гарантируется.

- name: set primary host:port string
  set_fact:
    primary: "{{ primary_result.stdout_lines[-1] }}"
  run_once: true

Я получил результаты, где "mongotest1: 27017" находится в середине всего этого другого информационного выводакак это:

ok: [mongotest4] => {
    "primary_result": {
        "changed": false,
        "cmd": "mongo --host rs0/mongotest1,mongotest2,mongotest3,mongotest4,mongotest5 --quiet --eval \"rs.isMaster().primary\"",
        "delta": "0:00:00.073013",
        "end": "2019-05-17 19:09:57.954030",
        "failed": false,
        "rc": 0,
        "start": "2019-05-17 19:09:57.881017",
        "stderr": "",
        "stderr_lines": [],
        "stdout": "2019-05-17T19:09:57.940+0000 I NETWORK  [js] Starting new replica set monitor for rs0/mongotest1:27017,mongotest2:27017,mongotest3:27017,mongotest4:27017,mongotest5:27017\n2019-05-17T19:09:57.943+0000 I NETWORK  [ReplicaSetMonitor-TaskExecutor] Successfully connected to mongotest2:27017 (1 connections now open to mongotest2:27017 with a 5 second timeout)\n2019-05-17T19:09:57.944+0000 I NETWORK  [js] Successfully connected to mongotest1:27017 (1 connections now open to mongotest1:27017 with a 5 second timeout)\n2019-05-17T19:09:57.945+0000 I NETWORK  [ReplicaSetMonitor-TaskExecutor] Successfully connected to mongotest5:27017 (1 connections now open to mongotest5:27017 with a 5 second timeout)\nmongotest1:27017\n2019-05-17T19:09:57.949+0000 I NETWORK  [ReplicaSetMonitor-TaskExecutor] Successfully connected to mongotest3:27017 (1 connections now open to mongotest3:27017 with a 5 second timeout)\n2019-05-17T19:09:57.951+0000 I NETWORK  [ReplicaSetMonitor-TaskExecutor] Successfully connected to mongotest4:27017 (1 connections now open to mongotest4:27017 with a 5 second timeout)",
        "stdout_lines": [
            "2019-05-17T19:09:57.940+0000 I NETWORK  [js] Starting new replica set monitor for rs0/mongotest1:27017,mongotest2:27017,mongotest3:27017,mongotest4:27017,mongotest5:27017",
            "2019-05-17T19:09:57.943+0000 I NETWORK  [ReplicaSetMonitor-TaskExecutor] Successfully connected to mongotest2:27017 (1 connections now open to mongotest2:27017 with a 5 second timeout)",
            "2019-05-17T19:09:57.944+0000 I NETWORK  [js] Successfully connected to mongotest1:27017 (1 connections now open to mongotest1:27017 with a 5 second timeout)",
            "2019-05-17T19:09:57.945+0000 I NETWORK  [ReplicaSetMonitor-TaskExecutor] Successfully connected to mongotest5:27017 (1 connections now open to mongotest5:27017 with a 5 second timeout)",
            "mongotest1:27017",
            "2019-05-17T19:09:57.949+0000 I NETWORK  [ReplicaSetMonitor-TaskExecutor] Successfully connected to mongotest3:27017 (1 connections now open to mongotest3:27017 with a 5 second timeout)",
            "2019-05-17T19:09:57.951+0000 I NETWORK  [ReplicaSetMonitor-TaskExecutor] Successfully connected to mongotest4:27017 (1 connections now open to mongotest4:27017 with a 5 second timeout)"
        ]
    }
}

Я хочу получить первую строку stdout_lines, которая не соответствует шаблону префикса метки времени "^ [0-9] {4} - [0-9] {2} - [0-9] {2} Т [0-9] {2}: [0-9] {2}:. [0-9] {2} [0-9] {3} [+ -] [0-9] {4} \ s + "и сохраните результат в переменной.Первым и единственным результатом должна быть строка «mongotest1: 27017».Как я могу это сделать?

Кроме того, есть ли другой способ получить первичную MongoDB без использования оболочки mongo, чтобы я не сталкивался с этими проблемами при выводе оболочки?

1 Ответ

0 голосов
/ 20 мая 2019

Я думаю, что нашел решение для этого.

Я создал новую задачу фильтра, которая проверяет обратный префикс метки времени:

- name: filter unwanted informational messages from primary result
  set_fact:
    filtered_lines: "{{ primary_result.stdout_lines | select('match', '^(?!([0-9]{4}-[0-9]{2}-[0-9]{2}T[0-9]{2}:[0-9]{2}:[0-9]{2}.[0-9]{3}[+-][0-9]{4}\\s+))') | list }}"
  run_once: true

Затем я устанавливаю факт, используя первый элемент списка в результате фильтрованных строк

- name: set primary host:port string
  set_fact:
    primary: "{{ filtered_lines[0] }}"
  run_once: true

Кажется, это работает при тестировании

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...