web-dev-qa-db-ja.com

ansible runグローバル変数

Ansibleを使用して、サーバーのクラスターを作成したいと思います。

1つのメインプレイブックに、いくつかのサブプレイブックを含めています。

- include: playbook_commandserver.yml
- include: playbook_agent.yml

Playbook_commandserver.ymlで、(aws上に)コマンドサーバーを作成します。次に、set_factモジュールを使用してコマンドサーバーのDNS名を記憶するロールをトリガーします。

- name: Get hostname of command server
  Shell: /usr/bin/Host $(/usr/bin/curl -s http://ipecho.net/plain) | /usr/bin/awk '{print $5}' | /usr/bin/awk -F 'aws.com' '{print $1"aws.com"}'
  register: cs
- name: Set hostname of command server as fact
  set_fact: commandserver="{{ cs.stdout }}"

commandserverファクトは同じプレイで利用できますが、同じプレイブックでは利用できません。後でplaybook_agent.ymlに含まれていることは言うまでもありません。そして、それはまさにそこにあり、そこでcommandserver-factにアクセスする必要があります。

では、完全なansible-runに有効な変数をどのように設定/保存するのでしょうか。

私はこれを見つけました: https://stackoverflow.com/questions/26732241/ansible-save-registered-variable-to-file しかし、私にはこれは醜いハックのように見えます。

この問題に対するより良い解決策はありませんか?変数を設定する方法はありません。それはansible-run全体に有効ですか?

8
doh-nutz

はい、可能です。 set_fact モジュール、この事実は「hostvars」を介してアクセスできます。したがって、変数commandserverを次のように定義すると、

  - name: Set hostname of command server as fact
    set_fact: commandserver="{{ cs.stdout }}"

その後、同じ方法で含まれている他のプレイブックでこの変数にこの方法でアクセスできます(デバッグモジュールは単なる例です)。

  - debug: msg="{{ hostvars['put the hostname in here']['commandserver'] }}"
12
A.Hab