web-dev-qa-db-ja.com

Ansible Playbookのインベントリホスト変数へのアクセス

私はansible 2.1を使用しています。次のインベントリホストファイルと、ホストファイル変数へのアクセスを必要とするプレイによって呼び出されるロールがあります。アクセス方法についての考え(現在エラーが発生しています):

ホストファイル

[test1]
test-1 ansible_ssh_Host=abc.def.ghi.jkl ansible_ssh_port=1212

[test2]
test2-1 ansible_ssh_Host=abc.def.ghi.mno ansible_ssh_port=1212

[test3]
test3-1 ansible_ssh_Host=abc.def.ghi.pqr ansible_ssh_port=1212
test3-2 ansible_ssh_Host=abc.def.ghi.stu ansible_ssh_port=1212

[all:children]
test1
test2
test3

ロール次の方法でロールにアクセスしようとしました。

{{ hostvars.ansible_ssh_Host }} 

&&

{{ hostvars.test1.ansible_ssh_Host }}

Test1セクションのansible_ssh_Hostにアクセスしようとしています。

エラー

fatal: [localhost]: FAILED! => {"failed": true, "msg": "'ansible.vars.hostvars.HostVars object' has no attribute 'ansible'"}
32
ali haider

あなたはhostvarsについて正しい軌道に乗っています。
この マジック変数 は、他のホストに関する情報にアクセスするために使用されます。

hostvarsは、インベントリホスト名をキーとするハッシュです。
各ホストのフィールドにアクセスするには、hostvars['test-1']hostvars['test2-1']などを使用します。

ansible_ssh_Host非推奨 2.0以降のansible_Hostを支持します。
したがって、最初にインベントリホスト引数から「_ssh」を削除する必要があります(つまり、「ansible_user」、「ansible_Host」、および「ansible_port」になる)。次に、ロールで次のように呼び出します。

{{ hostvars['your_Host_group'].ansible_Host }}
36
[Host_group]
Host-1 ansible_ssh_Host=192.168.0.21 node_name=foo
Host-2 ansible_ssh_Host=192.168.0.22 node_name=bar

[Host_group:vars]
custom_var=asdasdasd

次を使用して、ホストグループ変数にアクセスできます。

{{ hostvars['Host_group'].custom_var }}

特定のホストから特定の値が必要な場合は、次を使用できます。

{{ hostvars[groups['Host_group'][0]].node_name }}
12
Eduardo Cuomo

変数名を直接使用できるはずです

ansible_ssh_Host

または、 magic variableinventory_hostnameを使用して、文字通りホストを指定することなくhostvarsを経由することができます

hostvars[inventory_hostname].ansible_ssh_Host
7
Jason S

私もこれに苦労しました。私の具体的なセットアップは次のとおりです。Host.ini(最新の名前):

[test3]
test3-1 ansible_Host=abc.def.ghi.pqr ansible_port=1212
test3-2 ansible_Host=abc.def.ghi.stu ansible_port=1212

さらに、fill_file.ymlを再生します

---
- remote_user: ec2-user
  hosts: test3
  tasks:
   - name: fill file
     template:
       src: file.j2
       dest: filled_file.txt

プラステンプレートfile.j2のように

{% for Host in groups['test3'] %}
   {{ hostvars[Host].ansible_Host }}
{% endfor %}

これは私のために働いた、結果は

abc.def.ghi.pqr
abc.def.ghi.stu

2.1ではなく、2.7であることを認めざるを得ません。テンプレートは https://docs.ansible.com/ansible/latest/user_guide/playbooks_variables.html の例のバリエーションです。

受け入れられた答えは私の設定では機能しませんでした。テンプレート付き

{{ hostvars['test3'].ansible_Host }}

「AnsibleUndefinedVariable:\ "hostvars ['test3'] \" is undefined」でプレイが失敗します。

注釈:いくつかのバリエーションを試しましたが、失敗しました。「ansible.vars.hostvars.HostVarsオブジェクトには要素がありません」;これのいくつかは、彼らが言うことによって説明されるかもしれません。 in https://github.com/ansible/ansible/issues/13343#issuecomment-160992631

hostvarsは辞書をエミュレートします[...]。 hostvarsも遅延ロードされます

2
ynux

このメモは私にとって非常に役に立ちました!以下に示すように、ansible Playbookの/ group_var/varsで定義された変数を送信できました。

タスク:
-name:サービスアカウントのパスワードの有効期限を確認します
-コマンド:

sh /home/monit/get_ldap_attr.sh {{ item }} {{ LDAP_AUTH_USR }}
1
Kumaran M

また、hostsvarsに対処するための素敵で簡単な方法を見つけました AnsibleのGithubの問題の1つについて

これもできるように見えます:

 - debug:
    msg: "{{ ansible_ssh_Host }}"
0
Michael