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全体に有効ですか?
はい、可能です。 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'] }}"