• 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)
    "
            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';
    
  • 相关阅读:
    PHP之目录遍历
    PHP之验证码
    PHP之验证码
    PHP之异常处理模式
    PHP之pdo的预处理模式
    PHP之PDO
    PHP之cookie和session
    PHP之MVC
    单例模式
    ThreadLocal
  • 原文地址:https://www.cnblogs.com/syy1757528181/p/13122232.html
Copyright © 2020-2023  润新知