web-dev-qa-db-ja.com

同じプレイブック内の1つのロール(1つのホストで実行されている)から別のホストで実行されている別のロールにAnsible変数を渡す

さまざまなホストでさまざまな役割を実行するプレイブックがあります。あるホストで実行されている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

[[email protected] ansible]# cat /etc/ansible/hosts
[LBL]
10.104.148.136
[LM]
10.104.148.138
9
ady8531

問題は在庫にあります。

このメッセージ:

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はホストではなくグループです。 詳細

6
Kashyap

このトピックは複雑で、目的に応じて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」以外のインデックスを使用できます。

12
George Shuklin

これが私の解決策です。私のタスクは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ロールに直接対応しているため、これは維持しやすいように見えました。

2
Andy Baker

それはかなり古いトピックですが、多分誰かに役立つでしょう。 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

1
Quoing

私は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を使用してそれらを反復処理できるようになります。

0