# How to split string twice in ansible playbook hosts section.

**URL:** <https://forum.ansible.com/t/how-to-split-string-twice-in-ansible-playbook-hosts-section/37499>\
**Category:** Ansible Project\
**Created:** [December 27, 2022, 2:04pm UTC](https://forum.ansible.com/t/how-to-split-string-twice-in-ansible-playbook-hosts-section/37499 "2022-12-27T14:04:39Z")\
**Posts on this page:** 5\
**Page:** 1

<div class="post-metadata">

**Author:** ![Know\_Your\_Tech](https://avatars.discourse-cdn.com/v4/letter/k/a88e4f/32.png) [@Know\_Your\_Tech](https://forum.ansible.com/u/Know_Your_Tech)\
**Post date:** [December 27, 2022, 2:04pm UTC](https://forum.ansible.com/t/how-to-split-string-twice-in-ansible-playbook-hosts-section/37499/1 "2022-12-27T14:04:39Z")

</div>

Below is how i call my ansible-playbook and pass application names as parameters APP1 & APP2

ansible-playbook -i /web/aes/admin/playbooks/updated.hosts /web/aes/admin/playbooks/split.yml -e ENV=qa -e NODE=cluster -e instance\_name=APP1,APP2

Playbook:

---

<div class="post-metadata">

**Author:** ![Richard\_Megginson](https://sea1.discourse-cdn.com/ansible/user_avatar/forum.ansible.com/richard_megginson/32/4540_2.png) [@Richard\_Megginson](https://forum.ansible.com/u/Richard_Megginson)\
**Post date:** [December 27, 2022, 4:47pm UTC](https://forum.ansible.com/t/how-to-split-string-twice-in-ansible-playbook-hosts-section/37499/2 "2022-12-27T16:47:57Z")

</div>

`split` is not an ansible filter - you cannot use it like `| split(something)` - you have to use as a string method which is why `instance_name.split(',')` works

---

<div class="post-metadata">

**Author:** ![Know\_Your\_Tech](https://avatars.discourse-cdn.com/v4/letter/k/a88e4f/32.png) [@Know\_Your\_Tech](https://forum.ansible.com/u/Know_Your_Tech)\
**Post date:** [December 27, 2022, 4:49pm UTC](https://forum.ansible.com/t/how-to-split-string-twice-in-ansible-playbook-hosts-section/37499/3 "2022-12-27T16:49:45Z")

</div>

Thanks, Richard, but I was looking for a specific solution which seems to be tricky.

---

<div class="post-metadata">

**Author:** ![vbotka](https://sea1.discourse-cdn.com/ansible/user_avatar/forum.ansible.com/vbotka/32/359_2.png) [@vbotka](https://forum.ansible.com/u/vbotka)\
**Post date:** [December 27, 2022, 6:24pm UTC](https://forum.ansible.com/t/how-to-split-string-twice-in-ansible-playbook-hosts-section/37499/4 "2022-12-27T18:24:59Z")

</div>

Wrong. The filter \*split\* is available since 2.11. See  
[https://docs.ansible.com/ansible/latest/playbook\_guide/playbooks\_filters.html#manipulating-strings](https://docs.ansible.com/ansible/latest/playbook_guide/playbooks_filters.html#manipulating-strings)

---

<div class="post-metadata">

**Author:** ![vbotka](https://sea1.discourse-cdn.com/ansible/user_avatar/forum.ansible.com/vbotka/32/359_2.png) [@vbotka](https://forum.ansible.com/u/vbotka)\
**Post date:** [December 28, 2022, 3:19am UTC](https://forum.ansible.com/t/how-to-split-string-twice-in-ansible-playbook-hosts-section/37499/5 "2022-12-28T03:19:26Z")

</div>

> \>  
> \> ansible-playbook -i /web/aes/admin/playbooks/updated.hosts  
> \> /web/aes/admin/playbooks/split.yml -e ENV=qa -e NODE=cluster -e  
> \> instance\_name=APP1,APP2  
> \>  
> \> Playbook:  
> \>  
> \> ---  
> \> - hosts: "{{ [ENV] | product(instance\_name.split(',')) | product([NODE]) |  
> \> product(['wladmin\_mmsplit'])|map('flatten')|map('join', '\_') }}"

Put the logic into the inventory plugin \*constructed\*. See

> ansible-doc -t inventory ansible.builtin.constructed

In the example below, I'll use another inventory plugin \*generator\*  
which you don't need because you obviously have another source of the  
inventory. When you try the code below in your environment use this  
source instead of 02-generator.yml. See

> ansible-doc -t inventory ansible.builtin.generator

I've ignored the case of the parameters.

1) Create the inventory

> tree inventory/

inventory/  
├── 01-hosts  
├── 02-generator.yml  
└── 03-constructed.yml

> cat inventory/01-hosts

localhost

> cat inventory/02-generator.yml

plugin: ansible.builtin.generator  
hosts:  
&nbsp;&nbsp;name: "{{ env }}\_{{ instance }}\_{{ node }}\_{{ ext }}"  
layers:  
&nbsp;&nbsp;env:  
&nbsp;&nbsp;&nbsp;&nbsp;- dev  
&nbsp;&nbsp;&nbsp;&nbsp;- qa  
&nbsp;&nbsp;&nbsp;&nbsp;- prod  
&nbsp;&nbsp;instance:  
&nbsp;&nbsp;&nbsp;&nbsp;- app1  
&nbsp;&nbsp;&nbsp;&nbsp;- app2  
&nbsp;&nbsp;node:  
&nbsp;&nbsp;&nbsp;&nbsp;- cluster1  
&nbsp;&nbsp;&nbsp;&nbsp;- cluster2  
&nbsp;&nbsp;ext:  
&nbsp;&nbsp;&nbsp;&nbsp;- wladmin\_mmsplit

> cat inventory/03-constructed.yml

plugin: ansible.builtin.constructed  
use\_extra\_vars: true  
compose:  
&nbsp;&nbsp;layer\_env: ENV.split(',')  
&nbsp;&nbsp;layer\_node: NODE.split(',')  
&nbsp;&nbsp;layer\_instance: instance\_name.split(',')  
groups:  
&nbsp;&nbsp;my\_group: inventory\_hostname.split('\_').0 in layer\_env and  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;inventory\_hostname.split('\_').1 in layer\_instance and  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;inventory\_hostname.split('\_').2 in layer\_node

2) Test inventory

> ansible-inventory -i inventory --list --yaml

all:  
&nbsp;&nbsp;children:  
&nbsp;&nbsp;&nbsp;&nbsp;ungrouped:  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;hosts:  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dev\_app1\_cluster1\_wladmin\_mmsplit: {}  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dev\_app1\_cluster2\_wladmin\_mmsplit: {}  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dev\_app2\_cluster1\_wladmin\_mmsplit: {}  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dev\_app2\_cluster2\_wladmin\_mmsplit: {}  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;localhost: {}  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;prod\_app1\_cluster1\_wladmin\_mmsplit: {}  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;prod\_app1\_cluster2\_wladmin\_mmsplit: {}  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;prod\_app2\_cluster1\_wladmin\_mmsplit: {}  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;prod\_app2\_cluster2\_wladmin\_mmsplit: {}  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;qa\_app1\_cluster1\_wladmin\_mmsplit: {}  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;qa\_app1\_cluster2\_wladmin\_mmsplit: {}  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;qa\_app2\_cluster1\_wladmin\_mmsplit: {}  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;qa\_app2\_cluster2\_wladmin\_mmsplit: {}

3) Test inventory group \*my\_group\*

> ansible-inventory -i inventory --list --yaml -e ENV=qa -e NODE=cluster2 -e instance\_name=app1,app2

all:  
&nbsp;&nbsp;children:  
&nbsp;&nbsp;&nbsp;&nbsp;my\_group:  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;hosts:  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;qa\_app1\_cluster2\_wladmin\_mmsplit:  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ENV: qa  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NODE: cluster2  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;instance\_name: app1,app2  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;layer\_env:  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;- qa  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;layer\_instance:  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;- app1  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;- app2  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;layer\_node:  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;- cluster2  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;qa\_app2\_cluster2\_wladmin\_mmsplit:  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ENV: qa  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NODE: cluster2  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;instance\_name: app1,app2  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;layer\_env:  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;- qa  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;layer\_instance:  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;- app1  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;- app2  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;layer\_node:  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;- cluster2  
&nbsp;&nbsp;&nbsp;&nbsp;ungrouped:  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;hosts:  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dev\_app1\_cluster1\_wladmin\_mmsplit:  
&nbsp;&nbsp;&nbsp;&nbsp;...

4) Use \*my\_group\* in a playbook

> cat pb.yml

- hosts: my\_group  
&nbsp;&nbsp;tasks:  
&nbsp;&nbsp;&nbsp;&nbsp;- debug:  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var: ansible\_play\_hosts\_all  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;run\_once: true

> ansible-playbook -i inventory -e ENV=qa -e NODE=cluster2 -e instance\_name=app1,app2 pb.yml

PLAY [my\_group]
