Ansible Playbook剧本用法
Ansible Playbook剧本
使用Playbook剧本的目的
将需要经常执行的任务写入一个文件(剧本),适用于周期性执行的复杂任务
剧本中可以包含多个任务并可以重复使用
Playbook剧本要求按照YAML格式编写
YAML是什么
YAML(YAML Ain't Markup Language)
是一种人类可读性高且面向数据序列化的格式
是一种格式而不是语言
具备易读性、简洁和可扩展性,对人类友好,支持跨语言操作
常用于配置文件、数据传输等场景
YAML语法格式
文件以 .yaml 或 .yml 扩展名为常见
文件一般以---作为第一行,不是必须的,但是常用
键值对使用冒号:表示,冒号后面必须有空格
数组使用-表示,-后面必须有空格
相同的层级必须有相同的缩进。如果缩进不对,则有语法错误。每一级缩进,建议2个空格
全文不能使用tab,必须使用空格
YAML格式数据样例
## 键值对样例
- "诗仙": "李白"
或
- "诗仙":
"李白"
## 数组样例
- "诗人": ["李白", "杜甫"]
或
- "诗人":
- "李白"
- "杜甫"
## 综合样例
- "诗人":
- "唐代":
- "李白"
- "杜甫"
- "宋代":
- "苏轼"
- "李清照"
配置VIM编辑器
## 编辑vimrc文件,配置yml编写约束
[root@pubserver ansible]# vim ~/.vimrc
set nu ai et paste ts=4
autocmd FileType yaml setlocal ai et ts=2 sw=2
set cursorline
set cursorcolumn
Playbook剧本样例
一个剧本(Playbook)可以包含多个剧(Play)
每个剧(Play)用于在指定的主机或组上执行一个或多个任务(Task)
每个任务(Task)由模块和参数组成
## 剧本样例
---
- 名字: 三兄弟初遇
人物: 刘备,关羽,张飞
场景:
- 场景一: 刘备卖草鞋
- 场景二: 关羽卖绿豆
- 场景三: 张飞卖肉
- 场景四: 三人相遇
- 名字: 三英战吕布
人物: 刘备,关羽,张飞,吕布,曹操,袁绍
- 场景一: 吕布叫阵
- 场景二: 张飞大战吕布
- 场景三: 关张大战吕布
- 场景四: 刘关张三英战吕布
- 名字: 三顾茅庐
人物: 刘备,关羽,张飞,诸葛亮,书童
- 场景一: 一请诸葛亮
- 场景二: 二请诸葛亮
- 场景三: 三请诸葛亮
Playbook基础语法
ping模块
## 编写Playbook使用ping模块测试网络连通
[root@pubserver ansible]# vim test_ping.yml
---
- name: test network #剧本名称(可选项)
hosts: all #作用主机(组)
tasks: #任务
- name: test via ping #任务1(名称可选,可以写中文)
ping: #使用的模块
[root@pubserver ansible]# ansible-playbook --syntax-check test_ping.yml #检查文件语法
playbook: test_ping.yml
[root@pubserver ansible]# ansible-playbook test_ping.yml #执行剧本
file模块
## 编写剧本完成以下目标
# 在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
[root@pubserver ansible]# ansible-playbook --syntax-check fileop.yml
playbook: fileop.yml
[root@pubserver ansible]# ansible-playbook fileop.yml
copy模块
## |和>的区别:|保留换行符;>不保留换行符
# 一剧本一剧多任务样例
[root@pubserver ansible]# vim copy_con.yml
---
- name: test | and >
hosts: webservers
tasks:
- name: test |
copy:
dest: /tmp/f1.txt
content: |
Hello World!
Hello Linux!
- name: test >
copy:
dest: /tmp/f2.txt
content: >
Hello Ansbile!
Hello Playbook!
[root@pubserver ansible]# ansible-playbook --syntax-check copy_con.yml
playbook: copy_con.yml
[root@pubserver ansible]# ansible-playbook copy_con.yml
# 检查|效果,目标主机文件内为2行
[root@pubserver ansible]# ansible webservers -a "cat /tmp/f1.txt"
web1 | CHANGED | rc=0 >>
Hello World!
Hello Linux!
web2 | CHANGED | rc=0 >>
Hello World!
Hello Linux!
# 检查>效果,目标主机文件内为1行
[root@pubserver ansible]# ansible webservers -a "cat /tmp/f2.txt"
web2 | CHANGED | rc=0 >>
Hello Ansbile! Hello Playbook!
web1 | CHANGED | rc=0 >>
Hello Ansbile! Hello Playbook!
user模块
## 编写剧本完成以下目标
# 在webservers组中的主机上创建john用户,它的uid是1040,主组是daemon,密码为123
# 在webservers组中的主机上删除tom用户
# 一剧本多剧一任务样例
[root@pubserver ansible]# vim man_user.yml
---
- name: create user
hosts: webservers
tasks:
- name: add user
user:
name: john
uid: 1040
group: daemon
password: "{{'123'|password_hash('sha512')}}"
state: present
- name: delete user
hosts: webservers
tasks:
- name: del user
user:
name: tom
state: absent
remove: true
[root@pubserver ansible]# ansible-playbook --syntax-check man_user.yml
[root@pubserver ansible]# ansible-playbook man_user.yml
[root@pubserver ansible]# ansible webservers -a "id john" #黄色结果,命令执行成功
[root@pubserver ansible]# ansible webservers -a "id tom" #红色结果,命令执行失败
磁盘管理综合应用
## 编写剧本完成以下目标
# 在web1主机的/dev/vdc磁盘上创建2个分区,分区1为1G,分区2为5G
# 在web1主机创建名为my_vg的卷组,由vdc1和vdc2组成
# 在web1主机的my_vg卷组上创建名为my_lv大小为2G的逻辑卷
# 将web1主机的my_lv逻辑卷格式化成ext4文件系统
# 将web1主机的my_lv逻辑卷永久挂载到/data目录
# 一剧本一剧多任务
[root@pubserver ansible]# vim disk.yml
---
- name: manage disk
hosts: web1
tasks:
- name: create partition 1
parted:
device: /dev/vdc
label: gpt
number: 1
part_end: 1GiB
state: present
- name: create partition 2
parted:
device: /dev/vdc
label: gpt
number: 2
part_start: 1GiB
part_end: 6GiB
state: present
- name: create vg #创建卷组,名字为my_vg,卷组由/dev/vdc1和/dev/vdc2组成
lvg:
vg: my_vg
pvs: #也可以写成pvs: /dev/vdc1,/dev/vdc2
- /dev/vdc1
- /dev/vdc2
state: present
- name: create lv #创建逻辑卷
lvol:
vg: my_vg
lv: my_lv
size: 2G
state: present
- name: format lv #格式化逻辑卷my_lv
filesystem:
dev: /dev/my_vg/my_lv
fstype: ext4
- name: mount lv #实现开机自动挂载
mount:
src: /dev/my_vg/my_lv
path: /data
fstype: ext4
state: mounted
[root@pubserver ansible]# ansible-playbook --syntax-check disk.yml
playbook: disk.yml
[root@pubserver ansible]# ansible-playbook disk.yml
[root@pubserver ansible]# ansible web1 -a "lsblk;vgs;lvs;df -hT | grep data;tail -1 /etc/fstab"
yum模块
## 管理系统软件样例
# 在webservers组安装httpd/php/php-mysqlnd软件,安装Development Tools组,更新系统所有软件
[root@pubserver ansible]# yum group list #获取包组名称
[root@pubserver ansible]# vim pkgs.yml
---
- name: manage packages
hosts: webservers
tasks:
- name: install pkg
yum:
name:
- httpd
- php
- php-mysqlnd
state: present
- name: install group
yum:
name: "@Development Tools" # @组名,开发工具
state: present
- name: update available pkg #等效于执行yum update
yum:
name: '*' #*指系统上面已安装的所有软件
state: latest #把系统上已经安装的软件包更新到最新版本
[root@pubserver ansible]# ansible-playbook --syntax-check pkgs.yml
playbook: pkgs.yml
[root@pubserver ansible]# ansible-playbook pkgs.yml
## 补充说明多软件包写法
name: httpd,php,php-mysqlnd
name: [httpd,php,php-mysqlnd]
Ansible Playbook剧本
使用Playbook剧本的目的
将需要经常执行的任务写入一个文件(剧本),适用于周期性执行的复杂任务
剧本中可以包含多个任务并可以重复使用
Playbook剧本要求按照YAML格式编写
YAML是什么
YAML(YAML Ain't Markup Language)
是一种人类可读性高且面向数据序列化的格式
是一种格式而不是语言
具备易读性、简洁和可扩展性,对人类友好,支持跨语言操作
常用于配置文件、数据传输等场景
YAML语法格式
文件以 .yaml 或 .yml 扩展名为常见
文件一般以---作为第一行,不是必须的,但是常用
键值对使用冒号:表示,冒号后面必须有空格
数组使用-表示,-后面必须有空格
相同的层级必须有相同的缩进。如果缩进不对,则有语法错误。每一级缩进,建议2个空格
全文不能使用tab,必须使用空格
YAML格式数据样例
## 键值对样例
- "诗仙": "李白"
或
- "诗仙":
"李白"
## 数组样例
- "诗人": ["李白", "杜甫"]
或
- "诗人":
- "李白"
- "杜甫"
## 综合样例
- "诗人":
- "唐代":
- "李白"
- "杜甫"
- "宋代":
- "苏轼"
- "李清照"
配置VIM编辑器
## 编辑vimrc文件,配置yml编写约束
[root@pubserver ansible]# vim ~/.vimrc
set nu ai et paste ts=4
autocmd FileType yaml setlocal ai et ts=2 sw=2
set cursorline
set cursorcolumn
Playbook剧本样例
一个剧本(Playbook)可以包含多个剧(Play)
每个剧(Play)用于在指定的主机或组上执行一个或多个任务(Task)
每个任务(Task)由模块和参数组成
## 剧本样例
---
- 名字: 三兄弟初遇
人物: 刘备,关羽,张飞
场景:
- 场景一: 刘备卖草鞋
- 场景二: 关羽卖绿豆
- 场景三: 张飞卖肉
- 场景四: 三人相遇
- 名字: 三英战吕布
人物: 刘备,关羽,张飞,吕布,曹操,袁绍
- 场景一: 吕布叫阵
- 场景二: 张飞大战吕布
- 场景三: 关张大战吕布
- 场景四: 刘关张三英战吕布
- 名字: 三顾茅庐
人物: 刘备,关羽,张飞,诸葛亮,书童
- 场景一: 一请诸葛亮
- 场景二: 二请诸葛亮
- 场景三: 三请诸葛亮
Playbook基础语法
ping模块
## 编写Playbook使用ping模块测试网络连通
[root@pubserver ansible]# vim test_ping.yml
---
- name: test network #剧本名称(可选项)
hosts: all #作用主机(组)
tasks: #任务
- name: test via ping #任务1(名称可选,可以写中文)
ping: #使用的模块
[root@pubserver ansible]# ansible-playbook --syntax-check test_ping.yml #检查文件语法
playbook: test_ping.yml
[root@pubserver ansible]# ansible-playbook test_ping.yml #执行剧本
file模块
## 编写剧本完成以下目标
# 在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
[root@pubserver ansible]# ansible-playbook --syntax-check fileop.yml
playbook: fileop.yml
[root@pubserver ansible]# ansible-playbook fileop.yml
copy模块
## |和>的区别:|保留换行符;>不保留换行符
# 一剧本一剧多任务样例
[root@pubserver ansible]# vim copy_con.yml
---
- name: test | and >
hosts: webservers
tasks:
- name: test |
copy:
dest: /tmp/f1.txt
content: |
Hello World!
Hello Linux!
- name: test >
copy:
dest: /tmp/f2.txt
content: >
Hello Ansbile!
Hello Playbook!
[root@pubserver ansible]# ansible-playbook --syntax-check copy_con.yml
playbook: copy_con.yml
[root@pubserver ansible]# ansible-playbook copy_con.yml
# 检查|效果,目标主机文件内为2行
[root@pubserver ansible]# ansible webservers -a "cat /tmp/f1.txt"
web1 | CHANGED | rc=0 >>
Hello World!
Hello Linux!
web2 | CHANGED | rc=0 >>
Hello World!
Hello Linux!
# 检查>效果,目标主机文件内为1行
[root@pubserver ansible]# ansible webservers -a "cat /tmp/f2.txt"
web2 | CHANGED | rc=0 >>
Hello Ansbile! Hello Playbook!
web1 | CHANGED | rc=0 >>
Hello Ansbile! Hello Playbook!
user模块
## 编写剧本完成以下目标
# 在webservers组中的主机上创建john用户,它的uid是1040,主组是daemon,密码为123
# 在webservers组中的主机上删除tom用户
# 一剧本多剧一任务样例
[root@pubserver ansible]# vim man_user.yml
---
- name: create user
hosts: webservers
tasks:
- name: add user
user:
name: john
uid: 1040
group: daemon
password: "{{'123'|password_hash('sha512')}}"
state: present
- name: delete user
hosts: webservers
tasks:
- name: del user
user:
name: tom
state: absent
remove: true
[root@pubserver ansible]# ansible-playbook --syntax-check man_user.yml
[root@pubserver ansible]# ansible-playbook man_user.yml
[root@pubserver ansible]# ansible webservers -a "id john" #黄色结果,命令执行成功
[root@pubserver ansible]# ansible webservers -a "id tom" #红色结果,命令执行失败
磁盘管理综合应用
## 编写剧本完成以下目标
# 在web1主机的/dev/vdc磁盘上创建2个分区,分区1为1G,分区2为5G
# 在web1主机创建名为my_vg的卷组,由vdc1和vdc2组成
# 在web1主机的my_vg卷组上创建名为my_lv大小为2G的逻辑卷
# 将web1主机的my_lv逻辑卷格式化成ext4文件系统
# 将web1主机的my_lv逻辑卷永久挂载到/data目录
# 一剧本一剧多任务
[root@pubserver ansible]# vim disk.yml
---
- name: manage disk
hosts: web1
tasks:
- name: create partition 1
parted:
device: /dev/vdc
label: gpt
number: 1
part_end: 1GiB
state: present
- name: create partition 2
parted:
device: /dev/vdc
label: gpt
number: 2
part_start: 1GiB
part_end: 6GiB
state: present
- name: create vg #创建卷组,名字为my_vg,卷组由/dev/vdc1和/dev/vdc2组成
lvg:
vg: my_vg
pvs: #也可以写成pvs: /dev/vdc1,/dev/vdc2
- /dev/vdc1
- /dev/vdc2
state: present
- name: create lv #创建逻辑卷
lvol:
vg: my_vg
lv: my_lv
size: 2G
state: present
- name: format lv #格式化逻辑卷my_lv
filesystem:
dev: /dev/my_vg/my_lv
fstype: ext4
- name: mount lv #实现开机自动挂载
mount:
src: /dev/my_vg/my_lv
path: /data
fstype: ext4
state: mounted
[root@pubserver ansible]# ansible-playbook --syntax-check disk.yml
playbook: disk.yml
[root@pubserver ansible]# ansible-playbook disk.yml
[root@pubserver ansible]# ansible web1 -a "lsblk;vgs;lvs;df -hT | grep data;tail -1 /etc/fstab"
yum模块
## 管理系统软件样例
# 在webservers组安装httpd/php/php-mysqlnd软件,安装Development Tools组,更新系统所有软件
[root@pubserver ansible]# yum group list #获取包组名称
[root@pubserver ansible]# vim pkgs.yml
---
- name: manage packages
hosts: webservers
tasks:
- name: install pkg
yum:
name:
- httpd
- php
- php-mysqlnd
state: present
- name: install group
yum:
name: "@Development Tools" # @组名,开发工具
state: present
- name: update available pkg #等效于执行yum update
yum:
name: '*' #*指系统上面已安装的所有软件
state: latest #把系统上已经安装的软件包更新到最新版本
[root@pubserver ansible]# ansible-playbook --syntax-check pkgs.yml
playbook: pkgs.yml
[root@pubserver ansible]# ansible-playbook pkgs.yml
## 补充说明多软件包写法
name: httpd,php,php-mysqlnd
name: [httpd,php,php-mysqlnd]
原文地址:https://blog.csdn.net/qq_50655286/article/details/143960897
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!