文章目录
- 环境
- YAML基础
- 换行
- 引号
- 考一考
 
- Ansible变量
- 布尔值
- 参考
环境
- 管理节点:Ubuntu 22.04
- 控制节点:CentOS 8
- Ansible:2.15.6
YAML基础
- ---:文件开头(可选)
- ...:文件结尾(可选)
- -:哈希(hash),注意- -后面要有空格
- ::字典(dictionary),注意- :后面要有空格
- #:注释,注意如果是行内注释,则- #前面要有空格
比如:
---
- name: Tom # some commentage: 20sport:- football- basketball
# another comment
- name: Jerryage: 18sport:- swim- tennis- football
...
Dictionary也可以写成如下形式:
{name: Tom, age: 20}
List也可以写成如下形式:
[football, basketball]
换行
一个字符串可以跨多行:
- \n:换行符
- |:多行,把换行转换为- \n
- >:多行,把换行转换为空格
比如:
---
- hosts: allvars:var1: |abcdefghijklmnopqrstuvwxyzvar2: >abcdefghijklmnopqrstuvwxyztasks:- name: task1debug:msg: "{{ var1 }}"- name: task2debug:msg: "{{ var2 }}"
运行结果如下:
TASK [task1] ***************************************************************************************
ok: [192.168.1.55] => {"msg": "abcdefg\nhijklmn\nopqrst\nuvwxyz\n"
}TASK [task2] ***************************************************************************************
ok: [192.168.1.55] => {"msg": "abcdefg hijklmn opqrst uvwxyz\n"
}
注意:所有行的缩进要一致。
这两种方式下:
- 缩进都会被忽略
- 行末的空白符都会保留
使用 > 的时候,如果所有行的缩进不一致,或者有空行,则会保留换行符,比如:
---
- hosts: allvars:var1: >abcdefgtasks:- name: task1debug:msg: "{{ var1 }}"
运行结果如下:
TASK [task1] ***************************************************************************************
ok: [192.168.1.55] => {"msg": "a b\nc d\n  e\nf g\n"
}
当然,也可以直接使用 \n 来表示换行。
引号
一般情况下,字符串可以不用引号,比如:
description: Hello world!
但是有一些特例:若不用引号,则有一些字符不能出现在字符串开头处:
- [
- ]
- {
- }
- >
- |
- *
- &
- !
- %
- #
- `
- @
- ,
此外,对于以下符号:
- ?
- :
- -
如果其后不是空格,才可以出现在字符串开头处。
---
- hosts: alltasks:- name: task1debug:msg: ?abc- name: task2debug:msg: :abc- name: task3debug:msg: -abc
说了半天这么麻烦,不如还是加上引号吧,省事。
单引号或者双引号都可以,二者区别在于,单引号包含的是literal的内容,而双引号的内容可以转义。
比如:
var1: 'ab\ncd\tef'
var2: "ab\ncd\tef"
- var1:literal的字符串
- var2:包含了一个换行和一个制表符
下面写法是错误的:
var1: "ab\c"
因为在双引号里, \ 后面要跟一个转义符,比如 n 、 t 、 b 、 \ 等。
考一考
如何用双引号表示literal的 ab\ncd\tef ?
答:
var1: "ab\\ncd\\tef"
注意literal的 \ 在双引号里要写成 \\ 。
Ansible变量
语法: {{ <variable> }}
在单引号和双引号中都可以使用变量,比如:
---
- hosts: allvars:var1: "aaa"var2: "bbb\nccc {{ var1 }}"var3: 'bbb\nccc {{ var1 }}'tasks:- name: task1debug:msg: "{{ var2 }}" # bbb\nccc aaa- name: task2debug:msg: '{{ var2 }}' # bbb\nccc aaa- name: task3debug:msg: "{{ var3 }}" # bbb\\nccc aaa- name: task4debug:msg: '{{ var3 }}' # bbb\\nccc aaa
可见,在单引号和双引号里,变量都可以被解析。
注:这一点是和shell脚本不同的,shell脚本里只能在双引号里使用变量,而单引号里都是literal的字符串。
注意:输出结果相当于是双引号的内容,而变量里单引号里的 \ 是literal字符,所以在输出结果里被转义为 \\ 。
那么问题来了,如果是literal的 {{ var2 }} ,要如何处理呢?
一种方式是在template里使用literal的字符串:
---
- hosts: alltasks:- name: task1debug:msg: "{{ '{{ var2 }}' }}" # {{ var2 }}
应该还有别的简单方法吧(比如转义什么的),暂时没有深究。
布尔值
很简单,想要字符串就加上引号,想要布尔值就不要加引号,比如:
- "yes"/- "no"/- "true"/- "false":字符串
- yes/- no/- true/- false:布尔值
比如:
---
- hosts: allvars:var1: "yes"var2: yestasks:- name: task1debug:msg: "{{ var1 | type_debug }}" # AnsibleUnicode- name: task2debug:msg: "{{ var2 | type_debug }}" # bool- name: task3debug:msg: "{{ 'yes' | type_debug }}" # str- name: task4debug:msg: "{{ yes | type_debug }}" # AnsibleUndefined
注意:在task2里,把 yes 赋值给变量,其类型被隐式转换为 bool 。在task4里,literal的 yes ,其类型是 AnsibleUndefined 。而literal的 true ,其类型则直接就是 bool 。
参考
- https://docs.ansible.com/ansible/latest/reference_appendices/YAMLSyntax.html