- به طور کلی برای استفاده از حلقه در پروندههای PlayBook از loop و with_lookup استفاده میشود.
- در حال حاضر loop و نحوهی استفاده از آن در حال توسعه و رشد است لذا پیشنهاد میشود بیشتر از with_lookup استفاده شود.
- به عنوان مثال کد زیر باعث میشود تا :
- با استفاده از ماژول file ، سه پرونده با نامهای متفاوت ایجاد شود.
- برای این منظور پروندهی PlayBook زیر را در نظر بگیرید :
|
1 2 3 4 5 6 7 8 9 |
--- - hosts: centos-server tasks: - name: create multi file file: state=touch path=/opt/{{<span style="color: #ff0000;">item</span>}} <span style="color: #ff0000;">with_items</span>: - file1 - file2 - file3 |
- همان طور که در کد بالا مشاهده میکنید، با استفاده از متغیر item مشخص کردیم که سه پروندهی file1 ، file2 و file3 ایجاد شوند.
- به منظور اجرای پروندهی PlayBook به شکل زیر عمل کنید :
|
1 |
# ansible-playbook playbook.yaml |
- به عنوان مثال کد زیر باعث میشود تا :
- دو بستهی httpd و elinks بر روی گروهی خاص از خادمهای تحت مدیریت نصب و راه اندازی شوند.
- برای این منظور پروندهی PlayBook زیر را در نظر بگیرید :
|
1 2 3 4 5 6 7 8 |
--- - hosts: centos-server tasks: - name: install httpd and elinks package yum: name={{<span style="color: #ff0000;">item</span>}} state=latest <span style="color: #ff0000;">with_items</span>: - httpd - elinks |
- به منظور اجرای پروندهی PlayBook به شکل زیر عمل کنید :
|
1 |
# ansible-playbook playbook.yaml |
- به عنوان مثال کد زیر باعث میشود تا :
- ابتدا محتویات پروندههای 01 و 02 به ترتیب درون متغیر item ریخته و نمایش داده شود.
- برای این منظور پروندهی PlayBook زیر را در نظر بگیرید :
|
1 2 3 4 5 6 7 |
--- - hosts: centos-server tasks: - debug: msg="{{<span style="color: #ff0000;">item</span>}}" <span style="color: #ff0000;">with_file</span>: - /opt/ansible/files/01.txt - /opt/ansible/files/02.txt |
- به منظور اجرای پروندهی PlayBook به شکل زیر عمل کنید :
|
1 |
# ansible-playbook playbook.yaml |
- به عنوان مثال کد زیر باعث می شود تا :
- مقدار متغیر item زمانی چاپ شود که محتویات آن برابر با محتویات متغیر loop_1 باشد.
- برای این منظور پروندهی PlayBook زیر را در نظر بگیرید :
|
1 2 3 4 5 6 7 8 9 10 11 12 |
- hosts: all vars: <span style="color: #0000ff;">loop_1</span>: "hello1" tasks: - name: Ansible loop with conditional example debug: msg: "{{ <span style="color: #ff0000;">item</span> }}" with_items: - "hello1" - "hello2" - "hello3" when: <span style="color: #ff0000;">item</span> == "{{ <span style="color: #0000ff;">loop_1</span> }}" |
- با اجرای پروندهی بالا، ابتدا مقدار hello1 درون item ریخته میشود و چون مقدار item در این زمان برابر با مقدار متغیر loop_1 است، لذا مقدار item نمایش داده میشود.
- در مرحلهی بعد مقدار hello2 درون item ریخته میشود و چون مقدار item در این زمان برابر با مقدار متغیر loop_1 نیست، لذا مقدار item نمایش داده نمیشود.
- در مرحلهی بعد مقدار hello3 درون item ریخته میشود و چون مقدار item در این زمان برابر با مقدار متغیر loop_1 نیست، لذا مقدار item نمایش داده نمیشود.
- به منظور اجرای پروندهی PlayBook به شکل زیر عمل کنید :
|
1 |
# ansible-playbook playbook.yaml |
- در صورتی که کد بالا به صورت موفقیت آمیز اجرا شده باشد، خروجیای مشابه زیر دریافت خواهید کرد :
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
PLAY [all] ******************************************************************************************************************************************* TASK [Gathering Facts] ******************************************************************************************************************************* ok: [172.16.0.245] TASK [Ansible loop with conditional example] ********************************************************************************************************* [WARNING]: when statements should not include jinja2 templating delimiters such as {{ }} or {% %}. Found: item == "{{ loop_1 }}" ok: [172.16.0.245] => (item=None) => { <span style="color: #ff0000;">"msg": "hello1"</span> } <span style="color: #ff0000;">skipping</span>: [172.16.0.245] => (item=None) <span style="color: #ff0000;">skipping</span>: [172.16.0.245] => (item=None) PLAY RECAP ******************************************************************************************************************************************* 172.16.0.245 : ok=2 changed=0 unreachable=0 failed=0 |
- به عنوان مثال کد زیر باعث میشود تا :
- سه مقدار hello1 ، hello2 و hello3 زمانی چاپ شوند که مقدار متغیر ansible_distribution برابر با MacOSX باشد.
- برای این منظور پروندهی PlayBook زیر را در نظر بگیرید :
|
1 2 3 4 5 6 7 8 9 10 |
- hosts: all tasks: - name: Ansible loop with conditional example debug: msg: "{{ <span style="color: #ff0000;">item</span> }}" <span style="color: #ff0000;">with_items</span>: - "hello1" - "hello2" - "hello3" when: ansible_distribution == "MacOSX" |
- نکته: محتویات متغیر ansible_distribution از ansible_facts بدست آمده است.
- به منظور اجرای پروندهی PlayBook به شکل زیر عمل کنید :
|
1 |
# ansible-playbook playbook.yaml |
- به عنوان مثال کد زیر باعث میشود تا :
- ابتدا یک گروه یا اصطلاحا یک directory از متغیرها با نام Fruits ایجاد شود.
- سپس متغیرها یا کلیدهایی با نام Apple ، Orange و Grapes به همراه مقدارهایی برای آنها در نظر گرفته شود.
- سپس نام متغیرها یا کلیدها همراه با مقدار آنها نمایش داده شود.
- برای این منظور پروندهی PlayBook زیر را در نظر بگیرید :
|
1 2 3 4 5 6 7 8 9 10 11 |
- hosts: all vars: Fruits: <span style="color: #ff0000;">Apple</span>: '<span style="color: #0000ff;">Red</span>' <span style="color: #ff0000;">Orange</span>: '<span style="color: #0000ff;">Orange</span>' <span style="color: #ff0000;">Grapes</span>: '<span style="color: #0000ff;">Greem</span>' tasks: - name: Ansible dictionary loop Example debug: msg: "Key is {{ <span style="color: #ff0000;">item.key</span> }} and color is {{<span style="color: #0000ff;"> item.value</span> }}" with_dict: "{{ Fruits }}" |
- به منظور اجرای پروندهی PlayBook به شکل زیر عمل کنید :
|
1 |
# ansible-playbook playbook.yaml |
- در صورتی که کد بالا به صورت موفقیت آمیز اجرا شده باشد، خروجیای مشابه زیر دریافت خواهید کرد :
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
PLAY [all] ******************************************************************************************************************************************* TASK [Gathering Facts] ******************************************************************************************************************************* ok: [172.16.0.245] TASK [Ansible dictionary loop Example] *************************************************************************************************************** ok: [172.16.0.245] => (item=None) => { "msg": "Key is <span style="color: #ff0000;">Orange</span> and color is <span style="color: #0000ff;">Orange</span>" } ok: [172.16.0.245] => (item=None) => { "msg": "Key is <span style="color: #ff0000;">Apple</span> and color is <span style="color: #0000ff;">Red</span>" } ok: [172.16.0.245] => (item=None) => { "msg": "Key is <span style="color: #ff0000;">Grapes</span> and color is <span style="color: #0000ff;">Greem</span>" } PLAY RECAP ******************************************************************************************************************************************* 172.16.0.245 : ok=2 changed=0 unreachable=0 failed=0 |
- به مواردی که به صورت رنگی مشخص شده است، دقت کنید.
- به عنوان مثال کد زیر باعث میشود تا :
- مقادیر hello2 ، hello1 و hello3 به همراه شمارهی ترتیب آنها نمایش داده شود.
- برای این منظور پروندهی PlayBook زیر را در نظر بگیرید :
|
1 2 3 4 5 6 7 8 9 |
- hosts: all tasks: - name: Ansible loop with index example debug: msg: "echo loop index at {{ <span style="color: #ff0000;">item.0</span> }} and value at {{<span style="color: #ff0000;">item.1</span>}}" <span style="color: #ff0000;">with_indexed_items</span>: - "hello1" - "hello2" - "hello3" |
- نکته: item.0 مولفهی شمارهی ترتیب میباشد در صورتی که item.1 حاوی محتویاتی که مشخص شده است، میباشد.
- به منظور اجرای پروندهی PlayBook به شکل زیر عمل کنید :
|
1 |
# ansible-playbook playbook.yaml |
- در صورتی که کد بالا به صورت موفقیت آمیز اجرا شده باشد، خروجیای مشابه زیر دریافت خواهید کرد :
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
PLAY [all] ******************************************************************************************************************************************* TASK [Gathering Facts] ******************************************************************************************************************************* ok: [172.16.0.245] TASK [Ansible loop with index example] *************************************************************************************************************** ok: [172.16.0.245] => (item=None) => { "msg": "echo loop index at <span style="color: #ff0000;">0</span> and value at <span style="color: #0000ff;">hello1</span>" } ok: [172.16.0.245] => (item=None) => { "msg": "echo loop index at <span style="color: #ff0000;">1</span> and value at <span style="color: #0000ff;">hello2</span>" } ok: [172.16.0.245] => (item=None) => { "msg": "echo loop index at <span style="color: #ff0000;">2</span> and value at <span style="color: #0000ff;">hello3</span>" } PLAY RECAP ******************************************************************************************************************************************* 172.16.0.245 : ok=2 changed=0 unreachable=0 failed=0 |
- به مواردی که به صورت رنگی مشخص شده است، دقت کنید.
- نکته: همان طور که مشاهده میکنید، شروع ترتیب از عدد صفر میباشد. برای این که شروع از عدد یک باشد، کافیست یک واحد به آن اضافه کنیم :
|
1 |
{{ item.0 + 1 }} |
- به عنوان مثال کد زیر باعث میشود تا :
- حلقههای تو در تو یا اصطلاحا nested با دو دسته از مقادیر شکل گیرد.
- برای این منظور پروندهی PlayBook زیر را در نظر بگیرید :
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
- hosts: all vars: keys: - key1 - key2 - key3 - key4 tasks: - name: Ansible loop with index example debug: msg: "echo loop index at {{ item[0] }} and value at {{ item[1] }}" with_nested: - [ 'calvin', 'josh', 'alice' ] - '{{ keys }}' |
- به منظور اجرای پروندهی PlayBook به شکل زیر عمل کنید :
|
1 |
# ansible-playbook playbook.yaml |
- در صورتی که کد بالا به صورت موفقیت آمیز اجرا شده باشد، خروجیای مشابه زیر دریافت خواهید کرد :
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 |
PLAY [all] ******************************************************************************************************************************************* TASK [Gathering Facts] ******************************************************************************************************************************* ok: [172.16.0.245] TASK [Ansible loop with index example] *************************************************************************************************************** ok: [172.16.0.245] => (item=None) => { "msg": "echo loop index at <span style="color: #ff0000;">calvin</span> and value at <em><strong>key1</strong></em>" } ok: [172.16.0.245] => (item=None) => { "msg": "echo loop index at <span style="color: #ff0000;">calvin</span> and value at <em><strong>key2</strong></em>" } ok: [172.16.0.245] => (item=None) => { "msg": "echo loop index at <span style="color: #ff0000;">calvin</span> and value at <em><strong>key3</strong></em>" } ok: [172.16.0.245] => (item=None) => { "msg": "echo loop index at <span style="color: #ff0000;">calvin</span> and value at <em><strong>key4</strong></em>" } ok: [172.16.0.245] => (item=None) => { "msg": "echo loop index at <span style="color: #0000ff;">josh</span> and value at <em><strong>key1</strong></em>" } ok: [172.16.0.245] => (item=None) => { "msg": "echo loop index at <span style="color: #0000ff;">josh</span> and value at <em><strong>key2</strong></em>" } ok: [172.16.0.245] => (item=None) => { "msg": "echo loop index at <span style="color: #0000ff;">josh</span> and value at <em><strong>key3</strong></em>" } ok: [172.16.0.245] => (item=None) => { "msg": "echo loop index at <span style="color: #0000ff;">josh</span> and value at <em><strong>key4</strong></em>" } ok: [172.16.0.245] => (item=None) => { "msg": "echo loop index at <span style="color: #993366;">alice</span> and value at <em><strong>key1</strong></em>" } ok: [172.16.0.245] => (item=None) => { "msg": "echo loop index at <span style="color: #993366;">alice</span> and value at <em><strong>key2</strong></em>" } ok: [172.16.0.245] => (item=None) => { "msg": "echo loop index at <span style="color: #993366;">alice</span> and value at <em><strong>key3</strong></em>" } ok: [172.16.0.245] => (item=None) => { "msg": "echo loop index at <span style="color: #993366;">alice</span> and value at <strong><em>key4</em></strong>" } PLAY RECAP ******************************************************************************************************************************************* 172.16.0.245 : ok=2 changed=0 unreachable=0 failed=0 |
- به مواردی که به صورت رنگی مشخص شده است، دقت کنید.
- مشابه PlayBook بالا را میتوان به صورت زیر در زبان Bash نظر گرفت :
|
1 2 3 4 5 6 |
#! /bin/bash for i in $(echo calvin josh alice) ; do for j in $(echo key1 key2 key3 key4) ; do echo "$i - $j" done done |
- به منظور مطالعهی بیشتر لینکهای زیر پیشنهاد میشود :
|
1 2 3 |
http://www.mydailytutorials.com/working-with-ansible-loop/ https://riptutorial.com/ansible/example/22081/nested-loops https://docs.ansible.com/ansible/latest/user_guide/playbooks_loops.html |
- Loops – لوکال
- آزمایش شده بر روی Ansible نسخهی 2.5.1
- آزمایش شده بر روی سیستم عامل Ubuntu 18.04