web-dev-qa-db-ja.com

Ansibleインベントリファイルでハッシュ(dict)を定義する方法は?

Group_vars/allで以下のようなハッシュ(dict)を定義することができます:

region_subnet_matrix:
  site1:
    region: "{{ aws_region }}"
    subnet: "subnet-xxxxxxx"
    zone: "{{aws_region}}a"
  site2:
    region: "{{ aws_region }}"
    subnet: "subnet-xxxxxxx"
    zone: "{{aws_region}}b"

しかし、私の一生の間、hostsファイルでそれを定義する方法を理解できませんでした

[all:vars]
region_subnet_matrix="{
  site1:
    region: "{{ aws_region }}"
    subnet: "subnet-xxxxxxx"
    zone: "{{aws_region}}a"
  site2:
    region: "{{ aws_region }}"
    subnet: "subnet-xxxxxxx"
    zone: "{{aws_region}}b"
}"

私はそれが間違っていたことを知っていますが、正しい方法がわかりません。誰かが私を教えてくれませんか?

9
Benson Jin

Ansibleのソースコードを読んでいると、インベントリファイルの変数の値はPythonの「ast.literal_eval()」によって評価されます。したがって、インベントリファイルのdict変数を1行のPythonリテラルで記述することができます。

あなたの例は次のようになります。

[all:vars]
region_subnet_matrix={'site1': {'subnet': 'subnet-xxxxxxx', 'region': '{{ aws_region }}', 'zone': '{{aws_region}}a'}, 'site2': {'subnet': 'subnet-xxxxxxx', 'region': '{{ aws_region }}', 'zone': '{{aws_region}}b'}}

この例では、変数が評価されていないことを確認してください。

注:この種の在庫変数の定義が正式に許可されているかどうかはわかりません。

10
Norio Kimura

ini形式を使用しているため、インベントリファイルでdictを使用することはできません。 Ansibleで推奨される方法は、実際には変数をメインインベントリファイルに保存しないことです。ホスト変数とグループ変数は、インベントリファイルに関連する個々のファイルに保存できます。

インベントリファイルのパスが次のようになっていると仮定します。/etc/ansible/hosts

ホストの名前がYAMLファイルの「testserver」変数である場合、次の場所でホストが利用できるようになります。/etc/ansible/Host_vars/testserver

このファイルのデータは次のようになります。

region_subnet_matrix:
  site1:
    region: "{{ aws_region }}"
    subnet: "subnet-xxxxxxx"
    zone: "{{aws_region}}a"
  site2:
    region: "{{ aws_region }}"
    subnet: "subnet-xxxxxxx"
    zone: "{{aws_region}}b"

続きを読む ここ

8
dizballanze