playbook初识和简单使用

回顾

自定义变量
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服务端提供挂载点给web01web02

环境

主机名 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)\n"
        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';
posted @ 2020-06-13 23:14  看萝卜在飘  阅读(725)  评论(0编辑  收藏  举报