Indentation and Whitespace
Like Python, YAML uses space indentation to reduce the number of interpunction characters. We use two spaces as a standard. For readability, we prefer to add whitespace between each task in a playbook, and between sections in files.
Strings
In general, you don’t need to quote YAML strings. Even if there are spaces, you don’t need to quote them. For example, this is a string in YAML:
this is a lovely sentence
The JSON equivalent is as follows:
"this is a lovely sentence"
Use single quotes for literal values that should not be evaluated, like version numbers and floating point numbers, or strings with reserved characters like colons, brackets, or braces.
Booleans
YAML has a native Boolean type and provides you with a variety of values that evaluate to true or false.
These are all Boolean true values in YAML:
true, True, TRUE, yes, Yes, YES, on, On, ON
JSON only uses: true
These are all Boolean false values in YAML:
false, False, FALSE, no, No, NO, off, Off, OFF
JSON only uses:false
Lists
YAML lists are like arrays in JSON and Ruby, or lists in Python.The YAML specification calls these sequences, but we call them lists here to be consistent with the official Ansible documentation.
Indent list items and delimit them with hyphens.
shows:
- My Fair Lady
- Oklahoma
- The Pirates of Penzance
YAML also supports an inline format for lists, with comma-separated values in square brackets:
shows: [ My Fair Lady , Oklahoma , The Pirates of Penzance ]
Dictionaries
YAML dictionaries are like objects in JSON, dictionaries in Python, hashes in Ruby, or associative arrays in PHP The YAML specification calls them mappings, but we call them dictionaries here to be consistent with the Ansible documentation.
address:
street: Main Street
appt: 742
city: Logan
state: Ohio
YAML also supports an inline format for dictionaries, with comma separated tuples in braces:
address: { street: Main Street, appt: '742', city: Logan, state:Ohio}
Multiline Strings
You can format multiline strings with YAML by combining a block style indicator (| or >)
If you want one string across multiple lines:
Using |
message: |
This is line one
This is line two
This is line three
Using >
message: >
This is line one
This is line two
This is line three
output will be
This is line one This is line two This is line three
Quoting in Ansible Strings
A variable right after specifying the module, the YAML parser will misinterpret the variable reference as the beginning of an inline dictionary.
- name: Perform some task
command: {{ myapp }} -a foo
Ansible will try to parse the first part of {{ myapp }} -a foo as a dictionary instead of a string, and will return an error. In this case, you must quote the arguments:
- name: Perform some task
command: "{{ myapp }} -a foo"
A similar problem arises if your argument contains a colon. For example:
- name: Show a debug message
debug:
msg: The debug module will print a message: neat, eh?
The colon in the msg argument trips up the YAML parser.
To get around this, you need to quote the entire msg string. Single and double quotes are both correct; Bas prefers to use double quotes when the string has variables:
- name: Show a debug message
debug:
msg: "The debug module will print a message: neat, eh?"
This will make the YAML parser happy. Ansible supports alternating single and double quotes,
'single quotes' → literal strings
"double quotes" → interpreted strings (supports escaping + special chars)
Double Quotes
- name: Print variable
debug:
msg: "Hello {{ user }}"
👉 {{ user }} will be evaluated
msg: "Line1\nLine2"
👉 Produces:
Line1
Line2
Single Quotes
- name: Print variable
debug:
msg: 'Hello {{ user }}'
👉 Jinja2 still processes it, BUT:
Escaping behaves differently
Harder to nest quotes
msg: 'Line1\nLine2'
👉 Produces:
Line1\nLine2
Loop
A loop executes the task multiple times, each time replacing item with different values from the specified list:
- name: Install multiple packages
hosts: all
tasks:
- name: Install packages
yum:
name: "{{ item }}"
state: present
loop:
- nginx
- git
- curl
Loop with List Variable
vars:
packages:
- nginx
- git
- curl
tasks:
- name: Install packages
yum:
name: "{{ item }}"
state: present
loop: "{{ packages }}"
Loop with Dictionary (Key-Value)
vars:
users:
user1: dev
user2: admin
tasks:
- name: Create users
user:
name: "{{ item.key }}"
comment: "{{ item.value }}"
loop: "{{ users | dict2items }}"
👉 dict2items converts dictionary → list