Luis Peñafiel
Luis Peñafiel

Reputation: 91

How to separate character from stdout into variables

I have the following output in stdout of register output:

“server1,Running\nserver2,Running\nserver3,Not Activated\nserver4,Not Activated”

I want to create a list of just the Not Activated server:

vmoff:
  - name: server3
  - name: server4

Also I have following output in stdout:

“server1,0.5\nserver2,0.7\nserver3,1.0\nserver4,0.5\n”

I want to turn into the following:

vmlist:
  - name: server1
    proc: 0.5
  - name: server2
    proc: 0.7
  - name: server3
    proc: 1.0
  - name: server4
    proc: 0.5

Upvotes: 2

Views: 3876

Answers (1)

Vladimir Botka
Vladimir Botka

Reputation: 68004

Given the registered stdout

reg:
  stdout: server1,Running\nserver2,Running\nserver3,Not Activated\nserver4,Not Activated

Create a dictionary

vm_all: "{{ dict(reg.stdout|
                 split('\\n')|
                 select()|
                 map('split', ',')|
                 list) }}"

gives

vm_all:
  server1: Running
  server2: Running
  server3: Not Activated
  server4: Not Activated

Now, select the not activated servers and map the attribute name

vm_not_activated: "{{ vm_all|dict2items(key_name='name', value_name='status')|
                      selectattr('status', 'eq', 'Not Activated')|
                      map(attribute='name')|
                      list }}"

gives the list

vm_not_activated:
  - server3
  - server4

If you need the dictionaries, add the filter community.general.dict_kv to the pipe

vm_not_activated: "{{ vm_all|dict2items(key_name='name', value_name='status')|
                      selectattr('status', 'eq', 'Not Activated')|
                      map(attribute='name')|
                      map('community.general.dict_kv', 'name')|
                      list }}"

gives

vm_not_activated:
  - name: server3
  - name: server4

Similarly, given the registered stdout

reg:
  stdout: server1,0.5\nserver2,0.7\nserver3,1.0\nserver4,0.5\n

Create a dictionary

vmdict: "{{ dict(reg.stdout|
                 split('\\n')|
                 select()|
                 map('split', ',')|
                 list) }}"

gives

vmdict:
  server1: '0.5'
  server2: '0.7'
  server3: '1.0'
  server4: '0.5'

Now, create the list

vmlist: "{{ vmdict|dict2items(key_name='name', value_name='proc') }}"

gives

vmlist:
  - name: server1
    proc: '0.5'
  - name: server2
    proc: '0.7'
  - name: server3
    proc: '1.0'
  - name: server4
    proc: '0.5'

Upvotes: 1

Related Questions