Ansible返回值 - 需要IP地址第2部分

时间:2016-07-26 05:27:45

标签: yaml ansible return-value ansible-playbook

这个问题引用了这个主题:Ansible Return Value - Need IP Adress

我的回答被删除所以他们告诉我我需要为它开一个新话题...不知道为什么但是没关系。

所以我的问题提到了Eric Citaire的回答:

感谢您的快速反应,我尝试了它,我对输出感到有点困惑。

所以这是我的档案:

 - os_server:
  state: present
   flavor: m1.nano
   auth:
     auth_url: ****
     username: ****
     password: ****
     project_name: admin
     domain_id: ****
   name: ansibletest
   region_name: RegionOne   
   image: 4e7ab5c8-4b39-4c77-b68d-cf2ea7e1df1a
   key_name: ansible
   timeout: 200
   nics:
     - net-id: a5a73ab9-3ee5-49a6-bea0-f44f9e376ca0
   auto_ip: yes  
   register: result    
- debug: var=result

我得到以下输出:

>root@ansible1:~/HP# ansible-playbook -i Inventory playbook.yml

>PLAY ***************************************************************************

>TASK [setup] ******************************************************************* ok: [172.20.22.21]

>TASK [openstack : os_server] *************************************************** fatal: [172.20.22.21]: FAILED! => {"changed": false, "failed": true, "msg": "unsupported parameter for module: register"}

>PLAY RECAP ********************************************************************* 172.20.22.21 : ok=1 changed=0 unreachable=0 failed=1
你可以帮帮我吗? PS:****表示有内容你最好不要看^^

编辑自2017年7月27日:

所以我现在正在使用它,结果现在是“var”,我看到了一个输出。 首先,这里是更新的手册:

    - name: create a server
  os_server:
    state: present
    flavor: m1.nano
    auth:
      auth_url: ****
      username: ****
      password: ****
      project_name: admin
      domain_id: ****
    name: ansibletest
#   region_name: RegionOne
    image: 4e7ab5c8-4b39-4c77-b68d-cf2ea7e1df1a
    key_name: ansible
    timeout: 200
    auto_ip: yes
    nics:
      - net-id: a5a73ab9-3ee5-49a6-bea0-f44f9e376ca0    
  register: result
- debug: var=result

我得到的结果就像这样:

TASK [openstack : debug] *******************************************************
ok: [172.20.22.21] => {
    "result": {
        "changed": false,
        "id": "6f40f396-7ef8-4e0e-9769-2b9cea898269",
            .........
            "accessIPv4": "172.20.22.58",
            .......
                    {
                        ..........
                    },
                    {
                        ............
                        "addr": "172.20.22.58",
                        ......
                    }
                ]
            },
            ........
            },
            "interface_ip": "172.20.22.58",
            .................
                    .............
                ]
            },
            "os-extended-volumes:volumes_attached": [],
            "private_v4": "10.0.100.92",
            "progress": 0,
            "public_v4": "172.20.22.58",
            ................
                {
                   ...........
    }
}

所以,因为我得到这个looong输出它没那么多有用。我只需要IP地址(在这种情况下是172.20.22.58) - 是否有可能“过滤”输出或像这样? 请帮助我:/

2 个答案:

答案 0 :(得分:2)

您的格式略有偏差,但基本上register不是任务的参数,而是在任务级别。这就是我的意思。

坏:

- name: create a server
  os_server:
    state: present
    flavor: m1.nano
    auth:
      auth_url: ****
      username: ****
      password: ****
      project_name: admin
    register: result

好:

- name: create a server
  os_server:
    state: present
    flavor: m1.nano
    auth:
      auth_url: ****
      username: ****
      password: ****
      project_name: admin
  register: result

请注意它与os_server处于同一级别,而不是os_server的参数

编辑 - 返回值

有两种方法可以获得结果。首先是在其他地方使用{{result.id. accessIPv4}},另一个是使用带有它的set_fact。如果你需要另一个角色的IP,那么这一点特别有用,并且可以很好地处理元依赖。

- set_fact: machine_ip="{{result.id.accessIPV4}}"

答案 1 :(得分:1)

使用Ansible时,输出为 JSON 。因此,基本上您会将输出视为json并使用{}[]访问其键/值。

在您的示例中,您必须告诉我们输出的正确结构。但无论如何,我们假设avcessIPv4result的第一级孩子,你的大对象,你想要访问它:

所以注册result变量后:

- register: result

您可以访问其子女

- debug: msg="{{ result.accessIPv4 }}" 

此外,您可以在注册输出后定义变量,这是一种Ansible最佳实践,这样:

- set_fact: server_IP="{{ result.accessIPv4 }}"