• 综合架构4


    Ansible的介绍

    ansible是一款自动化运维工具,基于Python开发,默认通过SSH协议管理机器,因此,客户端无需任何配置,管理端配置好后即可使用,可以实现批量系统设置、批量程序部署、批量执行命令等功能。

    Ansible的特点

      1、ansible不需要单独安装客户端,也不需要启动任何服务
      2、ansible是python中的一套完整的自动化执行任务模块
      3、ansible playbook 采用yaml配置,对于自动化任务执行过程一目了然

    Ansible组成结构

    • Ansible

      是Ansible的命令工具,核心执行工具;一次性或临时执行的操作都是通过该命令执行。

    • Ansible Playbook

      任务剧本(又称任务集),编排定义Ansible任务集的配置文件,由Ansible顺序依次执行,yaml格式。

    • Inventory

      Ansible管理主机的清单,默认是/etc/ansible/hosts文件。

    • Modules

      Ansible执行命令的功能模块,Ansible2.3版本为止,共有1039个模块。还可以自定义模块。

    • Plugins

      插件,模块功能的补充,常有连接类型插件,循环插件,变量插件,过滤插件,插件功能用的较少。

    • API

      提供给第三方程序调用的应用程序编程接口。

    Ansible的应用环境

    • 应用代码自动化部署
    • 系统管理配置自动化
    • 支持持续交付自动化
    • 支持云计算,大数据平台环境
    • 批量任务执行可以写成脚本,不用分发到远程就可以执行
    • 支持非root用户管理操作,支持sudo
    • 使用python编写,维护更简单。

    Ansible企业应用:部署NFS共享存储

    环境准备:

    一台存储服务器: IP: 172.16.1.31  主机名:nfs01

    一台web服务器: IP: 172.16.1.7  主机名:web01

    nfs安装步骤:

    服务器端

    第一步:下载安装rpcbind、nfs-utils

    第二步:编写配置文件

    第三步:创建存储目录,并将属主修改为nfsnobody

    第四步:启动服务

    客户端:

    第一步:下载安装rpcbind nfs-utils

    第二步:挂载远程存储

    编写主机清单:

    [root@m01 ~]# vim /etc/ansible/hosts
    #定义可以管理的主机清单
    [nfs-server]
    172.16.1.31
     
    [nfs-client]
    172.16.1.7
    #172.16.1.8
    #172.16.1.9
     
    [nfs:children]
    nfs-server
    nfs-client

    编写NFS服务剧本:

    第一个历程:创建目录结构
    [root@m01 ~]# mkdir -p /etc/ansible/roles/{nfs,nfs_server,nfs_client}/{files,handlers,tasks,templates,vars}  
                --- 创建角色目录下面的子目录
    [root@backup ~]# tree /etc/ansible/roles/
    /etc/ansible/roles/
    ├── nfs                   
    │   ├── files       --- 保存需要分发文件目录
    │   ├── handlers    --- 保存触发器配置文件信息
    │   ├── tasks       --- 保存要执行的动作信息文件
    │   ├── templates   --- 保存需要分发模板文件,模板文件中可以设置变量信息
    │   └── vars        --- 保存变量信息文件
    ├── nfs_client
    │   ├── files
    │   ├── handlers
    │   ├── tasks
    │   ├── templates
    │   └── vars
    ├── nfs_server
        ├── files
        ├── handlers
        ├── tasks
        └── vars
     
    第二个历程:在roles目录中创建相关文件
    nfs公共部分:
    1)编写tasks目录中的main.yml
    [root@m01 roles]# cd nfs/tasks/
    [root@m01 tasks]# vim main.yml
    - name: 01-install rpcbind & nfs
      yum:
        name: [ 'rpcbind', 'nfs-utils' ]
        state: installed
     
    nfs_server部分:
    1)编写tasks目录中的main.yml
    [root@m01 ~]# cd /etc/ansible/roles/nfs_server/tasks
    [root@m01 tasks]# vim main.yml
    - name: 02-push conf file
      copy: src=exports dest=/etc/
      notify: restart nfs server  #设置触发通知信息,当exports文件里内容有变化时,发通知给handlers
    - name: 03-create data dir
      file: path={{ Data_dir }} state=directory owner=nfsnobody group=nfsnobody
    - name: start rpcbind & nfs service
      service: name={{ item }} state=started enabled=yes    #循环重启服务    
      with_items:
        - rpcbind
        - nfs
     
    2)编写vars目录中的main.yml
    [root@m01 tasks]# cd ../vars/
    [root@m01 vars]# vim main.yml
    Data_dir: /data
     
    3)编写files目录中的文件
    [root@m01 vars]# cd ../files/
    [root@m01 files]# echo "/data 172.16.1.0/24(rw.sync)" >exports
    [root@m01 files]# cat exports
    /data 172.16.1.0/24(rw,sync)
    [root@m01 files]# vim ../tasks/main.yml
    - name: 02-push conf file
      copy: src=exports dest=/etc/
     
    4)编写handlers目录中的main.yml
    [root@m01 files]# cd ../handlers/
    [root@m01 handlers]# vim main.yml
    - name: restart nfs server
      service: name=nfs state=restarted
     
    nfs_client部分:
    1)编写tasks目录中的main.yml
    [root@m01 tasks]# cd ../../nfs_client/
    [root@m01 nfs_client]# cd tasks/
    [root@m01 tasks]# vim main.yml
    - name: 02-mount nfs
      mount: src=172.16.1.31:{{ Data_dir }} path=/mnt fstype=nfs state=mounted
    - name: 03-check mount info
      shell: df -h|grep {{ Data_dir }}
      register: nfs_dir         #对上面的df -h 进行注册,再通过下面的debug显示出命令执行的结果
    - name: display nfs-dir
      debug: msg={{ nfs_dir.stdout_lines }}
     
    2)编写vars目录中的main.yml
    [root@m01 roles]# cd nfs_client/vars/
    [root@m01 vars]# vim main.yml
    Data_dir: /data
     
    第三个历程:编写一个主剧本文件
    [root@m01 nfs]# cd /etc/ansible/roles/
    [root@m01 roles]# vim site.yml
    - hosts: nfs
      roles:
        - nfs
    - hosts: nfs_server
      roles:
        - nfs_server
    - hosts: nfs_client
      roles:
        - nfs_client
     
    文件编写好后结构
    [root@m01 roles]# tree
    .
    ├── nfs
    │   ├── files
    │   ├── handlers
    │   ├── tasks
    │   │   └── main.yml
    │   ├── templates
    │   └── vars
    ├── nfs_client
    │   ├── files
    │   ├── handlers
    │   ├── tasks
    │   │   └── main.yml
    │   ├── templates
    │   └── vars
    ├── nfs_server
    │   ├── files
    │   │   └── exports
    │   ├── handlers
    │   │   └── main.yml
    │   ├── tasks
    │   │   └── main.yml
    │   ├── templates
    │   └── vars
    │       └── main.yml
    └── site.yml

    Ansible企业应用:实现rsync全网备份

     环境准备:

    一台备份服务器:  IP: 172.16.1.41    主机名:backup

    一台存储服务器:  IP: 172.16.1.31    主机名:nfs01

    一台web服务器:  IP: 172.16.1.7    主机名:web01

     要求:

    1. 把每台服务器的重要数据、配置及脚本备份到本地以及备份服务器。
    2. 本地数据保留7天备份数据
    3. 本地备份文件推送到备份服务器上
    4. 备份服务器保留最近180天备份,并且保留所有周一的备份数据
    5. 将推送到备份服务器的数据进行验证,并将验证结果通过邮箱发送到运维人员邮箱

     备注:利用脚本实现

    rsync安装过程:

    服务器端:

    第一步:下载安装rysnc

    第二步:编写配置文件

    第三步:创建rsync虚拟用户

    第四步:创建备份目录(/backup)

    第五步:启动服务

    第六步:编写脚本

    第七步:设置定时任务

    客户端:

    第一步:下载安装rsync

    第二步:测试rsync服务是否正常

    第三步:编写脚本

    第四步:设置定时任务

    rsync服务端准备工作
        1)编写rsyncd.conf配置文件
    [root@m01 /ansible/rsync_server]# vim rsyncd.conf
    ##create by HQ at 2020
    ###rsyncd.conf start###
     
    uid = rsync
    gid = rsync
    port = 873
    fake super = yes
    use chroot = no
    max connections = 200
    timeout = 300
    pid file = /var/run/rsyncd.pid
    lock file = /var/run/rsync.lock
    log file = /var/log/rsyncd.log
    ignore errors
    read only = false
    list = false
    hosts allow = 172.16.1.0/24
    hosts deny = 0.0.0.0/32
    auth users = rsync_backup
    secrets file = /etc/rsync.password
     
    [backup]
    comment = "backup dir by oldboy"
    path = /backup/
        
        2)编写密码认证文件
    [root@m01 /ansible/rsync_server]# echo "rsync_backup:oldboy123" >/ansible/rsync_server/rsync.password
    [root@m01 /ansible/rsync_server]# chmod 600 rsync.password
     
        3)编写脚本
    [root@m01 /ansible/rsync_server]# vim backup-server.sh
    #!/bin/bash
    #################################
    #       rsync-server脚本        #
    #################################
     
    Backup_dir=/backup
    #del 180 day ago.backup every week1 data
    find $Backup_dir/ -type f -mtime +180 ! -name "*week1*"|xargs rm &>/dev.null
     
    #check backup,create check file
    find $Backup_dir/ -type f -name "finger.txt"|xargs md5sum -c >/tmp/check.txt
     
    #send check to mail
    mail -s "check backup_$(date +%F_week%w -d -"1day") data" 915979992@qq.com </tmp/check.txt
     
    rsync客户端准备工作   
        1)编写密码认证文件
    [root@m01 /ansible/rsync_client]# echo "oldboy123" >/ansible/rsync_client/rsync.password
    [root@m01 /ansible/rsync_client]# chmod 600 rsync.password
     
        2)编写脚本
    #!/bin/bash
    #=======================================#
    #        rsync全网备份客户端脚本          #
    #=======================================#
     
    Backup_dir="/backup"
    IP_info=$(hostname -i)    #hostname -i    获取主机IP
     
    #create backup dir
    mkdir -p $Backup_dir/$IP_info
     
    #tar backup data
    cd /
    tar -zchf $Backup_dir/$IP_info/system_data-$(date +%F_week%w -d -"1day").tar.gz ./var/spool/cron/root ./etc/sysconfig/iptables ./etc/rc.local ./server/scripts/
     
    #del 7 day ago data
    find $Backup_dir/ -type f -mtime +7|xargs rm &>/dev/null
     
    #create finger file
    find $Backup_dir/$IP_info/ -type f -mtime -1 ! -name "finger.txt" | xargs md5sum >> $Backup_dir/$IP_info/finger.txt
     
    #backup push data info
    rsync -avz $Backup_dir/ rsync_backup@172.16.1.41::backup --password-file=/etc/rsync.password

     编写主机清单:

    [rsync_server]
    172.16.1.41
     
    [rsync_client]
    172.16.1.7
    172.16.1.31
     
    [rsync:children]
    rsync_server
    rsync_client

    编写rsync剧本:

    第一个历程:在roles目录创建相关文件
    [root@m01 roles]# mkdir -p {rsync,rsync_server,rsync_client}/{tasks,vars,files,handlers,templates}
    [root@m01 roles]# tree rsync*
    rsync
    ├── files
    ├── handlers
    ├── tasks
    ├── templates
    └── vars
    rsync_client
    ├── files
    ├── handlers
    ├── tasks
    ├── templates
    └── vars
    rsync_server
    ├── files
    ├── handlers
    ├── tasks
    ├── templates
    └── vars
     
    第二个历程:编写main.yml
    rsync公共部分:
    [root@m01 roles]# vim rsync/tasks/main.yml
    - name: 01-install rsync
      yum: name=rsync state=installed
     
    rsync_server部分:
    1)编写tasks目录下的main.yml
    [root@m01 roles]# vim rsync_server/tasks/main.yml
    - name: 02-push conf file & password file & bash file
      template: src={{ item.src }} dest={{ item.dest }} mode={{ item.mode }}
      with_items:
        - { src: 'rsyncd.conf', dest: '/etc/', mode: '644' }
        - { src: '{{ passfile }}', dest: '/etc/', mode: '600' }
        - { src: '{{ scripts }}', dest: '/server/scripts', mode: '755' }
      notify: restart rsyncd
    # ignore_errors: yes
    - name: 03-create user
      user: name=rsync create_home=no shell=/sbin/nologin
    - name: 04-create rsync dir
      file: path={{ backupdir }} state=directory owner=rsync group=rsync
    - name: start rsync server
      service: name=rsyncd state=started enabled=yes
    - name: 06-check server port
      shell: netstat -lntup | grep {{ Port_info }}
      register: get_server_port
    - name: 07-display port info
      debug: msg={{ get_server_port.stdout_lines }}
    - name: 08-set crontab
      cron: minute=1 hour=0 name='rsync backup' job='/bin/bash /server/scripts/backup-server.sh &>/dev/null'
     
    2)编写vars目录下的main.yml
    [root@m01 roles]# vim rsync_server/vars/main.yml
    backupdir: /backup
    Port_info: 873
    passfile: rsync.password
    scripts: backup-server.sh
     
    3)准备files目录下的相关文件(包括配置文件,密码认证,脚本文件等)
    [root@m01 roles]# cp -a /ansible/rsync_server/* rsync_server/files/
    [root@m01 roles]# ll rsync_server//files/
    total 12
    -rwxr-xr-x 1 root root 463 Apr  4 00:22 backup-server.sh
    -rw-r--r-- 1 root root 530 Apr  3 23:35 rsyncd.conf
    -rw------- 1 root root  23 Apr  4 00:17 rsync.password
     
    4)编写templates目录下的相关文件
    [root@m01 roles]# cp -a rsync_server/files/* rsync_server/templates/
    [root@m01 roles]# vim rsync_server/templates/rsyncd.conf
    uid = rsync
    gid = rsync
    port = {{ Port_info }}
    fake super = yes
    use chroot = no
    max connections = 200
    timeout = 300
    pid file = /var/run/rsyncd.pid
    lock file = /var/run/rsync.lock
    log file = /var/log/rsyncd.log
    ignore errors
    read only = false
    list = false
    hosts allow = 172.16.1.0/24
    hosts deny = 0.0.0.0/32
    auth users = rsync_backup
    secrets file = /etc/{{ passfile }}
     
    [backup]
    comment = "backup dir by oldboy"
    path = {{ backupdir }}
    read_only = false
    5)编写handlers目录下的main.yml
    [root@m01 roles]# vim rsync_server/handlers/main.yml
    - name: restart rsyncd
      service: name=rsyncd state=restarted
     
    rsync_client部分:
    1)编写tasks目录下的main.yml
    [root@m01 roles]# cd rsync_client/tasks/
    [root@m01 tasks]# vi main.yml
    - name: 02-create password file & password file
      template: src={{ item.src }} dest={{ item.dest }} mode={{ item.mode }}
      with_items:
        - { src: '{{ passfile }}', dest: '/etc/', mode: '600' }
        - { src: '{{ scripts }}', dest: '/server/scripts/', mode: '755' }
      #tags: t1
    - name: 03-test rsync
      shell: rsync -az /etc/hosts rsync_backup@172.16.1.41::backup --port={{ Port_info }} --password-file=/etc/{{ passfile }}
    - name: 04-set crontab
      cron: minute=0 hour=0 name='rsync backup' job='/bin/bash /server/scripts/{{ scripts }} &>/dev/null'
     
    2)编写vars目录下的main.yml
    [root@m01 tasks]# cd ../vars/
    [root@m01 vars]# vim main.yml
    passfile: rsync.password
    scripts: backup.sh
    Port_info: 873
     
    3)将客户端需要的文件准备好放到files目录下
    [root@m01 vars]# mv /server/scripts/backup.sh /etc/ansible/roles/rsync_client/files/
    [root@m01 vars]# mv /ansible/rsync_client/rsync.password /etc/ansible/roles/rsync_client/files/
     
    4)编写templates目录下文件
    [root@m01 templates]# cp ../files/* .
    [root@m01 templates]# ll
    total 8
    -rwxr-xr-x 1 root root 856 Apr  6 02:08 backup.sh
    -rw------- 1 root root  10 Apr  6 02:08 rsync.password
    [root@m01 templates]# vim backup.sh
    #backup to backup-server
    rsync -az $Backup_dir/ rsync_backup@172.16.1.41::backup --port={{ Port_info }} --password-file=/etc/{{ passfile }}
    [root@m01 roles]# cd rsync_client/tasks/
    [root@m01 tasks]# vi main.yml

    编写rsync主剧本文件
    [root@m01 templates]# cd /etc/ansible/roles/
    [root@m01 roles]# vim site_rsync.yml
    - hosts: rsync
      roles:
        - rsync
    - hosts: rsync_server
      roles:
        - rsync_server
    - hosts: rsync_client
      roles:
        - rsync_client

    测试:将端口号改为888,看看配置文件和脚本里的端口是否更改,能否正常备份数据
    [root@m01 roles]# vim rsync_server/vars/main.yml
    [root@m01 roles]# vim rsync_client/vars/main.yml
    passfile: rsync.password
    scripts: backup.sh
    Port_info: 888
  • 相关阅读:
    算法
    用python代码编写象棋界面,棋盘覆盖问题
    深浅拷贝的原理
    MongoDB简介,安装,增删改查
    DBUtils-Python数据库连接池
    websocket
    Python操作 RabbitMQ、Redis、Memcache、SQLAlchemy
    跨域
    最长公共子序列/子串 LCS(模板)
    寒假作业---蓝桥杯---DFS
  • 原文地址:https://www.cnblogs.com/chenyun1/p/12609994.html
Copyright © 2020-2023  润新知