2017-09-21 8 views
1

私は、JSONまたはYAMLのいずれかの設定を読み込み、ファイル内のいくつかのノードから値を抽出するためにAnsibleを使用しています。不可能| JSONまたはYAMLのいずれかのデータを処理する

from_jsonまたはfrom_yamlを使用してAnsibleで処理することができますが、設定がどの形式になるかわからないため、動作させるのが難しいです。

ファイルはKubernetes 'Kubeconfigです。 JSON

{ 
    "kind": "Config", 
    "apiVersion": "v1", 
    "preferences": {}, 
    "clusters": [ 
     { 
      "name": "k8s-clstr-master", 
      "cluster": { 
       "server": "https://my-k8s-cluster.com", 
       "certificate-authority-data": "REDACTED" 
      } 
     } 
    ], 
    "users": [ 
     { 
      "name": "k8s-clstr-master-admin", 
      "user": { 
       "client-certificate-data": "REDACTED", 
       "client-key-data": "REDACTED" 
      } 
     } 
    ], 
    "contexts": [ 
     { 
      "name": "k8s-clstr-master", 
      "context": { 
       "cluster": "k8s-clstr-master", 
       "user": "k8s-clstr-master-admin", 
       "namespace": "kube-system" 
      } 
     } 
    ], 
    "current-context": "k8s-clstr-master" 
} 
でYAML

apiVersion: v1 
clusters: 
- cluster: 
    certificate-authority-data: REDACTED 
    server: https://my-k8s-cluster.com 
    name: k8s-clstr-master 
contexts: 
- context: 
    cluster: k8s-clstr-master 
    namespace: kube-system 
    user: k8s-clstr-master-admin 
    name: k8s-clstr-master 
current-context: k8s-clstr-master 
kind: Config 
preferences: {} 
users: 
- name: k8s-clstr-master-admin 
    user: 
    client-certificate-data: REDACTED 
    client-key-data: REDACTED 

私が使用しているAnsible:以下の例kubeconfigをJSONで取得された場合

vars: 
    kubeconfig: "{{ lookup('hashivault', '/kubeconfig/admin', 'config') }}" 

tasks: 
    - name: Find cluster server name 
    shell: "echo {{ kubeconfig.clusters[0].cluster.server }}" 

Ansibleブロックの上には大丈夫に動作しますYAML形式で取得された場合は失敗します。

私は|from yamlでタスクを作ってからignore_errors: trueを追加することができますが、それはちょうどそれが正しいと感じられません。

誰でも私がこの問題にどのようにアプローチできるかについてのヒントはありますか?

+0

あなたはYAMLがJSONのスーパーセットであることにご存じでしょうか?そのため、JSONドキュメントをYAMLとしてロードするだけでいいですか? – flyx

+0

はい、私はどのようにするか分からなかった。 – Amit

+0

ちょうど 'from_yaml'を使ってください。 – flyx

答えて

2

Jinja2にはbuilt-in testsがあります。

あなたが{{...}}式の中にJSON文字列を持っている場合、Anipal templatorが動作する方法は、自動的にオブジェクトに変換されます。したがって、ボールトからJSONを取得した場合、kubeconfigはオブジェクトになります。それ以外の場合は文字列です。ここで

はあなたのためのレシピです:

vars: 
    kubeconfig_raw: "{{ lookup('hashivault', '/kubeconfig/admin', 'config') }}" 
    kubeconfig: "{{ kubeconfig_raw if kubeconfig_raw is mapping else kubeconfig_raw | from_yaml }}" 

tasks: 
    - name: Find cluster server name 
    shell: "echo {{ kubeconfig.clusters[0].cluster.server }}" 
+0

ありがとう 'もしkubeconfig_rawがマッピングされているならば、私が探していたものでした。そして組み込みのテストリンクのおかげでありがとう! – Amit

1

あなたがinclude_varsタスクを使用している場合、あなたが提供する形式は重要ではありません。タスクは両方を受け入れます。

--- 
- hosts: localhost 
    connection: local 
    tasks: 
    - include_vars: 
     file: config 
     name: kubeconfig 
    - debug: var=kubeconfig 
関連する問題