さまざまなホストでさまざまな役割を実行するプレイブックがあります。あるホストで実行されている1つの役割から、同じプレイブックの実行内で実行されている別のホストの別の役割に変数を渡すことはできますか?または回避策はありますか?
playbook
Host1
role1
here I get some variables: var1 var2 ...etc
Host2
role2
here I need to use var1 var2 ... etc from the above Host/role
変数db
を設定するrole1のタスクは次のようになります。
- Shell: cd /ACE/conf && grep ^db.url local1.properties | awk -F/ '{print $4}' | awk -F? '{print $1}'
register: db
更新:最初のホストの値は動的で、常に更新される構成ファイルのようなものです。 Host1の変数にrole1を使用して値を格納した後、Host2に移動し、role2を実行して、Host1によって格納された変数の値を使用して作業を行います。
私はhostvarsで試しました:
{{ hostvars.LBL.db.stdout }}
{{ hostvars['LBL']['db'] }}
{{ hostvars['LBL']['db']['stdout'] }}
そして私はエラーが出ます:
in get_variables raise Exception("Host not found: %s" % hostname) Exception: Host not found: LBL
LBLはホスト上に存在し、最初のロールを実行します
あるホストに変数を設定し、その変数を他のホストで使用できるようにしたい。これらすべてが1つのプレイブック内にあります。できますか?
hostvarsは次のように使用していません。
---
- name: test hostvars Host1
hosts: LBL
tasks:
- command: "ls /bin"
register: ls_out
- name: test hostvars Host2
hosts: LM
tasks:
- debug:
var: "{{ hostvars['LBL']['ls_out']['stdout'] }}"
エラー:
fatal: [10.104.148.138] => Host not found: LBL
/ etc/ansible/hosts
[root@NS1 ansible]# cat /etc/ansible/hosts
[LBL]
10.104.148.136
[LM]
10.104.148.138
問題は在庫にあります。
このメッセージ:
fatal: [10.104.148.138] => Host not found: LBL
LBL
はグループではなくホストであるためです。グループLBL
には1つのホストがあります:10.104.148.136
次のいずれかを実行します。
1.在庫を変更します(/etc/ansible/hosts
)から:
LBL ansible_ssh_Host=10.104.148.136
LM ansible_ssh_Host=10.104.148.138
2.または、あなたが何をしているかを本当に知っていて、LBL
がグループであり、それをそのまま保持したい場合は、次のようにして変数にアクセスします。
{{ hostvars['10.104.148.136']['db']['stdout'] }}
ここでも、LBLはホストではなくグループです。 詳細 。
このトピックは複雑で、目的に応じて2つの異なる答えがあります。
例:
---
- hosts: Host1
- roles:
- role1
- role2
目標:role2内のrole1から変数にアクセスしたい。
使用する set_fact
モジュール。
内部の役割1:
name: save precious value
set_fact:
pantsu: shiroi
役割2の内部:
name: Nozoki...
debug: msg="Color is {{ pantsu }}"
例:
[group_foo]
Host1
Host2
[group_bar]
Host3
Host4
group_vars/group_foo
important_value=bla-bla-ba
目標:グループ2のプレイブックで使用したい。
これは行うのがはるかに難しいです。
Group_vars/group_barの内部
other_var: '{{hostvars[groups["group_foo"][0]].important_value}}'
「0」以外のインデックスを使用できます。
これが私の解決策です。私のタスクは2つのサーバー間でデータを同期することでした、そして次のようなサーバー名を渡したかったです:ansible-playbook sync.yaml -e "source = Host1 destination = Host2"
主なプレイブックは次のとおりです。
---
- name: get_sync_facts
hosts: "{{ source }}"
roles:
- set_sync_facts
- name: sync
hosts: "{{ destination }}"
roles:
- get_sync_facts
- sync
次に、set_sync_factsロールを示します。
---
- set_fact: src_media_dir='/some/dir/'
- set_fact: src_user='myuser'
- set_fact: src_Host='1.1.1.1'
- set_fact: src_port=12345
- set_fact: src_db_user='dbuser'
- set_fact: src_db_password='something'
- set_fact: src_db_name='some_db'
(私は実際にこれらのいくつかをタスクから、他のものをホスト変数から導出しましたが、あなたは要点を得ます)
そしてここにget_sync_factsロールがあります:
---
- set_fact: src_media_dir={{ hostvars[source]['src_media_dir'] }}
- set_fact: src_user={{ hostvars[source]['src_user'] }}
- set_fact: src_Host={{ hostvars[source]['src_Host'] }}
- set_fact: src_port={{ hostvars[source]['src_port'] }}
- set_fact: src_db_user={{ hostvars[source]['src_db_user'] }}
- set_fact: src_db_password={{ hostvars[source]['src_db_password'] }}
- set_fact: src_db_name={{ hostvars[source]['src_db_name'] }}
これを使用せずに、プレイで直接ホスト変数を参照することもできますが、set_sync_factsロールに直接対応しているため、これは維持しやすいように見えました。
それはかなり古いトピックですが、多分誰かに役立つでしょう。 sedを使用して、追加のパラメーターで指定された「ターゲット」に基づいてホスト名を取得しました。
この「ターゲット」グループを使用するには、ホスト名を1つだけ含める必要があります。
私の在庫ホスト:
[ansible_local]
localhost
[machine1]
machine1.domain.tld
upgrade_packages.yml
---
- hosts: '{{ target }}'
Sudo: yes
tasks:
- name: check for Debian system
Shell: /bin/false
when: ansible_pkg_mgr != "apt"
- name: full-upgrade all packages
apt: update_cache=yes upgrade=full
register: upgrade_result
- hosts: ansible_local
tasks:
- name: find out Host from target
Shell: /bin/sed -n -e '/^\[{{ target }}\]$/,/^\[.*\]$/ { /^\[/d; /^$/d; p; }' {{ inventory_file }}
register: target_inventory
- name: Display all facts from target machine (change when to true if needed)
debug: var=hostvars[target_inventory.stdout]
when: false
- name: Display upgrade result on ansible_local node
debug: var=hostvars[target_inventory.stdout].upgrade_result.msg
呼び出し元:ansible-playbook ./upgrade-packages.yml -e "target=machine1" -v
私は3つのホストh1、h2、h3があり、それぞれにファクト{ "important_fact": "foo" }
(およびそれぞれbarおよびbaz)を定義したいという同様の設定をしました。
すべてのホスト上のすべての異なる重要な事実を含むリストを取得するには、次のようにします。
- set_fact:
important_facts_list: "{{ hostvars | json('*.important_fact') }}"
run_once: yes
delegate_to: h1
important_facts_list
には[ 'foo', 'bar', 'baz' ]
が含まれ、with_items
を使用してそれらを反復処理できるようになります。