如何从一个模块中提取特定的数据,以便在另一个主机下使用

这里是一个Linode手册,用于创build云服务器实例:

--- - 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 

如果我这样做,实例会被创build,但是如果我不能从输出中获得一个ip传递给另一个剧本,并且完全自动化一个构build,那么这个优势就没有那么大了。

当您运行上面的模块时,不会输出任何内容,但是如果使用-v选项运行playbook,则可以看到报告了以下输出。 我怎样才能获取这个

 changed: [127.0.0.1] => {"changed": true, "instance": {"fqdn": "xxxx.members.linode.com", "id": 2342234, "ipv4": "185.xxx", "name": "1902695_test", "password": "blabla", "private": [], "public": [{"fqdn": "xxxx.members.linode.com", "ip_id": 324324, "ipv4": "185.xxx"}], "status": "Running"}} 

我怎样才能将ipv4保存到另一个剧本或任何其他使用的variables?

编辑:我已经添加了下面的代码以testing给出的答案,但它没有奏效:

 - 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,也没有工作。

您可以将任何任务的输出注册为variables,如下所示:

 - name: Create Linode Machine linode: api_key: 'blablabla' ... register: result 

现在,您将任务结果存储在variablesresult并且应该能够通过result['instance']['ipv4']访问IP。

如果没有,debugging模块是你的朋友,你可以检查variables的内容:

 - debug: var=result 

如果你真的想把它提供给另一个不属于当前执行的剧本, 事实caching可能是你的select。 启用事实caching后,您可以使用set_fact

 - set_fact: myInstanceIp: "{{ result['instance']['ipv4'] }}" 

另一个复杂因素是每个主机都存储variables/事实。 在上面的情况下,你存储了localhost的variables。 所以它只能直接在本地主机上运行的任务上使用。

剧本的主机部分虽然不在任何主机的上下文中进行评估,所以不能直接访问这个variables。

我看到三个可能的select:

1)在本地主机上执行第二次播放,然后委托任务到另一台主机。 由于现在任务是在localhost的上下文中执行的,你应该可以访问注册的result

 - hosts: localhost delegate_to: "{{ result['instance']['ipv4'] }}" remote_user: root tasks: ... 

根据文档, delegate_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)即使不在本地环境中执行,您应该可以通过hostvars字典访问相关的variables :

 - hosts: "{{ hostvars['localhost']['result']['instance']['ipv4'] }}" remote_user: root ... 

3)用add_host模块dynamic创build一个新组:

 - add_host: name: "{{ result['instance']['ipv4'] }}" groups: just_created 

然后在下一个游戏中使用just_created组:

 - hosts: just_created tasks: ...