yaml介绍
官网介绍如下:
1 | %YAML 1.2 |
语法
这里的语法使用python举例,python使用的库是PyYAML
所有的 YAML 文件开始行都应该是 —。这是 YAML 格式的一部分, 表明一个文件的开始。
基本语法规则如下:
- 大小写敏感
- 使用缩进表示层级关系
- 缩进时不允许使用Tab键,只允许使用空格。
- 缩进的空格数目不重要,只要相同层级的元素左侧对齐即可
- # 表示注释,从这个字符一直到行尾,都会被解析器忽略。
YAML 支持的数据结构有三种:
- 对象:键值对的集合,又称为映射(mapping)/ 哈希(hashes) / 字典(dictionary)
- 数组:一组按次序排列的值,又称为序列(sequence) / 列表(list)
- 纯量(scalars):单个的、不可再分的值
对象 key-value键值对
使用格式为key: value。冒号后面要加一个空格。
简单展示
1 | import yaml |
打印结果:
1 | <class 'dict'> |
使用缩进代表层级结构
1 | import yaml |
打印结果:
1 | <class 'dict'> |
一行显示
1 | import yaml |
打印结果:
1 | <class 'dict'> |
数组 Array/List
简单展示
列表中的所有成员都开始于相同的缩进级别
1 | import yaml |
打印结果:
1 | {'ipaddr': ['192.168.10.1', '192.168.10.2', '192.168.10.3']} |
缩进显示
子成员是一个数组,则可以在该项下面缩进一个空格。
1 | from pprint import pprint |
打印结果:
1 | {'ipaddr': [{'ens192': ['192.168.10.1', '192.168.10.2', '192.168.10.3']}], 'file': [['etc', 'sysconfig', 'network-scripts', 'ifcfg-ens192']]} |
行内表示
因为程序差不多,之后只提供yaml文件内容以及pprint打印的结果
1 | yaml_context = """ |
打印结果:
1 | {'ipaddr': [{'ens192': ['192.168.10.1', '192.168.10.2', '192.168.10.3']}]} |
常量
yaml中的常量包含以下几种
- 字符串
- 布尔值
- 整数
- 浮点数
- Null
- 时间
- 日期
具体看以下示例应该就清楚了,不过多解释了
其中字符串有几个规则需要注意
- 字符串默认不使用引号表示,如:
str: 这是一行字符串
- 如果字符串之中包含空格或特殊字符,需要放在引号之中,如:
str: '内容:字符串'
- 单引号和双引号都可以使用,双引号不会对特殊字符转义,如:
str: {s1: '内容\n字符串', s2: "内容\n字符串"}
- 单引号之中如果还有单引号,必须连续使用两个单引号转义,如:
str: 'labor''s day'
- 字符串可以写成多行,从第二行开始,必须有一个单空格缩进。换行符会被转为空格
- 多行字符串可以使用 | 保留换行符,也可以使用 > 折叠换行,下一节会介绍
- 表示保留文字块末尾的换行,- 表示删除字符串末尾的换行,下一节会介绍
1 | yaml_context = """ |
打印结果:
1 | {None: {'nodeName': 'node', 'parent': None}, |
特殊符号
!! 类型强转
1 | yaml_context = """ |
打印结果:
1 | {'boolean2string': 'true', 'int2string': '123'} |
… 和 —
… 和—配合使用,在一个配置文件中代表一个文件的结束:
1 | from pprint import pprint |
打印结果:
1 | <generator object load_all at 0x000001C786A58C80> |
| 控制符 和 > 控制符
这两个符号是YAML中字符串经常使用的符号
| 控制符
这个控制符的作用是保留文本每一行尾部的换行符。
- | 保证整段文本最后有且只有一个换行符
- |+ 保留整段文本最后的所有换行符
- |- 删除整段文本最后的所有换行符
最后有且只有一个换行符
1
2
3
4
5
6
7
8
9
10
11
12yaml_context = """
cmd: |
bash
-c
sleep 3600
"""打印结果:
1
{'cmd': 'bash\n-c \n\n\nsleep 3600\n'}
保留整段文本最后的所有换行符
1
2
3
4
5
6
7
8
9
10
11
12yaml_context = """
cmd: |+
bash
-c
sleep 3600
"""打印结果:
1
{'cmd': 'bash\n-c \n\n\nsleep 3600\n\n\n\n\n'}
删除整段文本最后的所有换行符
1
2
3
4
5
6
7
8
9
10
11
12yaml_context = """
cmd: |-
bash
-c
sleep 3600
"""打印结果:
1
{'cmd': 'bash\n-c \n\n\nsleep 3600'}
> 控制符
这个控制符的作用是将每一行尾部的换行符替换为空格,也就是将多行文本视为一行
保证文本最后有且只有一个换行符
- 保留文本最后的所有换行符
- 删除文本最后的所有换行符
最后有且只有一个换行符
1
2
3
4
5
6
7
8
9
10
11
12yaml_context = """
cmd: >
bash
-c
sleep 3600
"""打印结果:
1
{'cmd': 'bash -c \n\nsleep 3600\n'}
保留整段文本最后的所有换行符
1
2
3
4
5
6
7
8
9
10
11
12yaml_context = """
cmd: >+
bash
-c
sleep 3600
"""打印结果:
1
{'cmd': 'bash -c \n\nsleep 3600\n\n\n\n\n'}
删除整段文本最后的所有换行符
1
2
3
4
5
6
7
8
9
10
11
12yaml_context = """
cmd: >-
bash
-c
sleep 3600
"""打印结果:
1
{'cmd': 'bash -c \n\nsleep 3600'}
引用 & 和 *
重复的内容在YAML中可以使用&来完成锚点定义,使用*来完成锚点引用,
1 | yaml_context = """ |
打印结果:
1 | {'defaults': {'db': 'postgres', 'host': 'localhost'}, |
CentOS 搭建 nfs server
服务端部署
安装软件包
1
# yum install -y rpcbind nfs-utils
创建共享目录
1
2# mkdir -p /srv/data/nfs_data
# chmod 777 /srv/data/nfs_data修改配置文件
将配置文件exports填写以下内容
1
2
3# cat /etc/exports
/data/nfs_data/data *(insecure,rw,sync,no_root_squash,fsid=0)启动 nfs 服务
1
2
3
4
5systemctl enable rpcbind
systemctl enable nfs-server
systemctl start rpcbind
systemctl start nfs-server检查配置是否生效
使用 exportfs 命令,会显示共享的目录
1
2
3# exportfs
/srv/data/nfs_data
<world>开发防火墙
服务器端开放 111、662、875、892、2049 的 tcp / udp 端口即可
客户端挂载
客户端安装软件
1
yum install -y nfs-utils
执行命令检查共享目录
使用命令 showmount 进行显示,注意替换成当前的服务器地址,这里是 10.6.70.4
1
2
3
4# showmount -e 10.6.70.4
Export list for 10.6.70.4:
/srv/data/nfs_data *挂载并测试
客户端挂载并创建测试文件
1
2
3
4# ls /mnt/
# mount -t nfs 10.6.70.4:/ /mnt/
# ls /mnt/
# echo 'aaa' > /mnt/a.txt服务器端查看目录,可以看到已经生成文件
1
2# cat /srv/data/nfs_data/a.txt
aaa