Json разбор в Ansible

Мне нужно разобрать вывод следующей команды:

mongo <dbname> --eval "db.isMaster()"

который выдает результат следующим образом:

 {
    "hosts" : [
        "xxx:<port>",
        "xxx:<port>",
        "xxx:<port>"
    ],
    "setName" : "xxx",
    "setVersion" : xxx,
    "ismaster" : true,
    "secondary" : false,
    "primary" : "xxx",
    "me" : "xxx",
    "electionId" : ObjectId("xxxx"),
    "maxBsonObjectSize" : xxx,
    "maxMessageSizeBytes" : xxxx,
    "maxWriteBatchSize" : xxx,
    "localTime" : ISODate("xxx"),
    "maxWireVersion" : 4,
    "minWireVersion" : 0,
    "ok" : 1
}

Мне нужно разобрать вышеупомянутый вывод, чтобы проверить значение "ismaster", это правда. Пожалуйста, дайте мне знать, как я могу сделать это в незаменимом.

В настоящий момент я просто проверяю, что текст "ismaster": true выводится на выходе с помощью следующего кода:

  tasks:
     - name: Check if the mongo node is primary
       shell: mongo <dbname> --eval "db.isMaster()"
       register: output_text

     - name: Run command on master
       shell: <command to execute>
       when: "'\"ismaster\\\" : true,' in output_text.stdout"

Однако было бы неплохо использовать обработку Ansible json для проверки того же. Просьба сообщить.

Ответ 1

В Ansible есть довольно много полезного filters.

Попробуйте: when: (output_text.stdout | from_json).ismaster

Ответ 2

Брат Кодер, честно говоря, у меня есть лучший метод, потому что в течение 3 недель я просто не мог разобрать его с помощью фильтра, который был сложным и никогда не работал. Я просто свернул ФАЙЛ и использовал анализатор JQ с регулярным выражением. Единственное, что требуется, это то, что JQ PARSER должен быть установлен на сервере:

Чтобы сделать это с ANSIBLE:

Используйте приглашение хоста, чтобы выбрать envid в

1. curl файл, как это:


2. Извлеките значение:

  • name: получить значение из файловой оболочки: cat file.json | jq '.globals.environments. {{envid}}. "legacy -c laimcenter-hostname"' | sed 's/"//g' args: chdir: /tmp/register: apiaccountclaims

3. Зарегистрируйтесь как переменная:

  • имя: set-fact1 set_fact: arguments1: "{{apiaccountclaims.stdout}}"

    1. Используйте его в любом месте:
  • name: введите службу tdiapiaccountclaims shell: sudo/usr/share/jbossas/bin/jboss-cli.sh -c - -c ommand = '/system-property = tdigi.api.uri.edge.account.claims: add (value = {{претензии1}}) '

Вот книга игр:


  • hosts: "{{hosts | default ('all')}}" становиться: верным

    vars_prompt: - имя: приглашение "envid": "Пожалуйста, укажите ID env"

    задачи:

     - name: Get json file
       shell: curl --output file.json -k -O  https://example.tp.com/services/getMasterExtract.php?env_id={{envid}}&product=all&du=all&format=json&resolved=true
       args:
         chdir: /tmp/
    
    
    
     - name: get value from file
       shell: cat file.json | jq '.globals.environments.{{envid}}."legacy-claimcenter-hostname"' | sed 's/"//g'
       args:
         chdir: /tmp/
       register: tdiapiaccountclaims
    
    
    
     - name: set-fact1
       set_fact:
         claims1:  "{{ apiaccountclaims.stdout }}"
    
    
     - name: copy command file
       copy:
        src:  "cli/systemprops2-2.cli"
        dest: "/opt/jboss/profiles/{{jboss_profile}}/configuration/"
    
     - name: backup standalone-full.xml
       shell:  cp "/opt/jboss/profiles/{{jboss_profile}}/configuration/standalone-full.xml" "/opt/jboss/profiles/{{jboss_profile}}/configuration/standalone-full.xml.backup.old"
    
     - name: Delete Configs in file of standalone-full.xml
       shell:  sudo /usr/share/jbossas/bin/jboss-cli.sh -c --file=systemprops2-2.cli
       args:
         chdir: /opt/jboss/profiles/{{ jboss_profile }}/configuration
       register: delvar
    
    
     - name: Enter service tdiapiaccountclaims
       shell: sudo /usr/share/jbossas/bin/jboss-cli.sh -c --command='/system-property=tdigi.api.uri.edge.account.claims:add(value={{ claims1 }})'