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

3,647 views
Skip to first unread message

Dayton Jones

unread,
Sep 6, 2017, 12:14:10 PM9/6/17
to Ansible Project
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.<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 }}"


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.

Kai Stian Olstad

unread,
Sep 6, 2017, 1:07:41 PM9/6/17
to ansible...@googlegroups.com
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


--
Kai Stian Olstad

Dayton Jones

unread,
Sep 6, 2017, 1:39:37 PM9/6/17
to Ansible Project, ansible-pr...@olstad.com
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 }}"
Reply all
Reply to author
Forward
0 new messages