自动化运维工具-Ansible之3-playbook

PlayBook初识

什么是PlayBook?

PlayBook即"剧本","兵书"之意,PlayBook是由以下部分组成的

play: 定义的是主机的角色。(主角还是配角,找哪个明星)

task: 定义的是具体执行的任务。(角色的台词和动作)

playbook: 由一个或多个play(角色)组成,一个play(角色)可以包含多个task(台词,动作,大腕每集拍什么)。

简单理解为: 使用不同的模块完成一件事情


Ansible中"剧本文件"是以yml结尾的文件。

SaltStack中"剧本文件"是以sls结尾的文件。

但使用的都是yaml语法



PlayBook与ad-hoc

特点 PlayBook ad-hoc
完整性
持久性
执行效率
变量 支持 不支持
耦合度
  1. PlayBook功能比ad-hoc更全,是对ad-hoc的一种编排.
  2. PlayBook能很好的控制先后执行顺序,以及依赖关系.
  3. PlayBook语法展现更加的直观.
  4. playbook可以持久使用,ad-hoc无法持久使用.

YAML语法

语法 描述
缩进 YAML使用固定的缩进风格表示层级结构,每个缩进由两个空格组成, 不能使用TAB
冒号 以冒号结尾的除外,其他所有冒号后面所有必须有空格
短横线 表示列表项,使用一个短横杠加一个空格,多个项使用同样的缩进级别作为同一列表
中国:
北京:
上海:
- 浦东新区
- 青浦区
yum:
name: vsftpd
state: present yum:
name:
- httpd
- nginx
- php-fpm
state: present

PlayBook编写

host:对哪些主机进行操作(演员)

remote_user:使用什么用户执行(通行证)

tasks:具体执行任务(台词和动作)

PlayBook部署httpd

环境准备

  1. 创建剧本存放目录
[root@m01 ~]# mkdir /etc/ansible/httpd
  1. 配置主机清单并测试
[root@m01 ~]# vim /etc/ansible/hosts
[web_group]
web01 ansible_ssh_host=10.0.0.7
web02 ansible_ssh_host=10.0.0.8
[root@m01 ~]# ansible web_group -m ping

需求一:安装httpd

[root@m01 ~]# vi /etc/ansible/httpd/httpd.yml
---
- hosts: web_group
# 安装httpd
tasks:
- name: Install httpd Server
yum:
name: httpd
state: present
# 语法检测
[root@m01 ~]# ansible-playbook --syntax-check /etc/ansible/httpd/httpd.yml playbook: /etc/ansible/httpd/httpd.yml
# 安装测试
[root@m01 ~]# ansible-playbook -C /etc/ansible/httpd/httpd.yml PLAY [web_group] *************************************************************************************************************************************************************************************************************************************************************** TASK [Gathering Facts] *********************************************************************************************************************************************************************************************************************************************************
ok: [web02]
ok: [web01] TASK [Install httpd Server] ****************************************************************************************************************************************************************************************************************************************************
changed: [web02]
changed: [web01] PLAY RECAP *********************************************************************************************************************************************************************************************************************************************************************
web01 : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
web02 : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0

需求二:创建网站页面

---
- hosts: web_group
# 安装httpd
tasks:
- name: Install httpd Server
yum:
name: httpd
state: present # 配置网站页面
- name: Config Httpd Server
copy:
content: oldboy_web_page
dest: /var/www/html/index.html

需求三:启动httpd服务并加入开机自启

---
- hosts: web_group
# 安装httpd
tasks:
- name: Install httpd Server
yum:
name: httpd
state: present # 配置网站页面
- name: Config Httpd Server
copy:
content: oldboy_web_page
dest: /var/www/html/index.html # 启动httpd
- name: Start Httpd Server
systemd:
name: httpd
state: started
enabled: yes

需求四:开启防火墙端口

---
- hosts: web_group # 安装httpd
tasks:
- name: Install httpd Server
yum:
name: httpd
state: present # 配置网站页面
- name: Config Httpd Server
copy:
content: oldboy_web_page
dest: /var/www/html/index.html
# 启动httpd
- name: Start Httpd Server
systemd:
name: httpd
state: started
enabled: yes # 启动防火墙
- name: Start Firewalld Server
systemd:
name: firewalld
state: started
enabled: yes # 开启防火墙的80端口
- name: Config Firewalld Server
firewalld:
service: http
immediate: yes
permanent: yes
state: enabled

打开浏览器访问网站:

http://10.0.0.7

http://10.0.0.8

需求五:不同的主机配置不同的网站

目前来说,想要根据不同主机配置不同的网站,我们可以使用多个play的方式,但是在生产环境中,我们需要写循环,来满足我们的需求,多个play了解即可

---
- hosts: web_group # 安装httpd
tasks:
- name: Install httpd Server
yum:
name: httpd
state: present # 启动httpd
- name: Start Httpd Server
systemd:
name: httpd
state: started
enabled: yes # 启动防火墙
- name: Start Firewalld Server
systemd:
name: firewalld
state: started
enabled: yes # 开启防火墙的80端口
- name: Config Firewalld Server
firewalld:
service: http
immediate: yes
permanent: yes
state: enabled # 单独配置web01页面
- hosts: web01 tasks:
- name: Config Httpd Server
copy:
content: oldboy_web01_page
dest: /var/www/html/index.html # 单独配置web02页面
- hosts: web02 tasks:
- name: Config Httpd Server
copy:
content: oldboy_web02_page
dest: /var/www/html/index.html

打开浏览器访问网站:

http://10.0.0.7

http://10.0.0.8

PlayBook实战

实战一:

部署一个backup备份服务器的服务端和客户端


  1. 演员表
主机名 wanIP lanIP 服务 角色
m01 10.0.0.61 172.16.1.61 Ansible 控制端(导演)
backup 10.0.0.41 172.16.1.41 rsync服务端 被控端(男一)
web01 10.0.0.7 172.16.1.7 rsync客户端 被控端(女二)
web02 10.0.0.8 172.16.1.8 rsync客户端 被控端(女二)

  1. 战前准备

灯光,音响,摄像准备...

yum源,用户,配置文件...

# 创建rsync剧本存放目录
[root@m01 ~]# mkdir rsyncd # 准备主机清单
[root@m01 ~]# cat > /etc/ansible/hosts <<EOF
[web_group]
web01 ansible_ssh_host=10.0.0.7
web02 ansible_ssh_host=10.0.0.8 [nfs_group]
nfs ansible_ssh_host=10.0.0.31 [backup_group]
backup ansible_ssh_host=10.0.0.41 [nfs_all:children]
web_group
nfs_group EOF # 准备rsync配置文件
[root@m01 ~]# cat > /root/rsyncd/rsyncd.j2 <<EOF
uid = www
gid = www
port = 873
fake super = yes
use chroot = no
max connections = 200
timeout = 600
ignore errors
read only = false
list = false
auth users = rsync_backup
secrets file = /etc/rsync.passwd
log file = /var/log/rsyncd.log
#####################################
[backup]
comment = welcome to oldboyedu backup!
path = /backup
EOF # 准备客户端脚本
[root@m01 ~]# vi /root/rsyncd/client_rsync_backup.j2
#!/usr/bin/bash # 1.定义变量
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
Host=$(hostname)
Addr=$(ifconfig eth1|awk 'NR==2{print $2}')
Date=$(date +%F)
Dest=${Host}_${Addr}_${Date}
Path=/backup # 2.创建备份目录
[ -d $Path/$Dest ] || mkdir -p $Path/$Dest # 3.备份对应的文件
cd / && \
[ -f $Path/$Dest/system.tar.gz ] || tar czf $Path/$Dest/system.tar.gz etc/fstab etc/rsyncd.conf && \
[ -f $Path/$Dest/log.tar.gz ] || tar czf $Path/$Dest/log.tar.gz var/log/messages var/log/secure && \ # 4.携带md5验证信息
[ -f $Path/$Dest/flag ] || md5sum $Path/$Dest/*.tar.gz >$Path/$Dest/flag_$Date # 5.推送本地数据至备份服务器
export RSYNC_PASSWORD=123456
rsync -avz $Path/ rsync_backup@172.16.1.41::backup # 6.本地保留最近7天的数据
find $Path/ -type d -mtime +7 | xargs rm -rf

  1. 编写剧本
# 编写剧本
[root@m01 ~]# cat > /root/rsyncd/rsyncd.yml <<EOF
- hosts: all
tasks: # 安装rsync
- name: Install Rsyncd Server
yum:
name: rsync
state: present # 创建www组
- name: Create www Group
group:
name: www
gid: 666 # 创建www用户
- name: Create www User
user:
name: www
group: www
uid: 666
create_home: false
shell: /sbin/nologin - hosts: backup_group
tasks: # 推送rsync配置文件
- name: Scp Rsync Config
copy:
src: ./rsyncd.j2
dest: /etc/rsyncd.conf
owner: root
group: root
mode: 0644 # 创建用户密码文件并授权
- name: Create Passwd File
copy:
content: 'rsync_backup:123456'
dest: /etc/rsync.passwd
owner: root
group: root
mode: 0600 # 创建/backup目录
- name: Create backup Directory
file:
path: /backup
state: directory
mode: 0755
owner: www
group: www
recurse: yes # 启动rsync服务并加入开机启动
- name: Start Rsyncd Server
systemd:
name: rsyncd
state: started
enabled: yes - hosts: web_group,nfs_group
tasks: # 创建脚本存放目录
- name: Create scripts Directory
file:
path: /server/scripts
state: directory
mode: 0755
owner: root
group: root
recurse: yes # 推送客户端脚本
- name: Scp Rsync scripts
copy:
src: ./client_rsync_backup.j2
dest: /server/scripts/client_rsync_backup.sh
owner: root
group: root
mode: 0644 # 加入crontab
- name: Crontab Rsync Backup
cron:
name: "Rsync Backup"
minute: "00"
hour: "01"
job: "/bin/bash /server/scripts/client_rsync_backup.sh &>/dev/null"
EOF # 检测语法
[root@m01 ~]# ansible-playbook --syntax-check ./rsyncd/rsyncd.yml playbook: /root/rsyncd/rsyncd.yml # 测试
[root@m01 ~]# ansible-playbook -C ./rsyncd/rsyncd.yml PLAY [all] *********************************************************************************************************************************************************************************************************************************** TASK [Gathering Facts] ***********************************************************************************************************************************************************************************************************************
ok: [backup]
ok: [web02]
ok: [web01] TASK [Install Rsyncd Server] *****************************************************************************************************************************************************************************************************************
changed: [backup]
changed: [web02]
changed: [web01] TASK [Scp Rsync Config] **********************************************************************************************************************************************************************************************************************
changed: [web02]
changed: [web01]
changed: [backup] TASK [Create www Group] **********************************************************************************************************************************************************************************************************************
changed: [backup]
changed: [web01]
changed: [web02] TASK [Create www User] ***********************************************************************************************************************************************************************************************************************
changed: [web02]
changed: [web01]
changed: [backup] TASK [Create backup Directory] ***************************************************************************************************************************************************************************************************************
changed: [web01]
changed: [backup]
changed: [web02] TASK [Start Rsyncd Server] *******************************************************************************************************************************************************************************************************************
changed: [web01]
changed: [web02]
changed: [backup] PLAY RECAP ***********************************************************************************************************************************************************************************************************************************
backup : ok=7 changed=6 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
web01 : ok=7 changed=6 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
web02 : ok=7 changed=6 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0

扩展需求:

完成刚开始学架构阶段的rsync的实战案例


实战二:

部署NFS服务端,提供挂载点给web01web02


  1. 演员表
主机名 wanIP lanIP 服务 角色
m01 10.0.0.61 172.16.1.61 Ansible 控制端(导演)
nfs 10.0.0.31 172.16.1.31 nfs服务端 被控端(男一)
web01 10.0.0.7 172.16.1.7 nfs客户端 被控端(女二)
web02 10.0.0.8 172.16.1.8 nfs客户端 被控端(女二)

  1. 战前准备
# 创建nfs剧本存放目录
[root@m01 ~]# mkdir nfs # 准备主机清单
[root@m01 ~]# cat > /etc/ansible/hosts <<EOF
[web_group]
web01 ansible_ssh_host=10.0.0.7
web02 ansible_ssh_host=10.0.0.8 [nfs_group]
nfs ansible_ssh_host=10.0.0.31 [backup_group]
backup ansible_ssh_host=10.0.0.41 [nfs_all:children]
web_group
nfs_group
EOF # 准备nfs配置文件
[root@m01 ~]# cat > /root/nfs/nfs.j2 <<EOF
/data 10.0.0.0/24(rw,sync,all_squash,anonuid=666,anongid=666)
EOF

  1. 编写剧本
[root@m01 ~]# cat > /root/nfs/nfs.yml <<EOF
- hosts: nfs_all
tasks: # 安装nfs
- name: Install nfs-utils
yum:
name: nfs-utils
state: present # 创建www组
- name: Create www Group
group:
name: www
gid: 666 # 创建www用户
- name: Create www User
user:
name: www
group: www
uid: 666
create_home: false
shell: /sbin/nologin - hosts: nfs
tasks: # 推送配置文件
- name: Scp NFS Server
copy:
src: ./nfs.j2
dest: /etc/exports
owner: root
group: root
mode: 0644 # 创建挂载目录并授权
- name: Create data Directory
file:
path: /data
state: directory
owner: www
group: www
mode: 0755
recurse: yes # 启动nfs-server
- name: Start NFS Server
systemd:
name: nfs-server
state: started
enabled: yes - hosts: web_group
tasks: # web01和web02挂载目录
- name: Mount NFS Server
mount:
path: /opt
src: 10.0.0.31:/data
fstype: nfs
opts: defaults
state: mounted
EOF # 检查语法
[root@m01 ~]# ansible-playbook --syntax-check ./nfs/nfs.yml playbook: /root/nfs/nfs.yml # 执行
[root@m01 ~]# ansible-playbook ./nfs/nfs.yml

  1. 查看web01和web02的挂载情况
[root@web01 ~]# df -h
[root@web02 ~]# df -h

扩展需求:

给web01和web02部署 提交作业代码 后部署nfs,并挂载/var/www/html/upload目录


实战三:

使用playbook部署一套LAMP架构。

部署需求:

  1. 使用yum安装httpd、php、php-mysql、php-pdo、mariadb
  2. 启动httpd、mariadb服务
  3. 下载wordpress代码并部署到httpd站点目录

  1. 演员表
主机名 wanIP lanIP 服务 角色
m01 10.0.0.61 172.16.1.61 Ansible 控制端(导演)
web01 10.0.0.7 172.16.1.7 nfs客户端 被控端(男一)
web02 10.0.0.8 172.16.1.8 nfs客户端 被控端(男一)
  1. 战前准备
# 创建lamp剧本存放目录
[root@m01 ~]# mkdir lamp # 准备主机清单
[root@m01 ~]# cat > /etc/ansible/hosts <<EOF
[web_group]
web01 ansible_ssh_host=10.0.0.7
web02 ansible_ssh_host=10.0.0.8 [backup_group]
backup ansible_ssh_host=10.0.0.41 [backup_all:children]
web_group
backup_group [nfs_group]
nfs ansible_ssh_host=10.0.0.31 [nfs_all:children]
web_group
nfs_group
EOF
  1. 编写剧本

因为这只是一个练习,所以我们将(apache mariadb php全部都写在一个yml文件中,并且放在一个目录下,

注意:在生产中,我们是不会这么做的,我们需要每一个服务单独拎出来,解耦。

[root@m01 ~]# cat > /root/lamp/lamp.yml <<EOF
- hosts: web_group
tasks: # 安装指定服务
- name: Install httpd mariadb php Server
yum:
name: "{{ packages }}"
vars:
packages:
- httpd
- mariadb-server
- php
- php-mysql
- php-pdo # 启动httpd服务并加入开机启动
- name: Start httpd Server
systemd:
name: httpd
state: started
enabled: yes # 启动mariadb服务并加入开机启动
- name: Start httpd Server
systemd:
name: mariadb
state: started
enabled: yes # 下载wordpress
- name: Get Wordpress Package
get_url:
url: "https://cn.wordpress.org/wordpress-5.4.2-zh_CN.tar.gz"
dest: /var/www/html # 解压wordpress
- name: Unarchive Wordpress Package
unarchive:
src: /var/www/html/wordpress-5.4.2-zh_CN.tar.gz
dest: /var/www/html
copy: no
EOF # 检查语法
[root@m01 ~]# ansible-playbook --syntax-check ./lamp/lamp.yml playbook: /root/lamp/lamp.yml # 执行
[root@m01 ~]# ansible-playbook ./lamp/lamp.yml
  1. 打开浏览器访问:

    http://10.0.0.7/wordpress/wp-admin/setup-config.php

    http://10.0.0.8/wordpress/wp-admin/setup-config.php

扩展需求:

1.使用php连接数据库

2.使用Ansible创建数据库wordpress

#类似于:
create database wordpress

3.使用Ansible创建数据库用户wordpress

#类似于:
grant all on *.* to wordpress@'%' identified by 'oldboy';

自动化运维工具-Ansible之3-playbook的更多相关文章

  1. 在CentOS7.6上安装自动化运维工具Ansible以及playbook案例实操

    前言 Ansible是一款优秀的自动化IT运维工具,具有远程安装.远程部署应用.远程管理能力,支持Windows.Linux.Unix.macOS和大型机等多种操作系统. 下面就以CentOS 7.6 ...

  2. 自动化运维工具Ansible详细部署 (转载)

    自动化运维工具Ansible详细部署 标签:ansible 原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://sofar.blog. ...

  3. 自动化运维工具Ansible介绍

    一个由 Python 编写的强大的配置管理解决方案.尽管市面上已经有很多可供选择的配置管理解决方案,但他们各有优劣,而 ansible 的特点就在于它的简洁. 让 ansible 在主流的配置管理系统 ...

  4. 自动化运维工具-Ansible基础

    目录 自动化运维工具-Ansible基础 什么是Ansible 同类型软件对比 Ansible的功能及优点 Ansible的架构 Ansible的执行流程 安装Ansible ansible配置文件 ...

  5. 自动化运维工具-Ansible之7-roles

    自动化运维工具-Ansible之7-roles 目录 自动化运维工具-Ansible之7-roles Ansible Roles基本概述 Ansible Roles目录结构 Ansible Roles ...

  6. 自动化运维工具-Ansible之6-Jinja2模板

    自动化运维工具-Ansible之6-Jinja2模板 目录 自动化运维工具-Ansible之6-Jinja2模板 Ansible Jinja2模板概述 Ansible Jinja2模板使用 Ansib ...

  7. 自动化运维工具-Ansible之5-流程控制

    自动化运维工具-Ansible之5-流程控制 目录 自动化运维工具-Ansible之5-流程控制 playbook条件语句 单条件 多条件 多条件运算 示例 playbook循环语句 with_ite ...

  8. 自动化运维工具-Ansible之4-变量

    自动化运维工具-Ansible之4-变量 目录 自动化运维工具-Ansible之4-变量 变量概述 变量的定义和调用 变量优先级测试 变量优先级测试二 变量注册 facts缓存 变量概述 ​ 变量提供 ...

  9. 自动化运维工具-Ansible之2-ad-hoc

    自动化运维工具-Ansible之2-ad-hoc 目录 自动化运维工具-Ansible之2-ad-hoc Ansible ad-hoc Ansible命令模块 Ansible软件管理模块 Ansibl ...

随机推荐

  1. PyQt(Python+Qt)学习随笔:QTreeWidgetItem项下的子项列表中增加子项的方法

    老猿Python博文目录 专栏:使用PyQt开发图形界面Python应用 老猿Python博客地址 追加子项 QTreeWidgetItem类型的项构建以后,可以通过addChild(QTreeWid ...

  2. VS Code 搭建 Rust 开发环境

    VS Code 搭建 Rust 开发环境 上一篇文章安装和配置好了 Rust 环境后,我们是使用的是简单的文本工具编写 Hello World 入门代码,但是为了提高我们的学习效率,下面安利大家 VS ...

  3. 优化 Webpack 的构建速度

    1.使用高版本的 Webpack 和 Node.js 2.多进程/多实例构建:HappyPack(不维护了).thread-loader 3.压缩代码 webpack-paralle-uglify-p ...

  4. AcWing 334. K匿名序列

    大型补档计划 题目链接 就是把序列分成无数段,每段长度 $ >= K$,然后 \([l, r]\) 这段的花费是 \(S[r] - S[l - 1] - (r - l + 1) * a[l]\) ...

  5. shell 编程 -- 条件判断

    1.按照文件类型进行判断(常用的)-b 判断该文件是否存在-d 判断是否存在,并且是否为目录(是目录就为真)-e 判断该文件是否存在(存在为真)-f 判断文件是否存在,并且是否为普通文件(是普通文件为 ...

  6. Oracle 要慌了!华为终于开源了自家的 Huawei JDK——毕昇 JDK!

    没错,自阿里.腾讯之后,华为也终于开源了自家的 JDK--毕昇 JDK! 免费!免费!免费!!! Oracle 要慌了? 毕昇 JDK 毕昇 JDK 是华为内部 OpenJDK 定制版 Huawei ...

  7. SpringBoot异步调用--@Async详解

    1. 概述   在日常开发中,为了提高主线程的效率,往往需要采用异步调用处理,例如系统日志等.在实际业务场景中,可以使用消息中间件如RabbitMQ.RocketMQ.Kafka等来解决.假如对高可用 ...

  8. 轮廓检测论文解读 | Richer Convolutional Features for Edge Detection | CVPR | 2017

    有什么问题可以加作者微信讨论,cyx645016617 上千人的粉丝群已经成立,氛围超好.为大家提供一个遇到问题有可能得到答案的平台. 0 概述 论文名称:"Richer Convoluti ...

  9. Java带Body内容的Http请求

    使用Java进行Http请求: package test2; import com.mashape.unirest.http.HttpResponse; import com.mashape.unir ...

  10. [日常摸鱼]bzoj2724蒲公英-分块

    区间众数经典题~ http://begin.lydsy.com/JudgeOnline/problem.php?id=4839这里可以提交~ 题意大概就是没有修改的询问区间众数,如果有一样的输出最小的 ...