南昌网站外包,天门市住房和城乡建设局网站,廊坊网站推广公司,wordpress只能显示字文章目录 环境YAML基础换行引号考一考 Ansible变量布尔值参考 环境
管理节点#xff1a;Ubuntu 22.04控制节点#xff1a;CentOS 8Ansible#xff1a;2.15.6
YAML基础
--- #xff1a;文件开头#xff08;可选#xff09;... #xff1a;文件结尾#xff08;可选Ubuntu 22.04控制节点CentOS 8Ansible2.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\tefvar1 literal的字符串var2 包含了一个换行和一个制表符
下面写法是错误的
var1: ab\c因为在双引号里 \ 后面要跟一个转义符比如 n 、 t 、 b 、 \ 等。
考一考
如何用双引号表示literal的 ab\ncd\tef
答
var1: ab\\ncd\\tef注意literal的 \ 在双引号里要写成 \\ 。
Ansible变量
语法 {{ variable }}
在单引号和双引号中都可以使用变量比如
---
- hosts: allvars:var1: aaavar2: 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: yesvar2: 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