第三章·自动化运维工具-Ansible playbook
Ansible PlayBook基本概述
什么是playbook
playbook即"剧本",playbook是由以下部分组成的
- play:定义的是主机的角色
- task:定义的是具体执行的任务
- playbook:是由一个或多个play组成,一个play可以包含多个task
简单理解为:使用不同的模块完成一件事情
在Ansible中"剧本文件"是以yml结尾的文件。
在SaltStack中"剧本文件"是以sls结尾的文件。
但是语法,使用的都是yaml语法
PlayBook与ad-hoc
1.PlayBook功能比ad-hoc更全,是对ad-hoc的一种编排.
2.PlayBook能很好的控制先后执行顺序, 以及依赖关系.
3.PlayBook语法展现更加的直观.
4.playbook可以持久使用,ad-hoc无法持久使用.
Yaml语法
语法 | 描述 |
---|---|
缩进 | YAML使用固定的缩进风格表示层级结构,每个缩进由两个空格组成, 不能使用TAB |
冒号 | 以冒号结尾的除外,其他所有冒号后面所有必须有空格 |
短横线 | 表示列表项,使用一个短横杠加一个空格,多个项使用同样的缩进级别作为同一列表 |
- hosts: web_group ## play部分,指定要执行的主机
remote_user: root ## 以root身份执行 (默认)
tasks: ## 定义任务
- name: install httpd and php ## 给任务起名
yum: ## 模块
- httpd ## 动作
- php
- name: configure httpd conf
copy:
src: /root/web/httpd.conf
dest: /etc/httpd/conf
PlayBook部署httpd
安装httpd
# 1.创建工作目录
[root@m01 ~]# mkdir /root/ansible
# 2.编写httpd剧本
[root@m01 ansible]# vim httpd.yml
- hosts: web_group
tasks:
- name: Install httpd
yum:
name: httpd
state: present
# 3.执行剧本
[root@m01 ansible]# ansible-playbook httpd.yml
## 检测剧本语法
[root@m01 ansible]# ansible-playbook --syntax-check httpd.yml
## 检测剧本语法
[root@m01 ansible]# ansible-playbook --syntax-check httpd.yml
启动httpd并加入开机自启
- hosts: web_group
tasks:
- name: Install httpd
yum:
name: httpd
state: present
- name: Start httpd Service
service:
name: httpd
state: started
enabled: True
编写http前端页面
[root@m01 ansible]# cat httpd.yml
- hosts: web_group
tasks:
- name: Install httpd
yum:
name: httpd
state: present
- name: Start httpd Service
service:
name: httpd
state: started
enabled: True
- name: Set Web Index
copy:
content: lw_http_web
dest: /var/www/html/index.html
不同的主机配置不同的网站
目前来说,想要根据不同主机配置不同的网站,我们可以使用多个play的方式,但是在生产环境中,我们需要写循 环,来满足我们的需求,多个play了解即可
[root@m01 ansible]# cat httpd.yml
- hosts: web_group
tasks:
- name: Install httpd
yum:
name: httpd
state: present
- name: Start httpd Service
service:
name: httpd
state: started
enabled: True
- hosts: web01
tasks:
- name: Set Web01 Index
copy:
content: lw_http_web01
dest: /var/www/html/index.html
- hosts: web02
tasks:
- name: Set Web01 Index
copy:
content: lw_http_web02
dest: /var/www/html/index.html
PlayBook实战
环境准备
主机名 | WanIP | LanIP | 服务 |
---|---|---|---|
m01 | 10.0.0.61 | 172.16.1 | Ansible |
nfs | 10.0.0. | 172.16.1 | nfs服务端 |
web01 | 10.0.0. | 172.16.1 | nfs客户端 |
web02 | 10.0.0. | 172.16.1 | nfs客户端 |
部署nfs
#编辑Ansible Inventory
[root@m01 ~]# vim /etc/ansible/hosts
[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
[nfs_group]
nfs ansible_ssh_host=10.0.0.31
[nfs_all:children]
web_group
nfs_group
#创建项目存放目录
[root@m01 ~]# mkdir nfs
#准备nfs配置文件
[root@m01 ~]# cat /root/nfs/nfs.j2
/data 10.0.0.0/24(rw,sync,all_squash,anonuid=666,anongid=666)
[root@m01 ~]# vim /root/nfs/nfs.yml
- 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
#web01和web02挂载目录
- hosts: web_group
tasks:
- name: Mount NFS Server
mount:
path: /opt
src: 10.0.0.31:/data
fstype: nfs
opts: defaults
state: mounted
#检查语法
[root@m01 ~]# ansible-playbook --syntax-check /root/nfs/nfs.yml
playbook: /root/nfs/nfs.yml
#执行
[root@m01 ~]# ansible-playbook /root/nfs/nfs.yml
环境准备
主机名 | 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客户端 |
#创建项目目录
[root@m01 ~]# cd lamp/
#编辑Inventory
[root@m01 lamp]# cat /etc/ansible/hosts
[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
[root@m01 ~]# vim /root/lamp/lamp.yml
- 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: "http://test.driverzeng.com/Nginx_Code/wordpress-5.0.3-zh_CN.tar.gz"
dest: /var/www/html
#解压wordpress
- name: Unarchive WordPress Package
unarchive:
src: /var/www/html/wordpress-5.0.3-zh_CN.tar.gz
dest: /var/www/html
copy: no
#检查语法
[root@m01 lamp]# ansible-playbook --syntax-check /root/lamp/lamp.yml
playbook: /root/lamp/lamp.yml
#执行
[root@m01 lamp]# ansible-playbook /root/lamp/lamp.yml
Comments | NOTHING