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

如何从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 但是也没有用。

答案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: ...

相关内容