Ansible
playbook 剧本
ansible-playbook
- 常用于复杂任务的管理
- 管理经常要完成的任务
- playbook也是通过模块 和它的参数 , 在特定主机上执行任务
- playbook是一个文件 , 该文件中需要通过yaml格式进行书写
- 将经常需要执行的任务写入一个文件
- 剧本/文件中可以包换多个任务
- 可以根据剧本 , 执行相关任务命令
- 可执行周期性的复杂任务
YAML
- YAML 不是一个标记语言
- YAML 是一个可读性高 , 用来表达数据序列的格式语言
- YAML 以数据为中心 , 重点描述数据的关系和结构
1. YAML 语法规范
-
yaml 文件的文件名 , 一般以 yml 或 yaml 作为扩展名
-
文件一般以 --- 作为第一行 , 不是必须的 , 但是常用
-
键值对使用冒号 : 表示 , 冒号后必须有空格
-
数组使用 - 表示 , - 后面必须有空格
-
相同的层级必须有相同的缩进 , 如果缩进不对则语言错误.
-
每一级缩进建议 2个空格
-
全文不能用 tab 缩进 , 必须用 空格 缩进
# 一般写法 name=szhou number=(1 5 6 70 88 99 100) # YAML 写法 name= szhou number: - 1 - 5 - 6 - 70 - 88 - 99 - 100
2. 配置 vim 适应 YAML 语法
# 文件位置和名字是固定的,用于设置vim的格式
[root@pubserver ansible]# vim ~/.vimrc
set ai # 设置自动缩进
set ts=2 # 设置按tab键,缩进2个空格
set et # 将tab转换成相应个数的空格
编写 playbook
-
一个剧本/playbook , 可以包含多个play
-
每个play用于在指定的主机上 , 通过模块和参数执行响应的任务
-
每个play可以包含多个任务
-
任务有某块和参数构成
-
名字: 猴王初问世
职员表: 猴哥, 大马猴
场景:
- 名字: 石头裂开了- 名字: 天宫震颤了
-
名字: 官封弼马温
职员表: 猴哥, 玉皇大帝
场景:
- 名字: 太白金星骗猴哥- 名字: 猴哥天宫放马
-
1. 基础 playbook
# 编写用于测试连通性的playbook,相当于执行ansible all -m ping
[root@pubserver ansible]# vim test.yml
---
- hosts: all
tasks:
- ping:
[root@pubserver ansible]# ansible-playbook test.yml # 执行playbook
# 以上更规范的写法如下:
[root@pubserver ansible]# vim test.yml
---
- name: test network # play的名字,可选项
hosts: all # 作用于所有的主机
tasks: # 任务
- name: test via ping # 第1个任务的名字,可选项
ping: # 第1个任务使用的模块
[root@pubserver ansible]# ansible-playbook test.yml # 执行playbook
# 在dbs组的主机和web1上创建/tmp/demo目录,权限是0755。将控制端/etc/hosts拷贝到目标主机的/tmp/demo中
[root@pubserver ansible]# vim fileop.yml
---
- name: create dir and copy file
hosts: dbs,web1 # 这里的名称,必须出现在主机清单文件中
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@pubserver ansible]# ansible-playbook fileop.yml
# 在webservers组中的主机上,创建用户bob,附加组是adm;在db1主机上,创建/tmp/hi.txt,其内容为Hello World.
[root@pubserver ansible]# vim two.yml
---
- name: create user
hosts: webservers
tasks:
- name: create bob
user:
name: bob
groups: adm
- name: create file
hosts: db1
tasks:
- name: make file
copy:
dest: /tmp/hi.txt
content: "Hello World"
[root@pubserver ansible]# ansible-playbook two.yml
2. 换行 ' | ' 和并行 ' > '
-
| 和 > 的区别
- "|"它保留换行符
-
">" 把多行合并为一行
通过copy模块创建/tmp/1.txt,文件中有两行内容,分别是Hello World和ni hao
[root@pubserver ansible]# vim f1.yml
- name: play 1
hosts: webservers
tasks:- name: mkfile 1.txt
copy:
dest: /tmp/1.txt
content: |
Hello World!
ni hao.
- name: mkfile 1.txt
[root@pubserver ansible]# ansible-playbook f1.yml
查看结果
[root@web1 ~]# cat /tmp/1.txt
Hello World!
ni hao.通过copy模块创建/tmp/2.txt,文件中有一行内容,分别是Hello World! ni hao
[root@pubserver ansible]# vim f2.yml
- name: play 1
hosts: webservers
tasks:- name: mkfile 2.txt
copy:
dest: /tmp/2.txt
content: >
Hello World!
ni hao.
- name: mkfile 2.txt
[root@pubserver ansible]# ansible-playbook f2.yml
[root@web1 ~]# cat /tmp/2.txt
Hello World! ni hao. - name: play 1
3. parted模块
- 用于硬盘分区
- 选项 :
-
device # 待分区设备
-
number # 分区编号
-
state # 状态
- present # 创建
- adsent # 删除
-
part_start # 分区起始位置 , 默认从头开始
-
part_end # 分区的结束位置 , 默认到结尾
在web1主机上,对/dev/vdc进行分区,创建1个1GB的主分区
[root@pubserver ansible]# vim disk.yml
- name: disk manage
hosts: web1
tasks:- name: create a partition
parted:
device: /dev/vdc
number: 1
state: present
part_end: 1GiB
- name: create a partition
[root@pubserver ansible]# ansible-playbook disk.yml
在目标主机上查看结果
[root@web1 ~]# 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@pubserver ansible]# vim disk.yml
... ...
- name: add a new partition
parted:
device: /dev/vdc
number: 2
state: present
part_start: 1GiB
part_end: 6GiB[root@pubserver ansible]# ansible-playbook disk.yml
[root@web1 ~]# 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@pubserver 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@pubserver ansible]# vim disk.yml
... ...
- name: create my_lv
lvol:
vg: my_vg
lv: my_lv
size: 1G继续编辑disk.yml,格式化my_lv为ext4
[root@pubserver ansible]# vim disk.yml
... ...
- name: mkfs my_lv
filesystem:
dev: /dev/my_vg/my_lv
fstype: ext4继续编辑disk.yml,将my_lv挂载到/data
[root@pubserver 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: web1
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
-
- name: disk manage
-
4. yum装包组
1) 多软件安装格式
# 在webservers组中的主机上,安装httpd、php、php-mysqlnd
[root@pubserver ansible]# vim pkg.yml
---
- name: install pkgs
hosts: webservers
tasks:
- name: install web pkgs # 此任务通过yum安装三个包
yum:
name: httpd,php,php-mysqlnd
state: present
# 安装多个软件包,还可以写为:
---
- name: install pkgs
hosts: webservers
tasks:
- name: install web pkgs
yum:
name: [httpd,php,php-mysqlnd]
state: present
# 安装多个软件包,还可以写为:
---
- name: install pkgs
hosts: webservers
tasks:
- name: install web pkgs
yum:
name:
- httpd
- php
- php-mysqlnd
state: present