長い間立ち往生しているダミーの疑いがあります。ホストと変数を含む非常に平凡なインベントリファイルがあります。
[lb]
10.112.84.122
[Tomcat]
10.112.84.124
[jboss5]
10.112.84.122
...
[tests:children]
lb
Tomcat
jboss5
[default:children]
tests
[tests:vars]
data_base_user=NETWIN-4.3
data_base_password=NETWIN
data_base_encrypted_password=
data_base_Host=10.112.69.48
data_base_port=1521
data_base_service=ssdenwdb
data_base_url=jdbc:Oracle:thin:@10.112.69.48:1521/ssdenwdb
問題は、group_vars/allファイルから、インベントリファイル内のこれらすべてのホストと変数にアクセスする必要があることです。
ホストIPにアクセスするために次の方法を試しました。
{{ lb }}
"{{ hostvars[lb] }}"
"{{ hostvars['lb'] }}"
{{ hostvars[lb] }}
私が試したホスト変数にアクセスするには:
"{{ hostvars[tests].['data_base_Host'] }}"
それらはすべて間違っています!!!プレイブックではなく変数ファイルからホストと変数にアクセスするためのベストプラクティスを見つけるのを手伝ってくれる人はいますか?
編集:
OK。明確にしましょう。
問題:変数ファイルのインベントリファイルで宣言されたホストを使用します。たとえば、group_vars/allです。
例:IP:10.112.83.37
のDBホストがあります。
インベントリファイル:
[db]
10.112.83.37
Group:vars/allファイルで、そのIPを使用して変数を作成します。
group_vars/allファイル:
data_base_url=jdbc:Oracle:thin:@{{ db }}:1521/ssdenwdb
テンプレートでは、group_vars/allファイルに組み込まれた変数を使用します。
テンプレートファイル:
Oracle_url = {{ data_base_url }}
問題は、group_vars/allファイルの{{ db }}
変数がDBホストIPに置き換えられないことです。ユーザーはインベントリファイルのみを編集できます。
- name: Host
debug: msg="{{ item }}"
with_items:
- "{{ groups['tests'] }}"
このコードは次のメッセージを表示します。
'10.112.84.122'
'10.112.84.124'
なので groups['tests']
基本的に一意のIPアドレスのリストを返します['10.112.84.122','10.112.84.124']
に対してgroups['Tomcat'][0]
返却値 10.112.84.124
。
プログラムでインベントリエントリにアクセスして、たとえばタスクに含める場合。次のように参照できます。
{{ hostvars.Tomcat }}
これにより、そのホストに関連するすべての変数を含む構造体が返されます。 IPアドレス(またはホスト名)だけが必要な場合は、次のように参照できます。
{{ hostvars.jboss5.ansible_ssh_Host }}
参照できる変数のリストは次のとおりです。 click 。さらに、変数を宣言して、たとえば、プレイブックのいくつかのステップの結果で変数を設定できます。
- name: Change owner and group of some file
file: path=/tmp/my-file owner=new-owner group=new-group
register: chown_result
次に、このステップをTomcat
で再生すると、jboss5
このような:
- name: Print out the result of chown
debug: msg="{{ hostvars.Tomcat.chown_result }}"
念のため、問題がまだある場合は、‘hostvars’
、‘group_names’
、および‘groups’
可能な変数。
例:
グループ「mygroup」内のすべてのサーバーのIPアドレスを取得できるようにするには、以下の構成を使用します。
- debug: msg="{{ hostvars[item]['ansible_eth0']['ipv4']['address'] }}"
with_items:
- "{{ groups['mygroup'] }}"
はい、nixlikeの例は非常にうまく機能します。
在庫:
[docker-Host]
myhost1 user=barbara
myhost2 user=heather
プレイブック:
---
- hosts: localhost
connection: local
tasks:
- name: loop debug inventory hostnames
debug:
msg: "the docker Host is {{ item }}"
with_inventory_hostnames: docker-Host
- name: loop debug items
debug:
msg: "the docker Host is {{ hostvars[item]['user'] }}"
with_items: "{{ groups['docker-Host'] }}"
出力:
ansible-playbook ansible/tests/vars-test-local.yml
PLAY [localhost]
タスク[セットアップ] ************************************************* ********************* OK:[localhost]
タスク[ループデバッグインベントリのホスト名] ****************************************** ok :[localhost] =>(item = myhost2)=> {"item": "myhost2"、 "msg": "ドッカーホストはmyhost2"} ok:[localhost] =>(item = myhost1)=> {" item ":" myhost1 "、" msg ":"ドッカーホストはmyhost1 "}
タスク[ループデバッグ項目] *********************************************** ************ ok:[localhost] =>(item = myhost1)=> {"item": "myhost1"、 "msg": "ドッカーホストはbarbara"} ok:[ localhost] =>(item = myhost2)=> {"item": "myhost2"、 "msg": "ドッカーホストはヒース"}
PLAY RECAP *************************************************** ********************* localhost:ok = 3 changed = 0 unreachable = 0
failed = 0
ありがとう!
前の例を考えてみましょう:
インベントリファイル:
[db]
10.112.83.37
group_vars/all
data_base_url=jdbc:Oracle:thin:@{{ db }}:1521/ssdenwdb
テンプレートファイル:
Oracle_url = {{ data_base_url }}
Group_vars/allを次のように置き換えることができます。
data_base_url="jdbc:Oracle:thin:@{{ groups['db'][0] }}:1521/ssdenwdb"