回顾
自定义变量
rsync客户端备份(600)
使用ansible执行一条命令,这个命令就是ad-hoc,临时执行
ansible查看帮助,使用的是ansible-doc命令
把ansible在命令行执行的命令(ad-hoc)写入到文件中,那么这个文件就叫做playbook,通常使用的yml(yaml)语法,可以多次使用
不能使用systemd service模块来管理selinux firewalld
---------------------------------------------------------------------------
1.ping模块,检测
2.setup模块,获取主机信息
3.command模块,执行简单的命令
4.shell模块,执行复杂的命令
5.cron模块,添加定时任务,name注释 state(present absent)
6.copy模块,拷贝, 创建文件或目录,修改已经存在的目录的权限,dest目标目录 owner group mode backup src源
7.file模块,创建文件或目录,修改已经存在的目录的权限,创建软硬连接,path定义目录或文件,state(touch directory absent link hard) owner group mode recurse dest(链接到)
8.yum模块,name(file http),state(present absent latest) disable_gpg_check,download_only=true
9.script模块,-a '/root/dir.sh'
10.synchronize模块, delete=yes(同步) src dest mode=push/pull
11.mount模块 ,name:必选项,'哪个文件挂载',state(present mount absent unmounted)
12.get_url模块,下载,url dest指定下载目录 mode owner group force_basic_auth=yes(覆盖)
13.yum_repository模块,功能:添加,删除,修改yum源,name description baseurl
gpgcheck enabled state
14.systemd模块,远程启停,重载服务 name state(started stoped restarted reloaded enableed=yes daemon_reload自动重载 masked锁)
15.service模块
16.group模块,name state gid
17.user模块,group groups(append),uid password name system
state(absent remove=no)shell generate_ssh_key create_home=false/no
18.unarchive模块,压缩解压 src dest copy
29.selinux state(enforcing permissive disabled)
20.firewalld service port permanent永久 immediate临时生效 state(enabled disabled)
21.lineinfile模块,文本替换,删除,path line state owner
22.stat模块,获取文件或目录信息
-----------------------------------------------------------------------
ansible控制端(m01),上可以创建目录,存放不同的服务的相关文件,这样用起来更方便
mkdir {nginx,php,rsync,nfs,httpd}
rsync是以守护进程的方式启动的
#rsync密码文件的600一定要加
nfs客户端的网段指定要和服务端一致
开启防火墙的情况下,可以指定开启服务或端口(nfs 80 )
ad-hoc写入脚本,添加/bin/bash,就可以做成一个脚本,类似于playbook
写脚本 bash语法
写Python Python语法
写前端 html css js
写playbook yml(yaml)语法
写saltstack yml(yaml)语法,通常以sls结尾
CMDB 资产管理
tailf /var/log/cron #查看crond日志
Ansible PlayBook初识
什么是PlayBook
PlayBook
即"剧本"的意思,PlayBook是由以下部分组成的
play
: 定义的是主机(hosts)的角色。
tasks
: 定义的是具体执行的任务。
playbook
: 由一个或多个play(主机)组成,一个play可以包含多个task(台词,动作)
简单理解为: 使用不同的模块完成一件事情(目的)
在Ansible
中"剧本文件"是以yml结尾的文件。
在SaltStack
中"剧本文件"是以sls结尾的文件。
但是语法,使用的都是yaml
语法
YAML语法
语法 | 描述 |
---|---|
缩进 | YAML使用固定的缩进风格表示层级结构,每个缩进由两个空格组成, 不能使用TAB |
冒号 | 以冒号结尾的除外,其他所有冒号后面必须有空格 |
短横线 | 表示列表项,使用一个短横杠加一个空格,多个项使用同样的缩进级别作为同一列表 |
PlayBook与ad-hoc
特点 | PlayBook | ad-hoc |
---|---|---|
完整性 | √ | ✘ |
持久性 | √ | ✘ |
执行效率 | 低 | 高 |
变量 | 支持 | 不支持 |
耦合度 | 低 | 高 |
1.PlayBook
功能比ad-hoc
更全,是对ad-hoc
的一种编排.
2.PlayBook
能很好的控制先后执行顺序, 以及依赖关系.
3.PlayBook
语法展现更加的直观.
4.playbook
可以持久使用,ad-hoc
无法持久使用.因为playbook可以调用变量
格式一,使用yml语法编辑playbook剧本
[root@m01 ~]# vim a.yml
--- #加不加都可以
- hosts: web01 #PLAY [web01]
tasks: #检查
- name: install tree nfs-utiles #TASK [install tree nfs-utiles]
yum: #模块
name: tree #包名(可以直接指定,或者使用列表项)
state: present #动作
#检查yml语法
[root@m01 ~]# ansible-playbook --syntax-check a.yml
#执行playbook
[root@m01 ~]# ansible-playbook a.yml
#注意2468空格(可以以tasks中的s name中的m 作为参照),yml的报错不准确
#一个hosts就是一个play
#一个name,就是一个安装的注释,第二个注释是指定包名
[root@m01 ~]# ansible-playbook a.yml
web01: ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
已更改=0 无法访问=0 失败=0 跳过=0 解救=0 忽略=0
格式二
[root@m01 ~]# vim a.yml
- hosts: web01
tasks:
- name: istall
yum:
name:
- rsync #列表项
- httpd
state: absent
[root@web01 ~]# rpm -qa|grep httpd #有些包不能被卸载(系统依赖)
httpd-tools-2.4.6-93.el7.centos.x86_64
[root@web01 ~]# rpm -qa|grep rsync
格式三(不推荐)
[root@m01 ~]# vim a.yml
- hosts: web01
tasks:
- name: istall
yum:
name=rsync
state=present
格式四
[root@m01 ~]# vim a.yml
- hosts: web01
tasks:
- name: istall
yum:
name:
- rsync
- httpd
state: present
- name: started
service:
name: rsyncd
state: started
#服务的启动和停止不支持列表项,但是可以使用变量的形式同时操作一台主机上的多个服务
[root@m01 ~]# vim a.yml
- hosts: web01
tasks:
- name: istall
yum:
name:
- rsync
- httpd
state: present
- name: started rsyncd #分别指定启动项
service:
name: rsync
state: started
- name: started httpd
service:
name: httpd
state: started
-------------------------------------
- hosts: all
remote_user: root
vars:
collect_info: "/data/test/{{ansible_all_ipv4['addresses']}}/"
tasks:
- name: create IP directory
file:
name: "{{collect_info}}"
state: directory
---------------------------------------
格式五
[root@m01 ~]# vim a.yml
- hosts: web01
tasks:
- name: istall
yum:
name:
- rsync
- httpd
state: present
- name: started
service:
name: "{{ server }}"
vars: #自定义变量(在模块中定义变量)
server:
- rsyncd
- httpd
state: started
#模拟执行,测试是否可以执行
[root@m01 ~]# ansible-playbook -C a.yml
2.
[root@m01 ~]# cat foo.yml
---
- hosts: all
remote_user: root #指定执行命令的用户
vars: #自定义变量
file_name: zls.txt
tasks:
- name: Create New File
file: name=/tmp/{{ file_name }} state=touch #
需求一:编写安装httpd剧本
#创建目录剧本存放目录
[root@m01 ~]# mkdir httpd
#编辑Inventory
[root@m01 ~]# vim /etc/ansible/hosts
[web_group]
web01 ansible_ssh_host=10.0.0.7
[root@m01 ~]# vim /root/httpd/httpd.yml
- hosts: web01
tasks:
- name: istall
yum:
name:
- httpd
state: present
#检查语法
[root@m01 ~]# ansible-playbook --syntax-check httpd/httpd.yml
#测试安装
[root@m01 ~]# ansible-playbook -C httpd/httpd.yml
需求二:安装完httpd服务并启动加入开机自启
[root@m01 ~]# vim /root/httpd/httpd.yml
---
- 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
#测试安装和启动
[root@m01 ~]# ansible-playbook -C httpd/httpd.yml
需求三:编写网站页面并启动
---
- hosts: web_group
#安装httpd
tasks:
- name: Install httpd Server
yum:
name: httpd
state: present
#配置网站
- name: Config Httpd Server
copy:
content: syy_web_page
dest: /var/www/html/index.html
#启动httpd
- name: Start Httpd Server
systemd:
name: httpd
state: started
enabled: yes
#执行
[root@m01 httpd]# ansible-playbook /root/httpd/httpd.yml
模板
#创建目录剧本存放目录
[root@m01 ~]# mkdir httpd
#编辑Inventory
[root@m01 ~]# vim /etc/ansible/hosts
[web_group]
web01 ansible_ssh_host=10.0.0.7
[root@m01 ~]# vim /root/httpd/httpd.yml
- hosts: web01
tasks:
- name: istall
yum:
name:
- httpd
state: present
- name: started httpd
service:
name: httpd
state: started
- name: create page
copy:
content: syy_page
dest: /var/www/html/index.html
owner: www
group: www
mode: 0644
#检查语法
[root@m01 ~]# ansible-playbook --syntax-check httpd/httpd.yml
#测试安装
[root@m01 ~]# ansible-playbook -C httpd/httpd.yml
#浏览器访问
10.0.0.7
需求四:开启防火墙端口
前提:1.做过秘钥认证 2.主机清单配置无误
1.创建剧本存放目录
[root@m01 ~]# mkdir /ansible -p
2.编辑剧本
[root@m01 ~]# vim /ansible/firewalld.yml
- hosts: web_group
#安装httpd
tasks:
- name: Install httpd Server
yum:
name: httpd
state: present
#配置网站
- name: Config Httpd Server
copy:
content: syy_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: zls_web01_page
dest: /var/www/html/index.html
#单独配置web02页面
- hosts: web02
tasks:
- name: Config Httpd Server
copy:
content: zls_web02_page
dest: /var/www/html/index.html
[root@m01 httpd]# ansible-playbook /root/httpd/httpd.yml
打开浏览器访问网站:
http://10.0.0.7
http://10.0.0.8
#一个playbook里面写多个play,会导致变量的重复获取,影响剧本的执行效率
#可以在content里指定重复获取的变量,web01(ansible_{{ansible}}),这样指定的话就可以避免变量的重复获取,提高剧本执行效率
[root@m01 ~]# ansible-playbook a.yml
PLAY [web01] ***********************************************************************************************
TASK [Gathering Facts] ******* #剧本中一个hosts(play),获取一次所有的变量
#变量的简单使用
[root@m01 ~]# vim a.yml
- hosts: web01
tasks:
- name: istall
yum:
name:
- httpd
state: present
- name: started httpd
service:
name: httpd
state: started
enabled: yes
- name: create page
copy:
content: syy_{{ ansible_fqdn }}_{{ ansible_default_ipv4['address'] }}_page
dest: /var/www/html/index.html
owner: www
group: www
mode: 0644
#用'.'调用字典中的变量
content: syy_{{ansible_fqdn}}_{{ ansible_default_ipv4.address }}_page
#Python中变量的定义和调用
[root@m01 ~]# python
>>> dic={'ip':'10.0.0.7','fqdn':'web01'}
>>> print dic['ip']
10.0.0.7
>>> print dic['fqdn']
web01
>>> quit()
环境
主机名 | 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客户端 | 被控端 |
m01准备
#安装ansible
#编辑Ansible Inventory(配置主机清单)
[root@m01 ~]# vim /etc/ansible/hosts
#推送公钥
#web安装nginx
- hosts: web_group
tasks:
- name: Install Nginx Server
yum:
name: nginx
state: present
#web配置nginx(需要提前修改控制端nginx配置文件)
- name: Configure Nginx Conf
copy:
src: /root/ansible/nginx/nginx.conf
dest: /etc/nginx/nginx.conf
owner: root
group: root
mode: 0644
#web配置虚拟主机
- name: Configure Nginx Server
copy:
src: /root/ansible/nginx/wp.conf
dest: /etc/nginx/conf.d/wp.conf
owner: root
group: root
mode: 0644
#创建web的站点目录
- name: Create HTML Directory
file:
path: /code
owner: www
group: www
mode: 0755
state: directory
#web启动nginx
- name: Start Nginx Server
service:
name: nginx
state: started
enabled: true
#创建默认页面
- hosts: web01
tasks:
- name: Create web01 index.html
copy:
content: web01_page
dest: /code/index.html
owner: www
group: www
mode: 0644
- hosts: web02
tasks:
- name: Create web02 index.html
copy:
content: web02_page
dest: /code/index.html
owner: www
group: www
mode: 0644
环境
主机名 | 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客户端 | 被控端 |
nfs | 10.0.0.31 | 172.16.131 | rsync客户端 | 被控端 |
m01准备
#安装ansible
#编辑Ansible Inventory(配置主机清单)
[root@m01 ~]# vim /etc/ansible/hosts
...
[install_rsync]
web01 ansible_ssh_host=172.16.1.7 asible_ssh_user=root ansible_ssh_port=22
web02 ansible_ssh_host=172.16.1.8 asible_ssh_user=root ansible_ssh_port=22
web03 ansible_ssh_host=172.16.1.9 asible_ssh_user=root ansible_ssh_port=22
backup ansible_ssh_host=172.16.1.41 asible_ssh_user=root ansible_ssh_port=22
nfs ansible_ssh_host=172.16.1.31 asible_ssh_user=root ansible_ssh_port=22
#推送公钥
#创建rsync剧本存放目录
[root@m01 ~]# mkdir /root/ansible/rsync -p
#编辑Inventory(主机清单)
[root@m01 ~]# vim /etc/ansible/rsync/hosts
#准备rsync配置文件
[root@m01 rsyncd]# vim /root/ansible/rsync/rsyncd.conf
#################################### 服务相关配置 ###########################
uid = www
#指定rsync进程启动的用户(打工的),和传送文件的用户---------useradd
gid = www
#指定rsync进程启动的组
port = 873
#指定rsync使用的监听端口(默认873端口,可以改)
fake super = yes
#无需让rsync以root身份运行,允许接收文件的 完整属性(属主属组不变)
use chroot = no
#禁锢指定的目录(只能推到指定的目录,不紧固的话随便推)
max connections = 200
#最大连接数(同时连接的主机数,减少服务端负载)
timeout = 600
#超时时间
ignore errors
#忽略报错
read only = false
#不只读(可读可写)
list = false
#不允许别人查看模块名
#################################### 命令相关配置 ###########################
auth users = bck
#传输文件的用户(相当于密码,没有实际意义),客户端认证1
secrets file = /etc/rsync.passwd
#传输用户文件的密码文件,vim或echo/600,客户端认证2
log file = /var/log/rsyncd.log
#日志文件,使用了rsync之后才会生成
[backupmk]
#模块名,可以随便改,小心大写字母,空格,数字,多模块对应多主机(随便推?),客户端认证3
comment = welcome to oldboyedu backup!
#注释(废物)
path = /backup
#备份的目录-------mkdir/权限属主属组,,客户端认证4
#rsync客户端定时备份脚本
vim /root/ansible/rsync/bf.sh
#!/bin/bash
#主机名:
H=$(hostname)
#内网IP:
IP=$(hostname -I|awk '{print $2}')
#备份到哪: (前面/加后面不加)
na=/backup
#当前时间:
#年月日 时分
C=$(date +%F-%R)
#年月日
D=$(date +%F)
#年月日时分秒
E=$(date +%F-%T)
cde=$D
#备份哪个目录:(前后都不要加根)
A='backup'
#以传参的方式定义一个目录
bf=${na}/${H}_${IP}_${D}
[ -d $bf ]||mkdir -p $bf
#校验
#清理
cd /$A && cd .. &&
tar zcf ${bf}/${H}_${IP}_${cde}.$A.tgz $A
cd ${bf} &&
md5sum ${H}_${IP}_${cde}.$A.tgz >${H}_${IP}_${cde}.$A.tgz.md5sum.passwd
export RSYNC_PASSWORD=123
rsync -az ${na}/ bck@10.0.0.41::backupmk
find $na -mitime +7 ! -name '$na' |xargs rm -rf
crontab -e
# 备份重要配置文件 编辑时间 编辑人:xxx
00 1 * * * /usr/bin/sh /etc/profile.d/bfpzwj.sh >>/dev/null
编写剧本
一键部署rsync
#编写剧本
[root@m01 ~]# vim /root/ansible/rsync/rsyncd.yml
- hosts: install_rsync
tasks:
#创建www组
- name: Create www Group
group:
name: www
gid: 666
state: present
#创建www用户
- name: Create www User
user:
name: www
group: www
uid: 666
create_home: false
shell: /sbin/nologin
state: present
#启动防火墙
- name: Start Firewalld Server
systemd:
name: firewalld
state: started
enabled: yes
#开启防火墙的80 873 443 端口,nfs服务
- name: Open 80 Port
firewalld:
port: 80/tcp
immediate: yes
permanent: yes
state: enabled
- name: Open 443 Port
firewalld:
port: 443/tcp
immediate: yes
permanent: yes
state: enabled
- name: Open 873 Port
firewalld:
port: 873/tcp
immediate: yes
permanent: yes
state: enabled
- name: Open nfs Port
firewalld:
service: nfs
state: enabled
permanent: no
#关闭selinux
- name: Stop SeLinux
selinux:
state: disabled
- hosts: install_rsync
tasks:
#安装rsync
- name: Install Rsyncd Server
yum:
name: rsync
state: present
- hosts: backup_group
tasks:
#推送rsync配置文件
- name: Scp Rsync Config
copy:
src: /root/ansible/rsync/rsyncd.conf
dest: /etc/rsyncd.conf
owner: root
group: root
mode: 0644
#创建密码文件并授权
- name: Create Passwd File
copy:
content: 'bck:123'
dest: /etc/rsync.passwd
owner: www
group: www
mode: 0600
#创建/backup目录
- name: Create backup Directory
file:
path: /backup
state: directory
mode: 0755
owner: www
group: www
recurse: yes
- hosts: install_rsync
tasks:
#启动rsync服务,并加入开机自启
- name: Start Rsyncd Server
systemd:
name: rsyncd
state: started
enabled: yes
#重新启动rsync服务
- name: reStart Rsyncd Server
systemd:
name: rsyncd
state: restarted
#推送定时任务脚本
- hosts: web_group
tasks:
- name: Scp Rsync Config
copy:
src: /root/ansible/rsync/bf.sh
dest: /root/bf.sh
owner: root
group: root
mode: 0644
#编辑定时任务
- name: create backup crond
cron:
name: "backup web data"
job: "/bin/bash /root/bf.sh &>/dev/null"
#检测语法
[root@m01 ~]# ansible-playbook --syntax-check /root/rsyncd/rsyncd.yml
playbook: /root/rsyncd/rsyncd.yml
#测试
[root@m01 ~]# ansible-playbook -C /root/rsyncd/rsyncd.yml
扩展需求:
1.给客户端推送脚本
2.加入crontab做备份
完成刚开始学架构阶段的rsync的实战案例
部署NFS
服务,NFS
服务端提供挂载点给web01
和web02
环境
主机名 | 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客户端 | 被控端 |
m01准备
#安装ansible
#编辑Ansible Inventory
[root@m01 ~]# vim /etc/ansible/hosts
...
[nfs_all:children]
web_group
nfs_group
#推送公钥
#创建项目存放目录
[root@m01 ~]# mkdir /root/ansible/nfs -p
#准备nfs配置文件
[root@m01 ~]# cat /root/ansible/nfs/nfs.exports
/data 10.0.0.0/24(rw,sync,all_squash,anonuid=666,anongid=666)
剧本
一键部署nfs
[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
#启动防火墙
- name: Start Firewalld Server
systemd:
name: firewalld
state: started
enabled: yes
#开启防火墙的80端口
- name: Open 80 Port
firewalld:
port: 80/tcp
immediate: yes
permanent: yes
state: enabled
- name: Open 443 Port
firewalld:
port: 443/tcp
immediate: yes
permanent: yes
state: enabled
- name: Open 873 Port
firewalld:
port: 873/tcp
immediate: yes
permanent: yes
state: enabled
- name: Open nfs Port
firewalld:
service: nfs
state: enabled
permanent: no
- hosts: nfs_group
tasks:
#推送配置文件
- name: Scp NFS Server
copy:
content: "/data 172.16.1.0/24(rw,sync,all_squash,anonuid=666,anongid=666)
"
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
#重启nfs-server
- name: reStart NFS Server
systemd:
name: nfs-server
state: restarted
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
#推送备份脚本到nfs服务器
- name: Push NFS Backup Shell
copy:
src: /root/ansible/nfs/backup.sh
dest: /root/backup.sh
owner: root
group: root
mode: 0755
#添加定时任务
- name: Create Crond
cron:
name: NFS Backup Rsync
job: '/bin/sh /root/backup.sh &>/dev/null'
#检查语法
[root@m01 ~]# ansible-playbook --syntax-check /root/ansible/nfs/nfs.yml
playbook: /root/nfs/nfs.yml
#执行
[root@m01 ~]# ansible-playbook /root/ansible/nfs/nfs.yml
扩展需求:
1.给web提交作业代码
2.部署nfs,并挂载/var/www/html/upload目录
使用playbook
实现一套LAMP
架构。
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客户端 | 被控端 |
web03 | 10.0.0.9 | 172.16.1.9 | nfs客户端 | 被控端 |
2.准备
因为这只是一个练习,所以我们将apache mariadb php全部都写在一个yml文件中,并且放在一个目录下,
注意:在生产中,我们是不会这么做的,我们需要每一个服务单独拎出来,解耦。
#创建项目目录
[root@m01 ~]# mkdir /root/lamp/
#编辑Inventory
[root@m01 lamp]# cat /etc/ansible/hosts
...
[nfs_all:children]
web_group
nfs_group
#自定义变量(变量可以定义在剧本中,也可以定义在文件中)
[root@m01 ~]# vim /root/lamp/web_group
packages:
- httpd
- mariadb-server
- php
- php-mysql
- php-pdo
3.编写剧本
[root@m01 ~]# vim /root/lamp/lamp.yml
- hosts: web_group
tasks:
#安装指定服务和PHP
- name: Install httpd mariadb php Server
yum:
name: "{{ packages }}"
vars:
packages:
- httpd
- mariadb-server
- php
- php-mysql
- php-pdo
#安装httpd
- hosts: web_group
tasks:
- name: Install httpd Server
yum:
name: httpd
state: present
#启动httpd服务
- name: Start httpd Server
systemd:
name: httpd
state: started
enabled: yes
#重新启动httpd服务
- name: reStart httpd Server
systemd:
name: httpd
state: restarted
enabled: yes
#安装mariadb
- hosts: mariadb_group
tasks:
- name: Install mariadb Server
yum:
name: mariadb-server
state: present
#启动mariadb服务
- name: Start httpd Server
systemd:
name: mariadb
state: started
enabled: yes
#重新启动mariadb服务
- name: reStart httpd Server
systemd:
name: mariadb
state: restarted
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: /tmp
#解压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
打开浏览器访问:
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 'zls';