Skip to content

Instantly share code, notes, and snippets.

@sivel
Last active February 4, 2020 22:12
Show Gist options
  • Star 4 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save sivel/4c2740abc4a6c9fd254f5ec87db38187 to your computer and use it in GitHub Desktop.
Save sivel/4c2740abc4a6c9fd254f5ec87db38187 to your computer and use it in GitHub Desktop.
Ansible playbook showcasing conversion from with_X loops to loop using filters instead of lookup
---
- name: Playbook showcasing conversion from with_X loops to loop+filters
hosts: localhost
gather_facts: false
vars:
items:
-
- foo
-
- bar
list:
- foo
- bar
together:
one:
- foo
- bar
two:
- baz
- qux
dictionary:
foo: bar
baz: qux
list_one:
- 1
- 2
- 3
list_two:
- a
- b
list_three:
- orange
- apple
- banana
users:
- name: alice
authorized:
- /tmp/alice/onekey.pub
- /tmp/alice/twokey.pub
mysql:
password: mysql-password
hosts:
- "%"
- "127.0.0.1"
- "::1"
- "localhost"
privs:
- "*.*:SELECT"
- "DB1.*:ALL"
groups:
- wheel
- name: bob
authorized:
- /tmp/bob/id_rsa.pub
mysql:
password: other-mysql-password
hosts:
- "db1"
privs:
- "*.*:SELECT"
- "DB2.*:ALL"
tasks:
- name: with_items
debug:
msg: "{{ item }}"
with_items: "{{ items }}"
tags: items
- name: with_items -> loop
debug:
msg: "{{ item }}"
loop: "{{ items|flatten(levels=1) }}"
tags: items
- name: with_indexed_items
debug:
msg: "{{ item.0 }} - {{ item.1 }}"
with_indexed_items: "{{ items }}"
tags: indexed_items
- name: with_indexed_items -> loop
debug:
msg: "{{ index }} - {{ item }}"
loop: "{{ items|flatten(levels=1) }}"
loop_control:
index_var: index
tags: indexed_items
- name: with_flattened
debug:
msg: "{{ item }}"
with_flattened: "{{ items }}"
tags: flatten
- name: with_flattened -> loop
debug:
msg: "{{ item }}"
loop: "{{ items|flatten }}"
tags: flatten
- name: with_list
debug:
msg: "{{ item }}"
with_list: "{{ list }}"
tags: list
- name: with_list -> loop
debug:
msg: "{{ item }}"
loop: "{{ list }}"
tags: list
- name: with_together
debug:
msg: "{{ item.0 }} - {{ item.1 }}"
with_together:
- "{{ together.one }}"
- "{{ together.two }}"
tags: together
- name: with_together -> loop
debug:
msg: "{{ item.0 }} - {{ item.1 }}"
loop: "{{ together.one|zip(together.two)|list }}"
tags: together
- name: with_dict
debug:
msg: "{{ item.key }} - {{ item.value }}"
with_dict: "{{ dictionary }}"
tags: dict
- name: with_dict -> loop (option 1)
debug:
msg: "{{ item.key }} - {{ item.value }}"
loop: "{{ dictionary|dict2items }}"
tags: dict
- name: with_dict -> loop (option 2)
debug:
msg: "{{ item.0 }} - {{ item.1 }}"
loop: "{{ dictionary|dictsort }}"
tags: dict
- name: with_sequence
debug:
msg: "{{ item }}"
with_sequence: start=0 end=4 stride=2 format=testuser%02x
tags: sequence
- name: with_sequence -> loop
debug:
msg: "{{ 'testuser%02x'|format(item) }}"
# range is exclusive of the end point
loop: "{{ range(0, 4 + 1, 2)|list }}"
tags: sequence
- name: with_subelements
debug:
msg: "{{ item.0.name }} - {{ item.1 }}"
with_subelements:
- "{{ users }}"
- mysql.hosts
tags: subelements
- name: with_subelements -> loop
debug:
msg: "{{ item.0.name }} - {{ item.1 }}"
loop: "{{ users|subelements('mysql.hosts') }}"
tags: subelements
- name: with_cartesian
debug:
msg: "{{ item.0 }} - {{ item.1 }} - {{ item.2 }}"
with_cartesian:
- "{{ list_one }}"
- "{{ list_two }}"
- "{{ list_three }}"
tags: cartesian
- name: with_cartesian -> loop
debug:
msg: "{{ item.0 }} - {{ item.1 }} - {{ item.2 }}"
loop: "{{ list_one|product(list_two, list_three)|list }}"
tags: cartesian
- name: with_nested
debug:
msg: "{{ item.0 }} - {{ item.1 }}"
with_nested:
- "{{ list_one }}"
- "{{ list_two }}"
tags: nested
- name: with_nested -> loop
debug:
msg: "{{ item.0 }} - {{ item.1 }}"
loop: "{{ list_one|product(list_two)|list }}"
tags: nested
- name: with_random_choice
debug:
msg: "{{ item }}"
with_random_choice: "{{ list }}"
tags: random
- name: with_random_choice -> loop (Wait! no loop is even needed here)
debug:
msg: "{{ list|random }}"
tags: random
Using /Users/matt/projects/ansibledev/playbooks/ansible.cfg as config file
PLAY [Playbook showcasing conversion from with_X loops to loop] ******************************************************************************************************************************************************************************
TASK [with_items] ****************************************************************************************************************************************************************************************************************************
ok: [localhost] => (item=None) => {
"msg": "foo"
}
ok: [localhost] => (item=None) => {
"msg": "bar"
}
TASK [with_items -> loop] ********************************************************************************************************************************************************************************************************************
ok: [localhost] => (item=None) => {
"msg": "foo"
}
ok: [localhost] => (item=None) => {
"msg": "bar"
}
TASK [with_indexed_items] ********************************************************************************************************************************************************************************************************************
ok: [localhost] => (item=None) => {
"msg": "0 - foo"
}
ok: [localhost] => (item=None) => {
"msg": "1 - bar"
}
TASK [with_indexed_items -> loop] ************************************************************************************************************************************************************************************************************
ok: [localhost] => (item=foo) => {
"index": 0,
"msg": "0 - foo"
}
ok: [localhost] => (item=bar) => {
"index": 1,
"msg": "1 - bar"
}
TASK [with_flattened] ************************************************************************************************************************************************************************************************************************
ok: [localhost] => (item=None) => {
"msg": "foo"
}
ok: [localhost] => (item=None) => {
"msg": "bar"
}
TASK [with_flattened -> loop] ****************************************************************************************************************************************************************************************************************
ok: [localhost] => (item=None) => {
"msg": "foo"
}
ok: [localhost] => (item=None) => {
"msg": "bar"
}
TASK [with_list] *****************************************************************************************************************************************************************************************************************************
ok: [localhost] => (item=None) => {
"msg": "foo"
}
ok: [localhost] => (item=None) => {
"msg": "bar"
}
TASK [with_list -> loop] *********************************************************************************************************************************************************************************************************************
ok: [localhost] => (item=None) => {
"msg": "foo"
}
ok: [localhost] => (item=None) => {
"msg": "bar"
}
TASK [with_together] *************************************************************************************************************************************************************************************************************************
ok: [localhost] => (item=None) => {
"msg": "foo - baz"
}
ok: [localhost] => (item=None) => {
"msg": "bar - qux"
}
TASK [with_together -> loop] *****************************************************************************************************************************************************************************************************************
ok: [localhost] => (item=None) => {
"msg": "foo - baz"
}
ok: [localhost] => (item=None) => {
"msg": "bar - qux"
}
TASK [with_dict] *****************************************************************************************************************************************************************************************************************************
ok: [localhost] => (item=None) => {
"msg": "foo - bar"
}
ok: [localhost] => (item=None) => {
"msg": "baz - qux"
}
TASK [with_dict -> loop (option 1)] **********************************************************************************************************************************************************************************************************
ok: [localhost] => (item=None) => {
"msg": "foo - bar"
}
ok: [localhost] => (item=None) => {
"msg": "baz - qux"
}
TASK [with_dict -> loop (option 2)] **********************************************************************************************************************************************************************************************************
ok: [localhost] => (item=None) => {
"msg": "baz - qux"
}
ok: [localhost] => (item=None) => {
"msg": "foo - bar"
}
TASK [with_sequence] *************************************************************************************************************************************************************************************************************************
ok: [localhost] => (item=None) => {
"msg": "testuser00"
}
ok: [localhost] => (item=None) => {
"msg": "testuser02"
}
ok: [localhost] => (item=None) => {
"msg": "testuser04"
}
TASK [with_sequence -> loop] *****************************************************************************************************************************************************************************************************************
ok: [localhost] => (item=None) => {
"msg": "testuser00"
}
ok: [localhost] => (item=None) => {
"msg": "testuser02"
}
ok: [localhost] => (item=None) => {
"msg": "testuser04"
}
TASK [with_subelements] **********************************************************************************************************************************************************************************************************************
ok: [localhost] => (item=None) => {
"msg": "alice - %"
}
ok: [localhost] => (item=None) => {
"msg": "alice - 127.0.0.1"
}
ok: [localhost] => (item=None) => {
"msg": "alice - ::1"
}
ok: [localhost] => (item=None) => {
"msg": "alice - localhost"
}
ok: [localhost] => (item=None) => {
"msg": "bob - db1"
}
TASK [with_subelements -> loop] **************************************************************************************************************************************************************************************************************
ok: [localhost] => (item=None) => {
"msg": "alice - %"
}
ok: [localhost] => (item=None) => {
"msg": "alice - 127.0.0.1"
}
ok: [localhost] => (item=None) => {
"msg": "alice - ::1"
}
ok: [localhost] => (item=None) => {
"msg": "alice - localhost"
}
ok: [localhost] => (item=None) => {
"msg": "bob - db1"
}
TASK [with_cartesian] ************************************************************************************************************************************************************************************************************************
[[1, 2, 3], ['a', 'b'], ['orange', 'apple', 'banana']]
ok: [localhost] => (item=None) => {
"msg": "1 - a - orange"
}
ok: [localhost] => (item=None) => {
"msg": "1 - a - apple"
}
ok: [localhost] => (item=None) => {
"msg": "1 - a - banana"
}
ok: [localhost] => (item=None) => {
"msg": "1 - b - orange"
}
ok: [localhost] => (item=None) => {
"msg": "1 - b - apple"
}
ok: [localhost] => (item=None) => {
"msg": "1 - b - banana"
}
ok: [localhost] => (item=None) => {
"msg": "2 - a - orange"
}
ok: [localhost] => (item=None) => {
"msg": "2 - a - apple"
}
ok: [localhost] => (item=None) => {
"msg": "2 - a - banana"
}
ok: [localhost] => (item=None) => {
"msg": "2 - b - orange"
}
ok: [localhost] => (item=None) => {
"msg": "2 - b - apple"
}
ok: [localhost] => (item=None) => {
"msg": "2 - b - banana"
}
ok: [localhost] => (item=None) => {
"msg": "3 - a - orange"
}
ok: [localhost] => (item=None) => {
"msg": "3 - a - apple"
}
ok: [localhost] => (item=None) => {
"msg": "3 - a - banana"
}
ok: [localhost] => (item=None) => {
"msg": "3 - b - orange"
}
ok: [localhost] => (item=None) => {
"msg": "3 - b - apple"
}
ok: [localhost] => (item=None) => {
"msg": "3 - b - banana"
}
TASK [with_cartesian -> loop] ****************************************************************************************************************************************************************************************************************
ok: [localhost] => (item=None) => {
"msg": "1 - a - orange"
}
ok: [localhost] => (item=None) => {
"msg": "1 - a - apple"
}
ok: [localhost] => (item=None) => {
"msg": "1 - a - banana"
}
ok: [localhost] => (item=None) => {
"msg": "1 - b - orange"
}
ok: [localhost] => (item=None) => {
"msg": "1 - b - apple"
}
ok: [localhost] => (item=None) => {
"msg": "1 - b - banana"
}
ok: [localhost] => (item=None) => {
"msg": "2 - a - orange"
}
ok: [localhost] => (item=None) => {
"msg": "2 - a - apple"
}
ok: [localhost] => (item=None) => {
"msg": "2 - a - banana"
}
ok: [localhost] => (item=None) => {
"msg": "2 - b - orange"
}
ok: [localhost] => (item=None) => {
"msg": "2 - b - apple"
}
ok: [localhost] => (item=None) => {
"msg": "2 - b - banana"
}
ok: [localhost] => (item=None) => {
"msg": "3 - a - orange"
}
ok: [localhost] => (item=None) => {
"msg": "3 - a - apple"
}
ok: [localhost] => (item=None) => {
"msg": "3 - a - banana"
}
ok: [localhost] => (item=None) => {
"msg": "3 - b - orange"
}
ok: [localhost] => (item=None) => {
"msg": "3 - b - apple"
}
ok: [localhost] => (item=None) => {
"msg": "3 - b - banana"
}
TASK [with_nested] ***************************************************************************************************************************************************************************************************************************
ok: [localhost] => (item=None) => {
"msg": "1 - a"
}
ok: [localhost] => (item=None) => {
"msg": "1 - b"
}
ok: [localhost] => (item=None) => {
"msg": "2 - a"
}
ok: [localhost] => (item=None) => {
"msg": "2 - b"
}
ok: [localhost] => (item=None) => {
"msg": "3 - a"
}
ok: [localhost] => (item=None) => {
"msg": "3 - b"
}
TASK [with_nested -> loop] *******************************************************************************************************************************************************************************************************************
ok: [localhost] => (item=None) => {
"msg": "1 - a"
}
ok: [localhost] => (item=None) => {
"msg": "1 - b"
}
ok: [localhost] => (item=None) => {
"msg": "2 - a"
}
ok: [localhost] => (item=None) => {
"msg": "2 - b"
}
ok: [localhost] => (item=None) => {
"msg": "3 - a"
}
ok: [localhost] => (item=None) => {
"msg": "3 - b"
}
TASK [with_fileglob] *************************************************************************************************************************************************************************************************************************
ok: [localhost] => (item=None) => {
"msg": "/Users/matt/projects/ansibledev/playbooks/with2loop.yml"
}
TASK [with_fileglob -> loop] *****************************************************************************************************************************************************************************************************************
ok: [localhost] => (item=None) => {
"msg": "/Users/matt/projects/ansibledev/playbooks/with2loop.yml"
}
TASK [with_random_choice] ********************************************************************************************************************************************************************************************************************
ok: [localhost] => (item=None) => {
"msg": "foo"
}
TASK [with_random_choice -> loop (Wait! no loop is even needed here)] ************************************************************************************************************************************************************************
ok: [localhost] => {
"msg": "foo"
}
PLAY RECAP ***********************************************************************************************************************************************************************************************************************************
localhost : ok=25 changed=0 unreachable=0 failed=0
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment