Playbook剧本
- 常用于复杂任务的管理,以及管理经常要完成的任务
- playbook也是通过模块和它的参数,在特定主机上执行任务
- playbook是一个文件,该文件中需要通过yaml格式进行书写
YAML
- YAML Ain't a Markup Language:YAML不是一个标记语言
yaml语法规范
- yaml文件的文件名,一般以yml或yaml作为扩展名
- 文件一般以
---
作为第一行,不是必须的,但是常用 - 键值对使用冒号
:
表示,冒号后面必须有空格。 - 数组使用
-
表示,-
后面必须有空格。 - 相同的层级必须有相同的缩进。如果缩进不对,则有语法错误。每一级缩进,建议2个空格。
- 全文不能使用tab,必须使用空格。
配置vim适应yaml语法
# 文件位置和名字是固定的,用于设置vim的格式
[root@control ansible]# vim ~/.vimrc
set ai # 设置自动缩进
set ts=2 # 设置按tab键,缩进2个空格
set et # 将tab转换成相应个数的空格
编写playbook
- 一个剧本(即playbook),可以包含多个play
- 每个play用于在指定的主机上,通过模块和参数执行相应的任务
- 每个play可以包含多个任务。
- 任务有模块和参数构成。
# 编写用于测试连通性的playbook,相当于执行ansible all -m ping
[root@control ansible]# vim test.yml
---
- hosts: all
tasks:
- ping:
[root@control ansible]# ansible-playbook test.yml # 执行playbook
# 以上更规范的写法如下:
[root@control ansible]# vim test.yml
---
- name: test network # play的名字,可选项
hosts: all # 作用于所有的主机
tasks: # 任务
- name: task 1 # 第1个任务的名字,可选项
ping: # 第1个任务使用的模块
[root@control ansible]# ansible-playbook test.yml # 执行playbook
# 在test组的主机和node2上创建/tmp/demo目录,权限是0755。将控制端/etc/hosts拷贝到目标主机的/tmp/demo中
[root@control ansible]# vim fileop.yml
---
- name: create dir and copy file
hosts: test,node2 # 这里的名称,必须出现在主机清单文件中
tasks:
- name: create dir
file:
path: /tmp/demo
state: directory
mode: '0755'
- name: copy file
copy:
src: /etc/hosts
dest: /tmp/demo/hosts
# 执行playbook
[root@control ansible]# ansible-playbook fileop.yml
# 在test组中的主机上,创建用户bob,附加组是adm;在node2主机上,创建/tmp/hi.txt,其内容为Hello World.
[root@control ansible]# vim two.yml
---
- name: create user
hosts: test
tasks:
- name: create bob
user:
name: bob
groups: adm
- name: create file
hosts: node2
tasks:
- name: make file
copy:
dest: /tmp/hi.txt
content: "Hello World"
[root@control ansible]# ansible-playbook two.yml
|
和>
的区别:|
它保留换行符,>
把多行合并为一行
# 通过copy模块创建/tmp/1.txt,文件中有两行内容,分别是Hello World和ni hao
[root@control ansible]# vim f1.yml
---
- name: play 1
hosts: test
tasks:
- name: mkfile 1.txt
copy:
dest: /tmp/1.txt
content: |
Hello World!
ni hao.
[root@control ansible]# ansible-playbook f1.yml
# 查看结果
[root@node1 ~]# cat /tmp/1.txt
Hello World!
ni hao.
# 通过copy模块创建/tmp/2.txt,文件中有一行内容,分别是Hello World! ni hao
[root@control ansible]# vim f2.yml
---
- name: play 1
hosts: test
tasks:
- name: mkfile 2.txt
copy:
dest: /tmp/2.txt
content: >
Hello World!
ni hao.
[root@control ansible]# ansible-playbook f2.yml
[root@node1 ~]# cat /tmp/2.txt
Hello World! ni hao.
playbook示例
# 在test组中的主机上创建john用户,它的uid是1040,主组是daemon,密码为123
[root@control ansible]# vim user_john.yml
---
- name: create user
hosts: test
tasks:
- name: create user john
user:
name: john
uid: 1040
group: daemon
password: "{{'123'|password_hash('sha512')}}"
[root@control ansible]# ansible-playbook user_john.yml
# 在test组中的主机上删除用户john
[root@control ansible]# vim del_john.yml
---
- name: delete user
hosts: test
tasks:
- name: delete user john
user:
name: john
state: absent
[root@control ansible]# ansible-playbook del_john.yml
硬盘管理
- 常用的分区表类型有:MBR(主引导记录)、GPT(GUID分区表)
- MBR最多支持4个主分区,或3个主分区加1个扩展分区。最大支持2.2TB左右的硬盘
- GPT最多支持128个主分区。支持大硬盘
parted模块
- 用于硬盘分区管理
- 常用选项:
- device:待分区的设备
- number:分区编号
- state:present表示创建,absent表示删除
- part_start:分区的起始位置,不写表示从开头
- part_end:表示分区的结束位置,不写表示到结尾
# 在test组中的主机上,对/dev/vdc进行分区,创建1个1GB的主分区
[root@control ansible]# vim disk.yml
---
- name: disk manage
hosts: test
tasks:
- name: create a partition
parted:
device: /dev/vdc
number: 1
state: present
part_end: 1GiB
[root@control ansible]# ansible-playbook disk.yml
# 在目标主机上查看结果
[root@node1 ~]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
.. ...
vdc 253:32 0 20G 0 disk
`-vdc1 253:33 0 1023M 0 part
# 继续编辑disk.yml,对/dev/vdc进行分区,创建1个新的5GB的主分区
[root@control ansible]# vim disk.yml
... ...
- name: add a new partition
parted:
device: /dev/vdc
number: 2
state: present
part_start: 1GiB
part_end: 6GiB
[root@control ansible]# ansible-playbook disk.yml
[root@node1 ~]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
... ...
vdc 253:32 0 20G 0 disk
|-vdc1 253:33 0 1023M 0 part
`-vdc2 253:34 0 5G 0 part
# 继续编辑disk.yml,创建名为my_vg的卷组,它由上面创建的vdc1和vdc2构成
[root@control ansible]# vim disk.yml
... ...
- name: create my_vg
lvg:
vg: my_vg
pvs: /dev/vdc1,/dev/vdc2
# 继续编辑disk.yml,在my_vg卷组上创建名为my_lv的逻辑卷,大小1G
[root@control ansible]# vim disk.yml
... ...
- name: create my_lv
lvol:
vg: my_vg
lv: my_lv
size: 1G
# 继续编辑disk.yml,格式化my_lv为ext4
[root@control ansible]# vim disk.yml
... ...
- name: mkfs my_lv
filesystem:
dev: /dev/my_vg/my_lv
fstype: ext4
# 继续编辑disk.yml,将my_lv挂载到/data
[root@control ansible]# vim disk.yml
... ...
- name: mount my_lv
mount:
path: /data
src: /dev/my_vg/my_lv
fstype: ext4
state: mounted
# 完整的disk.yml如下
---
- name: disk manage
hosts: test
tasks:
- name: create a partition
parted:
device: /dev/vdc
number: 1
state: present
part_end: 1GiB
- name: add a new partition
parted:
device: /dev/vdc
number: 2
state: present
part_start: 1GiB
part_end: 6GiB
- name: create my_vg
lvg:
vg: my_vg
pvs: /dev/vdc1,/dev/vdc2
- name: create my_lv
lvol:
vg: my_vg
lv: my_lv
size: 1G
- name: mkfs my_lv
filesystem:
dev: /dev/my_vg/my_lv
fstype: ext4
- name: mount my_lv
mount:
path: /data
src: /dev/my_vg/my_lv
fstype: ext4
state: mounted