How can I set_fact based on a "registered" result?

ansible-playbook 2.3.0.0
python version = 2.7.12

I’m trying to set some facts based on the user-data given for an EC2 instance:

`

  • name: Initialization
    hosts: localhost
    connection: local
    tasks:
  • name: Get userdata
    uri:
    url: http://169.254.169.254/latest/user-data
    return_content: yes
    register: metadata
  • name: Set userdata fact
    set_fact:
    userdata: “{{ metadata.content | from_yaml }}”
  • debug:
    var: userdata
    `

which returns:

TASK [debug] *************************************************************************************************************************************************************** ok: [localhost] => { "changed": false, "userdata": "nx-app=web nx-name=my.hostname.net nx-state=standby nx-system=prod nx-version=01" }

But I’m having trouble pulling the userdata. out:

`

  • name: Set facts needed from userdata
    set_fact:
    system: “{{ userdata.nx-system }}”
    version: “{{ userdata.nx-version }}”
    app: “{{ userdata.nx-app }}”
    state: “{{ userdata.nx-state }}”
    name: “{{ userdata.nx-name }}”
    `

TASK [Set facts needed from userdata] ***************************************************************************************************************** fatal: [localhost]: FAILED! => {"failed": true, "msg": "the field 'args' has an invalid value, which appears to include a variable that is undefined. The error was: 'unicode object' has no attribute 'nx'\n\nThe error appears to have been in 'data.yml': line 21, column 7, but may\nbe elsewhere in the file depending on the exact syntax problem.\n\nThe offending line appears to be:\n\n\n - name: Set facts needed from userdata\n ^ here\n"}

What am I missing? I’ve tried several things but haven’t hit on the solution so I’m open to any suggestions.

ansible-playbook 2.3.0.0
python version = 2.7.12

I'm trying to set some facts based on the user-data given for an EC2
instance:

- name: Initialization
   hosts: localhost
   connection: local
   tasks:
     - name: Get userdata
       uri:
         url: http://169.254.169.254/latest/user-data
         return_content: yes
       register: metadata
     - name: Set userdata fact
       set_fact:
         userdata: "{{ metadata.content | from_yaml }}"
     - debug:
         var: userdata

which returns:

TASK [debug]
***************************************************************************************************************************************************************
ok: [localhost] => {
     "changed": false,
     "userdata": "nx-app=web nx-name=my.hostname.net nx-state=standby
nx-system=prod nx-version=01"
}

This show that userdata is a string.

But I'm having trouble pulling the userdata.<value> out:

     - name: Set facts needed from userdata
       set_fact:
         system: "{{ userdata.nx-system }}"
         version: "{{ userdata.nx-version }}"
         app: "{{ userdata.nx-app }}"
         state: "{{ userdata.nx-state }}"
         name: "{{ userdata.nx-name }}"

Since userdata is a string it's not possible to use array syntax.

What am I missing? I've tried several things but haven't hit on the
solution so I'm open to any suggestions.

What is the output of
- debug: var=metadata.content

Yep, realized I was trying to parse it as JSON, or YAML very much incorrectly…

I have a solution now, though it’s quite ugly and requires replacing a character and splitting on newlines…

`

  • name: Get userdata
    uri:
    url: http://169.254.169.254/latest/user-data
    return_content: yes
    register: rawdata
  • name: Replace hyphen with undserscore since hyphens are not valid in python variables
    set_fact:
    metadata: “{{ rawdata | replace(‘-’,‘_’) }}”
  • name: Set userdata fact
    set_fact:
    userdata: “{{ metadata.content.split(‘\n’) }}”
  • set_fact:
    “{{ item.split(‘=’)[0] }}”: “{{ item.split(‘=’)[1] }}”
    with_items: “{{ userdata }}”
    `