クラウドサーバーインスタンスをスピンするためのLinodeプレイブックは次のとおりです。
---
- hosts: 127.0.0.1
connection: local
tasks:
- name: Create Linode Machine
linode:
api_key: 'blablabla'
name: test
plan: 1
datacenter: 7
distribution: 124
password: 'blabla'
swap: 768
wait: yes
wait_timeout: 600
state: started
register: result
これを行うと、インスタンスが作成されますが、出力からIPを取得して別のプレイブックに渡し、ビルドを完全に自動化できない場合、これはそれほど大きな利点ではありません。
上記を実行すると、モジュールは何も出力しませんが、-vオプションを指定してプレイブックを実行すると、次の出力が報告されていることがわかります。どうすればこれを取得できますか
changed: [127.0.0.1] => {"changed": true, "instance": {"fqdn": "xxxx.members.linode.com", "id": 2342234, "ipv4": "185.x.x.x", "name": "1902695_test", "password": "blabla", "private": [], "public": [{"fqdn": "xxxx.members.linode.com", "ip_id": 324324, "ipv4": "185.x.x.x"}], "status": "Running"}}
Ipv4を変数に保存して、別のプレイブックなどで使用するにはどうすればよいですか?
編集:与えられた答えをテストするために、上記のコードの下に次のコードを追加しましたが、機能しませんでした:
- hosts: "{{ result['instance']['ipv4'] }}"
remote_user: root
tasks:
- name: "test"
command: ls -la
- apt: upgrade=dist update_cache=yes
次のエラーメッセージが表示されます。
ERROR! 'result' is undefined
Set_factも試しましたが、それも機能しませんでした。
任意のタスクの出力を変数として登録する 次のようにできます:
- name: Create Linode Machine
linode:
api_key: 'blablabla'
...
register: result
これで、タスクの結果が変数result
に保存され、result['instance']['ipv4']
を介してIPにアクセスできるようになります。
そうでない場合は、デバッグモジュールが友だちであり、変数の内容を調べることができます。
- debug: var=result
現在の実行の一部ではない別のプレイブックで本当に利用できるようにしたい場合は、 fact-caching がオプションになる可能性があります。ファクトキャッシングを有効にすると、set_fact
を使用できます。
- set_fact:
myInstanceIp: "{{ result['instance']['ipv4'] }}"
もう1つの問題は、変数/ファクトがホストごとに保存されることです。上記の場合、localhostの変数を保存しました。したがって、ローカルホストのコンテキストで実行されるタスクでのみ直接使用できます。
ただし、プレイブックのホストセクションは、どのホストのコンテキストでも評価されないため、この変数に直接アクセスすることはできません。
3つの可能なオプションがあります。
1)ローカルホストでも2回目の再生を実行してから、タスクを別のホストに委任します。これで、タスクはlocalhostのコンテキストで実行されるため、登録済みのresult
にアクセスできるはずです。
- hosts: localhost
delegate_to: "{{ result['instance']['ipv4'] }}"
remote_user: root
tasks:
...
docsdelegate_to
によると、タスクで機能しますが、プレイレベルでも機能するはずであり、含まれているすべてのタスクに渡されます。そうでない場合は、すべてのタスクに追加する必要があります。
- hosts: localhost
remote_user: root
tasks:
- name: "test"
command: ls -la
delegate_to: "{{ result['instance']['ipv4'] }}"
- apt: upgrade=dist update_cache=yes
delegate_to: "{{ result['instance']['ipv4'] }}"
2)localhostのコンテキストで実行されていなくても、 hostvars dict を介して関連する変数にアクセスできるはずです。
- hosts: "{{ hostvars['localhost']['result']['instance']['ipv4'] }}"
remote_user: root
...
3) add_Host module :を使用して新しいグループを動的に作成します。
- add_Host:
name: "{{ result['instance']['ipv4'] }}"
groups: just_created
そして、次のプレイでグループjust_created
を使用します。
- hosts: just_created
tasks: ...