web-dev-qa-db-ja.com

別のホストで使用するためにansibleのモジュールから特定のデータをフェッチする方法

クラウドサーバーインスタンスをスピンするための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も試しましたが、それも機能しませんでした。

2
Ulukai

任意のタスクの出力を変数として登録する 次のようにできます:

- 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: ...
2
udondan