web-dev-qa-db-ja.com

Ansibleインベントリへの入力としてホスト情報で構成されるjsonファイルを使用する方法

次のjsonファイルをansibleHostインベントリへの入力として使用しようとしていますが、プレイブックを実行するとエラーが発生します。 JSONファイル:

{
   "instances":{
       "Host": 10.66.70.33
   }
}

プレイブック:

ホスト: "{{instances.Host}}"
remote_user:root #vars:

プレイブックを実行すると、次のエラーが発生します。どこが間違っているのかわかりません。私はAnsibleを初めて使用します。私はいくつかのばかげた間違いをしていると思うのでアドバイスしてください。

[警告]:指定されたホストパターンと一致しませんでした。無視します:すべて[警告]:ホストリストが空の場合、ローカルホストのみが使用可能ですエラー!フィールド「hosts」に無効な値があり、未定義の変数が含まれています。エラーは次のとおりです。「インスタンス」は未定義です

私は次のようにプレイブックを実行しています:

ansible-playbook -i <path>/test.json <path>test_playbook.yml
5
DSAK

インベントリファイルとしてサポートされていない純粋なJSONのようです。 インベントリプラグインリスト JSONが表示されません:

  • advanced_Host_list-範囲を指定して「ホストリスト」を解析します
  • auto-YAML構成で指定されたインベントリプラグインをロードして実行します
  • aws_ec2-ec2インベントリソース
  • 構築済み-Jinja2を使用して、既存のインベントリに基づいて変数とグループを構築します。
  • Host_list-「ホストリスト」文字列を解析します
  • ini-インベントリソースとしてAnsible INIファイルを使用します。
  • k8s-Kubernetes(K8s)インベントリソース
  • openshift-OpenShiftインベントリーソース
  • openstack-OpenStackインベントリソース
  • script-JSONを返すインベントリスクリプトを実行します
  • virtualbox-virtualboxインベントリソース
  • yaml-インベントリソースとして特にYAMLファイルを使用します。

一方、次のように、そのJSONを単純なpythonスクリプトでラップできます。

  1. ansible.cfgファイルでスクリプトプラグインが有効になっていることを確認してください。

    [inventory]
    enable_plugins = Host_list, script, yaml, ini
    
  2. ラッパースクリプト(インベントリファイル)を作成し、JSONを読み取り、コンソールに出力するだけです(JSONとラッパースクリプトが同じパスにあると想定しています)。

    #!/usr/bin/env python
    import os
    
    __location__ = os.path.realpath(
        os.path.join(os.getcwd(), os.path.dirname(__file__)))
    
    with open(os.path.join(__location__, "hosts.json")) as f:
        print f.read()
    
  3. JSONインベントリで以下を使用します( パフォーマンスの向上 ):

    {
        "_meta": {
            "hostvars": { }
        },
    
        "instances": {
            "hosts": ["10.66.70.33"]
        }
    }
    
  4. プレイブックを実行するときは、ターゲットにするグループが「インスタンス」である必要があることに注意してください。たとえば、これは私のプレイブックです。

    ---
    - hosts: instances
      tasks:
        - debug:
            msg: Hi there
    

次に、pythonラッパースクリプトを指定して、プレイブックを実行します。私の場合、これは次のとおりです。

ansible-playbook -i inventory/hostswrapper.py test-stkovfl.yml

それが役に立てば幸い!

3
kajahno

Ansibleの yamlプラグインwillは実際にJSONファイルを解析し、何年にもわたって解析してきました。

それはほとんど文書化されていませんが、 yamlプラグインドキュメントのパラメータセクション で見ることができます、.jsonは有効な拡張子としてリストされています。

JSON形式はYAML形式と同じセマンティクスを持っています。注:not動的インベントリ と同じ形式ではありません!

したがって、JSONは次のようになります。

{
   "instances": {
      "hosts": {
         "10.66.70.33": null
      }
   }
}

注:これは「ホスト」ではなく「ホスト」であり、各アドレスは辞書/ハッシュキーであり、値はホスト固有の変数です。

Inventory docsの操作 から最初の例をとると、

all:
  hosts:
    mail.example.com:
  children:
    webservers:
      hosts:
        foo.example.com:
        bar.example.com:
    dbservers:
      hosts:
        one.example.com:
        two.example.com:
        three.example.com:

次のようになります、

{
  "all": {
    "hosts": {
      "mail.example.com": null
    },
    "children": {
      "webservers": {
        "hosts": {
          "foo.example.com": null,
          "bar.example.com": null
        }
      },
      "dbservers": {
        "hosts": {
          "one.example.com": null,
          "two.example.com": null,
          "three.example.com": null
        }
      }
    }
  }
}

これらのnullsは奇妙に見えますが、YAMLの例では、末尾のコロンが表示されます。これは、これらの各ホストが事実上辞書/ハッシュキーであることを意味します。

不思議なことに、JSON-then-YAMLロードコードは parsing/utils/yaml.py にあり、実際の解析は parsing/Inventory/yaml.py にあります。

1
tantrix