Why loops?
Without loops you repeat tasks:
- apt: { name: nginx }
- apt: { name: git }
- apt: { name: curl }With loops:
---
- name: Install multiple packages
hosts: all
become: true
tasks:
- name: Install packages
apt:
name: "{{ item }}"
state: present
loop:
- nginx
- git
- curlitem is the current value in the loop (nginx → git → curl).
ansible-playbook playbooks/loop.ymlCreate users
- name: Create users
user:
name: "{{ item }}"
state: present
loop:
- devops
- dockerCreate directories
- name: Create project folders
file:
path: "/tmp/{{ item }}"
state: directory
loop:
- logs
- backup
- uploadsLoop + copy
- name: Copy configs
copy:
src: "{{ item }}"
dest: "/etc/{{ item }}"
loop:
- nginx.conf
- my.cnfLoop + conditional
- name: Install packages on Ubuntu
apt:
name: "{{ item }}"
state: present
loop:
- nginx
- git
when: ansible_distribution == "Ubuntu"Variables + loops
vars:
packages:
- nginx
- git
- curl
tasks:
- apt:
name: "{{ item }}"
state: present
loop: "{{ packages }}"Mini project — DevOps server setup
---
- name: DevOps server setup
hosts: all
become: true
vars:
packages:
- nginx
- git
- curl
users:
- devops
- docker
tasks:
- name: Install packages on Ubuntu
apt:
name: "{{ item }}"
state: present
loop: "{{ packages }}"
when: ansible_distribution == "Ubuntu"
- name: Create users
user:
name: "{{ item }}"
state: present
loop: "{{ users }}"
- name: Create project folders
file:
path: "/tmp/{{ item }}"
state: directory
loop:
- logs
- backup
- uploadsansible-playbook playbooks/devops-setup.ymlInterview: loop repeats a task over a list; each pass sets item to the current element. Prefer loop: over legacy with_items.