以下是 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 但是也没有用。
答案1
你可以将任何任务的输出注册为变量像这样:
- name: Create Linode Machine
linode:
api_key: 'blablabla'
...
register: result
现在您已将任务结果存储在变量中result
,并且应该能够通过 访问 IP result['instance']['ipv4']
。
如果没有,调试模块就是您的朋友,您可以检查变量的内容:
- debug: var=result
如果你真的想让它可用于不属于当前执行的另一个剧本,事实缓存可能是您的一个选择。启用事实缓存后,您可以使用set_fact
:
- set_fact:
myInstanceIp: "{{ result['instance']['ipv4'] }}"
另一个复杂因素是变量/事实是按主机存储的。在上述情况下,您存储了 localhost 的变量。因此,它只能在 localhost 上下文中运行的任务上直接可用。
但是,剧本的主机部分并未在任何主机的上下文中进行评估,因此您无法直接访问此变量。
我认为有三种可能的选择:
1) 在本地主机上执行第二个 play,然后将任务委托给另一台主机。由于现在任务是在本地主机上下文中执行的,因此您应该能够访问已注册的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)即使没有在 localhost 上下文中执行,您也应该能够通过以下方式访问相关变量:主机变量字典:
- hosts: "{{ hostvars['localhost']['result']['instance']['ipv4'] }}"
remote_user: root
...
3)动态创建一个新组add_host 模块:
- add_host:
name: "{{ result['instance']['ipv4'] }}"
groups: just_created
然后just_created
在下一个游戏中使用该组:
- hosts: just_created
tasks: ...