私は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'"}
あなたは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 }}
[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 }}
変数名を直接使用できるはずです
ansible_ssh_Host
または、 magic variableinventory_hostname
を使用して、文字通りホストを指定することなくhostvarsを経由することができます
hostvars[inventory_hostname].ansible_ssh_Host
私もこれに苦労しました。私の具体的なセットアップは次のとおりです。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も遅延ロードされます
このメモは私にとって非常に役に立ちました!以下に示すように、ansible Playbookの/ group_var/varsで定義された変数を送信できました。
タスク:
-name:サービスアカウントのパスワードの有効期限を確認します
-コマンド:
sh /home/monit/get_ldap_attr.sh {{ item }} {{ LDAP_AUTH_USR }}
また、hostsvarsに対処するための素敵で簡単な方法を見つけました AnsibleのGithubの問題の1つについて
これもできるように見えます:
- debug:
msg: "{{ ansible_ssh_Host }}"