zoukankan      html  css  js  c++  java
  • 使用ansible安装sersync、nfs、rsync、mariadb、nginx、php部署wordpress

    ansible练习

    1.安装rsync

    2.安装nfs

    3.sersync

    4.mariadb

    5.安装nginx php

    6.部署wordpress

    #### 目录结构
    [root@m01 ansible]# ll
    total 0
    drwxr-xr-x 2 root root  6 Jun 15 17:11 group_vars
    drwxr-xr-x 2 root root  6 Jun 15 17:11 host_vars
    drwxr-xr-x 2 root root  6 Jun 15 17:10 mariadb
    drwxr-xr-x 2 root root  6 Jun 15 17:10 nfs
    drwxr-xr-x 2 root root 25 Jun 15 17:11 rsync
    drwxr-xr-x 2 root root  6 Jun 15 17:10 web
    
    #### 主机清单
    [root@m01 ansible]# 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
    [db_group]
    db01 ansible_ssh_host=10.0.0.51
    [install_nfs:children]
    web_group
    nfs_group
    [install_rsync:children]
    nfs_group
    backup_group
    
    #### 定义变量
    [root@m01 ansible]# vim group_vars/install_rsync
    rsync_user: zls
    rsync_pwd: 123
    
    [root@m01 ansible]# vim group_vars/all
    web_user_group: www
    
    #### base基础优化
    1.创建www用户和组
    2.开启防火墙
    3.开启nfs,http,https,rsync端口
    4.关闭selinux
    
    - hosts: all
      tasks:
        - name: Create {{ web_user_group }} Group
          group:
            name: "{{ web_user_group }}"
            gid: 666
            state: present
    
        - name: Create {{ web_user_group }} User
          user:
            name: "{{ web_user_group }}"
            uid: 666
            group: "{{ web_user_group }}"
            shell: /sbin/nologin
            create_home: False
    
        - name: Start FireWalld Server
          service:
            name: firewalld
            state: started
    
        - name: Open Port
          firewalld:
            service: "{{ item }}"
            state: enabled
            permanent: no
            with_items:
              - nfs
              - http
              - https
              - rsyncd
    
        - name: Stop Selinux
          selinux:
            state: disabled
    
    
    #### 安装rsync
    提前准备:配置文件
    uid = {{ web_user_group }}
    gid = {{ web_user_group }}
    port = 873
    fake super = yes
    use chroot = no
    max connections = 200
    timeout = 600
    ignore errors
    read only = false
    list = false
    auth users = {{ rsync_user }}
    secrets file = /etc/rsync.passwd
    log file = /var/log/rsyncd.log
    #####################################
    [{{ rsync_dir }}]
    comment = welcome to oldboyedu backup!
    path = {{ rsync_dir }}
    
    1.安装rsync
    2.配置rsync
    3.创建密码文件
    4.创建目录
    5.启动rsync服务
    
    ########################   部署Rsync  ######################
        - name: Install Rsync Server
          yum:
            name: rsync
            state: present
          when: ansible_fqdn == 'nfs' or ansible_fqdn == 'backup'
    
        - name: Configure Rsync Config
          template:
            src: /ansible/rsync/rsyncd.conf
            dest: /etc/rsyncd.conf
          when: ansible_fqdn == 'backup'
    
        - name: Create Rsync Pass File
          copy:
            content: "{{ rsync_user }}:{{ rsync_pwd }}"
            dest: /etc/rsync.passwd
            mode: 0600
          when: ansible_fqdn == 'backup'
    
        - name: Create {{ rsync_dir }} Directory
          file:
            path: /{{ rsync_dir }}
            owner: "{{ web_user_group }}"
            group: "{{ web_user_group }}"
            mode: 0755
            state: directory
          when: ansible_fqdn == 'backup'
    
        - name: Start Rsync Server
          service:
            name: rsyncd
            state: started
            enabled: true
          when: ansible_fqdn == 'backup'
    
    #### 安装nfs
    提前准备:挂载目录中的用户图片等...
    1.安装nfs
    2.配置nfs
    3.创建共享目录
    4.解压用户图片文件
    5.启动nfs服务
    
    ########################   部署NFS  ######################
        - name: Install NFS Server
          yum:
            name: nfs-utils
            state: present
          when: ansible_fqdn == 'nfs' or ansible_fqdn is match 'web*'
    
        - name: Configure NFS Config
          copy:
            content: "/{{ nfs_dir }} 172.16.1.0/24(rw,sync,all_squash,anonuid=666,anongid=666)"
            dest: /etc/exports
          when: ansible_fqdn == 'nfs'
    
        - name: Create  {{ nfs_dir }} Directory
          file:
            path: /{{ nfs_dir }}
            owner: "{{ web_user_group }}"
            group: "{{ web_user_group }}"
            mode: 0755
            state: directory
          when: ansible_fqdn == 'nfs'
    
        - name: Start NFS Server
          service:
            name: nfs-server
            state: started
            enabled: true
          when: ansible_fqdn == 'nfs'
    
    #### 部署sersync
    提前准备:
    1.sersync安装包
    -rw-r--r-- 1 root root 727290 Jun 15 10:19 sersync2.5.4_64bit_binary_stable_final.tar.gz
    2.sersync配置文件
        <inotify>
            <delete start="true"/>
            <createFolder start="true"/>
            <createFile start="true"/>
            <closeWrite start="true"/>
            <moveFrom start="true"/>
            <moveTo start="true"/>
            <attrib start="true"/>
            <modify start="true"/>
        </inotify>
    
        <sersync>
            <localpath watch="/{{ nfs_dir }}">
                <remote ip="172.16.1.41" name="{{ rsync_dir }}"/>
                <!--<remote ip="192.168.8.39" name="tongbu"/>-->
                <!--<remote ip="192.168.8.40" name="tongbu"/>-->
            </localpath>
            <rsync>
                <commonParams params="-az"/>
                <auth start="true" users="{{ rsync_user }}" passwordfile="/etc/rsync.pas"/>
                <userDefinedPort start="false" port="874"/><!-- port=874 -->
                <timeout start="false" time="100"/><!-- timeout=100 -->
                <ssh start="false"/>
            </rsync>
    
    1.解压sersync: GNU-Linux-x86
    2.安装inotify-tools
    3.配置sersync
    4.创建密码文件
    5.启动sersync
    
    ########################   部署sersync  ######################
        - name: Install Inotify-tools
          yum:
            name: inotify-tools
            state: present
          when: ansible_fqdn == 'nfs'
    
        - name: Unarchive Sersync Server
          unarchive:
            src: /ansible/sersync/sersync2.5.4_64bit_binary_stable_final.tar.gz
            dest: /usr/local/
          when: ansible_fqdn == 'nfs'
    
        - name: Configure Sersync Config
          template:
            src: /ansible/sersync/confxml.xml
            dest: /usr/local/GNU-Linux-x86/confxml.xml
          when: ansible_fqdn == 'nfs'
    
        - name: Create Rsync Client Pass File
          copy:
            content: "{{ rsync_pwd }}"
            dest: /etc/rsync.pas
            mode: 0600
          when: ansible_fqdn == 'nfs'
    
        - name: Start Sersync Server
          shell: "/usr/local/GNU-Linux-x86/sersync2 -dro /usr/local/GNU-Linux-x86/confxml.xml"
          when: ansible_fqdn == 'nfs'
    
    #### 部署mariadb
    提前准备SQL语句
    
    1.安装mariadb-server
    2.启动mariadb
    3.创建wp_user用户
    4.导入wordpress.sql文件
    
    ########################   部署mariadb  ######################
        - name: Install MariaDB Server
          yum:
            name:
              - mariadb-server
              - MySQL-python
            state: present
          when: ansible_fqdn == 'db01'
    
        - name: Start MariaDB Server
          service:
            name: mariadb
            state: started
            enabled: true
          when: ansible_fqdn == 'db01'
    
        - name: Create WordPress User
          mysql_user:
            name: wp_user
            password: '123'
            host: '%'
            priv: '*.*:ALL'
            state: present
          when: ansible_fqdn == 'db01'
    
        - name: Push SQL File to DB
          copy:
            src: /ansible/mariadb/wordpress.sql
            dest: /tmp/wordpress.sql
          when: ansible_fqdn == 'db01'
    
        - name: Import WordPress Data
          mysql_db:
            state: import
            name: all
            target: /tmp/wordpress.sql
          when: ansible_fqdn == 'db01'
    
    #### 部署ngx和php和wp
    提前准备:
    1.nginx主配置文件
    2.nginx虚拟主机配置
    3.php的www.conf
    4.nginx_php安装包
    5.wordpress安装包
    
    步骤:
    1.安装nginx和php
    2.配置nginx和php
    3.创建站点目录
    4.解压代码
    5.启动nginx和php
    6.挂载站点目录
    
    ########################   部署nginx、php、wordpress  ######################
        - name: Unarchive Nginx and PHP
          unarchive:
            src: /ansible/web/nginx_php.tgz
            dest: /root
          when: ansible_fqdn is match 'web*'
    
        - name: Install Nginx and PHP
          yum:
            name: /root/nginx_php/{{ item }}
            state: present
          with_items: "{{ nginx_php_packages }}"
          when: ansible_fqdn is match 'web*'
    
        - name: Push Nginx PHP Conf
          copy:
            src: "{{ item.src }}"
            dest: "{{ item.dest }}"
          with_items:
            - { src: "/ansible/web/nginx.conf",dest: "/etc/nginx/nginx.conf" }
            - { src: "/ansible/web/www.zls.com.conf",dest: "/etc/nginx/conf.d/www.zls.com.conf" }
            - { src: "/ansible/web/www.conf",dest: "/etc/php-fpm.d/www.conf" }
          when: ansible_fqdn is match 'web*'
    
        - name: Create HTML Dir
          file:
            path: /code
            owner: "{{ web_user_group }}"
            group: "{{ web_user_group }}"
            state: directory
          when: ansible_fqdn is match 'web*'
    
        - name: Unarchive WordPress Package
          unarchive:
            src: /ansible/web/wordpress.tgz
            dest: /code
            owner: "{{ web_user_group }}"
            group: "{{ web_user_group }}"
          when: ansible_fqdn is match 'web*'
    
        - name: Start Nginx Server
          service:
            name: "{{ item }}"
            state: started
            enabled: true
          with_items:
            - nginx
            - php-fpm
          when: ansible_fqdn is match 'web*'
    
        - name: Mount NFS Share Directory
          mount:
            path: /code/wordpress/wp-content/uploads
            src: 172.16.1.31:/{{ nfs_dir }}
            fstype: nfs
            state: mounted
          when: ansible_fqdn is match 'web*'
    
    

    playbook触发器 handler

    handler用来执行某些条件下的任务,比如当配置文件发生变化的时候,通过notify触发handler去重启服务。

    在saltstack中也有类似的触发器,写法相对Ansible简单,只需要watch,配置文件即可。

    大白话:监控某一个步骤,一旦该步骤发生了变化,则立马触发该步骤的触发器,执行对应的步骤

    注意:
    1.无论多少个task通知了相同的handlers,handlers仅会在所有tasks结束后运行一次。
    
    2.Handlers只有在其所在的任务被执行时,才会被运行;如果一个任务中定义了notify调用Handlers,但是由于条件判断等原因,该任务未被执行,那么Handlers同样不会被执行。
    
    3.Handlers只会在每一个play的末尾运行一次;如果想在一个playbook中间运行Handlers,则需要使用meta模块来实现。例如: -meta: flush_handlers。(不要强制执行)
    
    4.如果一个play在运行到调用Handlers的语句之前失败了,那么这个Handlers将不会被执行。我们可以使用meta模块的--force-handlers选项来强制执行Handlers,即使Handlers所在的play中途运行失败也能执行。(不要强制执行)
    
    5.不能使用handlers替代tasks
    

    触发器的写法:

    - hosts: web01
      task:
        - name: Push Nginx PHP Conf
          copy:
            src: "{{ item.src }}"
            dest: "{{ item.dest }}"
          with_items:
            - { src: "/ansible/web/nginx.conf",dest: "/etc/nginx/nginx.conf" }
            - { src: "/ansible/web/www.zls.com.conf",dest: "/etc/nginx/conf.d/www.zls.com.conf" }
            - { src: "/ansible/web/www.conf",dest: "/etc/php-fpm.d/www.conf" }
          when: ansible_fqdn is match 'web*'
          notify: Restart Nginx And PHP
          
     
      handlers:
        - name: Restart Nginx And PHP
          service:
            name: "{{ item }}"
            state: restarted
          with_items:
            - nginx
            - php-fpm
    
    注意:tasks中的notify名字必须和handlers中的- name名字对应上,否则触发器和任务没有做任何关联
    

    tag标签

    默认情况下,Ansible在执行一个playbook时,会执行playbook中定义的所有任务,Ansible的标签(tag)功能可以给单独任务甚至整个playbook打上标签,然后利用这些标签来指定要运行playbook中的个别任务,或不执行指定的任务。

    打标签的方式

    1.对一个task打一个标签

    我只想推送nginx的配置文件

        - name: Push Nginx PHP Conf
          copy:
            src: "{{ item.src }}"
            dest: "{{ item.dest }}"
          with_items:
            - { src: "/ansible/web/nginx.conf",dest: "/etc/nginx/nginx.conf" }
            - { src: "/ansible/web/www.zls.com.conf",dest: "/etc/nginx/conf.d/www.zls.com.conf" }
            - { src: "/ansible/web/www.conf",dest: "/etc/php-fpm.d/www.conf" }
          when: ansible_fqdn is match 'web*'
          notify: Restart Nginx And PHP
          tags: config_nginx
    
    #### 运行:
    [root@m01 ansible]# ansible-playbook lnmp.yml  -t config_nginx
    

    2.对一个task打多个标签

    有一个功能任务,我安装nginx的时候需要创建www用户,安装nfs的时候,需要创建www用户,安装rsync的时候需要创建www用户

    创建www用户这个功能,有多个任务都需要使用

    tag: install_nginx

    tag: install_nfs

    tag: install_rsync

        - name: Create {{ web_user_group }} Group
          group:
            name: "{{ web_user_group }}"
            gid: 666
            state: present
          tags:
            - install_nginx
            - install_nfs
            - install_rsync
    
    [root@m01 ansible]# ansible-playbook lnmp.yml  -t install_nginx
    
        - name: Push Nginx PHP Conf
          copy:
            src: "{{ item.src }}"
            dest: "{{ item.dest }}"
          with_items:
            - { src: "/ansible/web/nginx.conf",dest: "/etc/nginx/nginx.conf" }
            - { src: "/ansible/web/www.zls.com.conf",dest: "/etc/nginx/conf.d/www.zls.com.conf" }
            - { src: "/ansible/web/www.conf",dest: "/etc/php-fpm.d/www.conf" }
          when: ansible_fqdn is match 'web*'
          notify: Restart Nginx And PHP
          tags: 
            - congfig_nginx
            - install_nginx
    

    3.对多个task打一个标签

    我只想重新安装nginx

    1.安装nginx

    tag: install_nginx

    2.配置nginx打一个标签

    tag: install_nginx

        - name: Unarchive Nginx and PHP
          unarchive:
            src: /ansible/web/nginx_php.tgz
            dest: /root
          when: ansible_fqdn is match 'web*'
          tags: install_nginx
    
        - name: Install Nginx and PHP
          yum:
            name: /root/nginx_php/{{ item }}
            state: present
          with_items: "{{ nginx_php_packages }}"
          when: ansible_fqdn is match 'web*'
          tags: install_nginx
    
        - name: Push Nginx PHP Conf
          copy:
            src: "{{ item.src }}"
            dest: "{{ item.dest }}"
          with_items:
            - { src: "/ansible/web/nginx.conf",dest: "/etc/nginx/nginx.conf" }
            - { src: "/ansible/web/www.zls.com.conf",dest: "/etc/nginx/conf.d/www.zls.com.conf" }
            - { src: "/ansible/web/www.conf",dest: "/etc/php-fpm.d/www.conf" }
          when: ansible_fqdn is match 'web*'
          notify: Restart Nginx And PHP
          tags:
            - congfig_nginx
            - install_nginx
    
        - name: Create HTML Dir
          file:
            path: /code
            owner: "{{ web_user_group }}"
            group: "{{ web_user_group }}"
            state: directory
          when: ansible_fqdn is match 'web*'
          tags: install_nginx
    
        - name: Unarchive WordPress Package
          unarchive:
            src: /ansible/web/wordpress.tgz
            dest: /code
            owner: "{{ web_user_group }}"
            group: "{{ web_user_group }}"
          when: ansible_fqdn is match 'web*'
          tags: install_nginx
    
        - name: Start Nginx Server
          service:
            name: "{{ item }}"
            state: started
            enabled: true
          with_items:
            - nginx
            - php-fpm
          when: ansible_fqdn is match 'web*'
          tags: install_nginx
    
        - name: Mount NFS Share Directory
          mount:
            path: /code/wordpress/wp-content/uploads
            src: 172.16.1.31:/{{ nfs_dir }}
            fstype: nfs
            state: mounted
          when: ansible_fqdn is match 'web*'
          tags: install_nginx
    
    #### 运行:
    [root@m01 ansible]# ansible-playbook lnmp.yml  -t install_nginx
    
    -t:运行指定的tag
    --skip-tags:跳过指定的tag
    

    playbook的复用

    只调用task:include_tasks
    调用整个task文件:include (新版本:import_playbook)

    在saltstack中,叫做top file入口文件。

    示例一:

    [root@m01 m01]# cat task.yml 
    - hosts: web_group
      vars:
        - http_port: 8080
    
      tasks:
        - include_tasks: task_install.yml
        - include_tasks: task_configure.yml
        - include_tasks: task_start.yml
    
      handlers:
        - name: Restart Httpd Server
          systemd:
            name: httpd
            state: restarted
    
    [root@m01 m01]# cat task_install.yml 
    - name: Install Http Server
      yum:
        name: httpd
        state: present
    
    [root@m01 m01]# cat task_configure.yml 
    - name: configure httpd server
      template:
        src: ./httpd.j2
        dest: /etc/httpd/conf/httpd.conf
      notify: Restart Httpd Server
    
    [root@m01 m01]# cat task_start.yml 
    - name: start httpd server
      service:
        name: httpd
        state: started
        enabled: yes
    

    示例二

    - include: httpd.yml
    - include: nfs.yml
    - include: rsync.yml
    

    示例三

    - import_playbook: httpd.yml
    - import_playbook: nfs.yml
    - import_playbook: rsync.yml
    

    忽略错误

    默认playbook会检测task执行的返回状态,如果遇到错误则会立即终止playbook的后续task执行,然鹅有些时候playbook即使执行错误了也要让其继续执行。

    加入参数:ignore_errors:yes 忽略错误

    [root@m01 ~]# cat ignore.yml
    - hosts: web_group
      tasks:
        - name: Ignore False
          command: /bin/false
          ignore_errors: yes
          
        - name: touch new file
          file:
            path: /tmp/zls.txt
            state: touch
    
  • 相关阅读:
    Ajax的工作原理
    ios 应用多语言自由切换实现
    开源码应用之Eclipse篇
    搜索引擎solr和elasticsearch
    字符串截取进阶
    nginx源代码分析--nginx模块解析
    C#网络编程系列文章(五)之Socket实现异步UDPserver
    mysql存储引擎的种类与差别(innodb与myisam)
    程序的记事本--log4net
    在海思hisiv100nptl平台上交叉编译并安装SRS
  • 原文地址:https://www.cnblogs.com/zabcd/p/13368145.html
Copyright © 2011-2022 走看看