web-dev-qa-db-ja.com

AnsibleでのJSON解析

次のコマンドの出力を解析する必要があります。

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"の値がtrueであることを確認する必要があります。これをansibleで行う方法を教えてください。

現時点では、次のコードを使用して、出力に「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処理を使用して同じものをチェックするのは良いことです。お知らせ下さい。

17
trial999

Ansibleには、かなり役立つ filters があります。

試してください:when: (output_text.stdout | from_json).ismaster

39

ブラザーコーダー、正直に言って私はより良い方法を手に入れました。なぜなら、3週間は複雑なフィルターで解析できず、機能しなかったためです。私はFILEを丸めて、正規表現でJQパーサーを使用しました。必要なのは、JQ PARSERをサーバーにインストールする必要があることだけです。

ANSIBLEでそれを行うには:

ホストプロンプトを使用して、

1.次のようなcurlファイル:


2.値を抽出します。

  • 名前:ファイルから値を取得シェル:cat file.json | jq '.globals.environments。{{envid}}。 "legacy-claimcenter-hostname"' | sed 's/"// g'引数:chdir:/ tmp /レジスタ:apiaccountclaims

3.変数として登録:

  • 名前:set-fact1 set_fact:Claims1: "{{apiaccountclaims.stdout}}"

    1. どこでも使用:
  • 名前:サービスtdiapiaccountclaimsを入力してくださいシェル:Sudo /usr/share/jbossas/bin/jboss-cli.sh -c --command = '/ system-property = tdigi.api.uri.Edge.account.claims:add(value = {{Claims1}}) '

プレイブックは次のとおりです。


  • ホスト:「{{hosts | default( 'all')}}」:true

    vars_Prompt:-name: "envid"プロンプト: "env IDを入力してください"

    タスク:

     - 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 }})'
    
1
alexei G.