zoukankan      html  css  js  c++  java
  • Linux:综合架构批量管理服务(ansible)-- 下

    综合架构批量管理服务之--ansible

    00. 介绍部分

    1) 利用剧本功能简单完成服务一键化部署
    2) 主机清单配置
    3) 剧本的扩展配置功能
    4) 多个剧本如何进行整合
    5) 剧本的角色目录???

    01. 知识回顾

    1) 将所有模块进行了讲解说明

    command	模块: 	在远程主机上执行命令操作	默认模块
    shell		模块:  	在远程主机上执行命令操作		万能模块
    								PS: 有时剧本不能反复执行!!!
    script	模块: 	批量执行本地脚本
    copy		模块:		用于批量分发传输数据信息
    fetch		模块:		用于将远程主机数据进行拉取到本地管理主机
    file		模块: 	修改数据属性信息/创建数据信息
    yum			模块:		用于安装和卸载软件包
    service	模块:		用于管理服务的运行状态 
    user		模块:		用于批量创建用户并设置密码信息
    mount		模块:		用于批量挂载操作
    cron		模块: 	批量部署定时任务信息
    ping		模块:		远程管理测试模块
      			ansible 172.16.1.31 -m ping
    

    2) ansible服务剧本功能

    剧本的组成部分:

    剧本的语法规范:

    1. 空格规范: 实现缩进功能
    2. 冒号规范: 实现键值定义
    3. 横线规范: 实现列表显示

    02. 利用剧本完成服务一键化部署-rsync:

    rsync 服务部署
    nfs 服务部署
    sersync 服务部署

    全网备份项目之-rsync

    rsync服务剧本编写:

    准备工作:

    1. 熟悉软件部署流程
    2. 熟悉ansible软件模块使用
    3. 熟悉ansible剧本编写规范
      ansible:
      ad-hoc临时实现批量管理功能(模块)--- 命令
      playbook 永久实现批量管理功能(剧本)--- 脚本
    [root@m01 ansible-playbook]# cat rsync_server.yaml 
    - hosts: rsync_server
      tasks:
    - name: 01-install rsync  
      yum: name=rsync state=installed
    - name: 02-push conf file
      copy: src=/etc/ansible/server_file/rsync_server/rsyncd.conf dest=/etc/
    - name: 03-create user
      user: name=rsync create_home=no shell=/sbin/nologin
      #shell: useradd rsync -M -s /sbin/nologin --shell在剧本中不能反复执行,rsync用户存在时会报错
    - name: 04-create backup dir
      file: path=/backup state=directory owner=rsync group=rsync
    - name: 05-create password file
      copy: content=rsync_backup:oldboy123 dest=/etc/rsync.password mode=600
    - name: 06-start rsync server
      service: name=rsyncd state=started enabled=yes
    
    - hosts: rsync_clients
      tasks:
    - name: 01-install rsync
      yum: name=rsync state=installed
    - name: 02-create password file
      copy: content=oldboy123 dest=/etc/rsync.password mode=600
    - name: 03-create test file
      file: dest=/tmp/test.txt  state=touch
    - name: 04-check test
      shell: rsync -avz /tmp/test.txt rsync_backup@172.16.1.41::backup --password-file=/etc/rsync.password
    
    

    剧本编写常见错误:

    剧本语法规范是否符合(空格 冒号 短横线)
    剧本中模块使用是否正确
    剧本中一个name标识下面只能写一个模块任务信息
    剧本中尽量不要大量使用shell模块

    03. 如何配置主机清单

    主机清单的配置方法官方地址:
    https://docs.ansible.com/ansible/latest/user_guide/intro_inventory.html

    说明:/etc/ansible/hosts文件中[]表示[组名],方便批量使用主机ip地址的标签
    最初的配置只有主机ip地址

    cat /etc/ansible/hosts
    172.16.1.31
    172.16.1.41
    172.16.1.7
    

    调用方式:

    ansible all -a "hostname"
    或者
    ansible 172.16.1.31,172.16.1.41 -a "hostname"
    

    第一种方式: 分组配置主机信息

    cat /etc/ansible/hosts
    [web]
    172.16.1.7
    172.16.1.8
    172.16.1.9
    
    [data]
    172.16.1.31
    172.16.1.41
    

    操作过程

    [root@m01 ansible-playbook]# ansible data -a "hostname"
    172.16.1.31 | CHANGED | rc=0 >>
    nfs01
    
    172.16.1.41 | CHANGED | rc=0 >>
    backup
    
    [root@m01 ansible-playbook]# ansible web -a "hostname"
    172.16.1.7 | CHANGED | rc=0 >>
    web01
    

    第二种方式: 主机名符号匹配配置

    [web]
    172.16.1.[7:9]   ---表示7-9共3台主机
    [web]
    web[01:03]       ---表示1-3共3台主机,但前提条件是/etc/hosts中已经配置好地址解析
    

    第三种方式: 跟上非标准远程端口

    [web]
    web01:52113 或
    172.16.1.7:52113
    操作命令:ansible web01 -a "hostname"
    

    第四种方式: 主机使用特殊的变量

    此种设置方式可以不提前分发ssh公钥即可使用

    [web]   ---方法一
    172.16.1.7 ansible_ssh_port=52113 ansible_ssh_user=root ansible_ssh_pass=123456
    [web]   ---方法二
    web01 ansible_ssh_host=172.16.1.7 ansible_ssh_port=52113 ansible_ssh_user=root ansible_ssh_pass=123456
    
    

    第五种方式: 主机组名嵌入配置

    [rsync:children]--- 嵌入子组信息,rsync包含rsync_server组合rsync_client组,需要使用参数children
    rsync_server
    rsync_client
    
    [rsync_server]
    172.16.1.41
    
    [rsync_client]
    172.16.1.31
    172.16.1.7
    

    下面的嵌入式变量方式配置主机,此种方式了解即可,后续其他地方会有用

    [web:vars] --- 嵌入式变量信息
    ansible_ssh_host=172.16.1.7
    ansible_ssh_port=52113
    ansible_ssh_user=root
    ansible_ssh_pass=123456
    [web]
    web01
    
    ### 组web中web01主机会调用web:vars的变量值,功能同上述第四种方式方法二
    

    04. 剧本的扩展功能配置

    针对剧本/etc/ansible/ansible_playbook/rsync_server.yaml做变量信息优化
    cp rsync_server.yaml rsync_server_varinfo.yaml

    a.在剧本中设置变量信息

    方式一:直接在剧本文件中编写

    vars:
    oldboy01: data01
    oldboy02: data02

    注意变量引用:使用 {{ 变量 }}

    使用方法:

    [root@m01 ansible-playbook]# cat rsync_server_varinfo.yaml 
    - hosts: rsync_server
      vars: 
        backupdir: /data
        passfile: rsync-password
      tasks:
        - name: 01-install rsync
          yum: name=rsync state=installed 
        - name: 02-push conf file
          copy: src=/etc/ansible/server_file/rsync_server/rsyncd.conf dest=/etc/
        - name: 03-create user
          user: name=rsync create_home=no shell=/sbin/nologin
          #shell: useradd rsync -M -s /sbin/nologin
        - name: 04-create backup dir
          file: path={{ backupdir }} state=directory owner=rsync group=rsync
        - name: 05-create password file
          copy: content=rsync_backup:oldboy123 dest=/etc/{{ passfile }} mode=600
        - name: 06-start rsync server
          service: name=rsyncd state=started enabled=yes
    
    - hosts: rsync_clients
      vars: 
        passfile: rsync-password
      tasks:
        - name: 01-install rsync
          yum: name=rsync state=installed 
        - name: 02-push conf file
          copy: src=/etc/ansible/server_file/rsync_server/rsyncd.conf dest=/etc/
        - name: 03-create password file
          copy: content=oldboy123 dest=/etc/{{ passfile }} owner=root group=root mode=600
        - name: 04-start rsyncd server,set enabled.
          service: name=rsyncd state=started enabled=yes
        - name: 05-create test file
          file: dest=/tmp/test.txt state=touch
        - name: 06-check test data backup
          shell: rsync -avz /tmp/test.txt rsync_backup@172.16.1.41::data --password-file=/etc/{{ passfile }}
    

    方式二:在命令行中进行指定

    ansible-playbook --extra-vars=oldboy01=data01
    使用方法:可将上述变量定义部分注释掉,但剩下变量引用,这时引用的变量为临时变量,需要从命令行获取值
    参数 --extra-vars 可用短格式 -e
    [root@m01 ansible-playbook]# cat rsync_server_varinfo.yaml 
    - hosts: rsync_server
     #vars: 
     #   backupdir: /data
     #   passfile: rsync-password
      tasks:
     ...
     - hosts: rsync_clients
     # vars: 
     #   passfile: rsync-password
      tasks:
      ...
    命令执行前可先删除对应目录和密码文件再进行测试
    [root@m01 ansible-playbook]# ansible-playbook --extra-var backupdir=/data -e passfile=/etc/rsync-password
    

    方式三:在主机清单文件中编写

    [oldboy]
    oldboy01=data01
    oldboy02=data02

    ## 配置信息vars部分
    [root@m01 ansible-playbook]# cat /etc/ansible/hosts
    [rsync:children]
    rsync_server
    rsync_clients
    
    [rsync_server]
    172.16.1.41
    [rsync_server:vars]
    backupdir=/data
    passfile=rsync-password
    
    [rsync_clients]
    172.16.1.7
    172.16.1.31
    [rsync_clients:vars]
    passfile=rsync-password
    
    ##执行
    [root@m01 ansible-playbook]# ansible-playbook rsync_server_varinfo.yaml 
    
    

    注意问题:如果三种方式中都配置了,三种方式的有效优先级为:
    最优先:命令行变量设置 (很少使用)
    次优先:剧本中变量设置 (使用最多)
    最后:主机清单变量设置 (使用次多)

    可通过三种方式都配置不同变量进行测试优先级

    ##剧本中:
    backupdir=/data01
    passfile=/rsync-password01
    ##主机清单文件中:
    backupdir=/data03
    passfile=/rsync-password03
    
    ##命令行执行:--检测出/data02文件夹生成,命令行设置最优先
    [root@m01 ansible-playbook]#ansible-playbook --extra-var backupdir=/data02 -e passfile=/etc/rsync-password02 rsync_server_varinfo.yaml 
    
    ##命令行执行:--检测出/data01文件夹生成,剧本中变量设置次优先
    [root@m01 ansible-playbook]#ansible-playbook  rsync_server_varinfo.yaml 
    
    ##注释掉剧本中变量设置后,命令行执行:--检测出/data03文件夹生成,主机清单中变量设置最后
    [root@m01 ansible-playbook]#ansible-playbook  rsync_server_varinfo.yaml 
    
    

    拓展思考:如何全局设置变量(在roles,剧本整合部分介绍)

    b.在剧本中设置注册信息

    说明:注册信息功能相当于定义一个变量,然后调用变量
    比如在检查是否安装了rsync服务时,可通过查看端口,但是ansible的shell模块只提示ok,并不显示具体端口信息,这时就能使用注册功能,显示脚本执行的信息
    使用方法:

    cd /etc/ansible/ansible-playbook/
    cp rsync_server.yaml rsync_server_reginfo.yaml
    cat rsync_server_reginfo.yaml
    - hosts: rsync_server
      tasks:
        - name: 01-install rsync
          yum: name=rsync state=installed 
        - name: 02-push conf file
          copy: src=/etc/ansible/server_file/rsync_server/rsyncd.conf dest=/etc/
        - name: 03-create user
          user: name=rsync create_home=no shell=/sbin/nologin
          #shell: useradd rsync -M -s /sbin/nologin
        - name: 04-create backup dir
          file: path=/backup state=directory owner=rsync group=rsync
        - name: 05-create password file
          copy: content=rsync_backup:oldboy123 dest=/etc/rsync.password mode=600
        - name: 06-start rsync server
          service: name=rsyncd state=started enabled=yes
    ## 以下部分为register info
        - name: 07-check server port info
          shell: netstat -lntup|grep 873        ---端口信息
          register: get_server_port             ---定义保存端口信息的变量
        - name display port name
          debug: msg={{ get_server_port.stdout_lines }}   ---debug调用变量输出信息,stdout_lines是标准输出格式显示的作用
    
    ## 执行结果
    [root@m01 ansible-playbook]# ansible-playbook rsync_server_reginfo.yaml 
    ...
    TASK [07-check server port info] ****************************************************************************************
    changed: [172.16.1.41]
    
    TASK [display port name] ************************************************************************************************
    ok: [172.16.1.41] => {
        "msg": [
            "tcp        0      0 0.0.0.0:873             0.0.0.0:*               LISTEN      936/rsync           ", 
            "tcp6       0      0 :::873                  :::*                    LISTEN      936/rsync           "
        ]
    }
    
    

    c.在剧本中设置判断信息

    如何指定判断条件:
    (ansible_hostname == "nfs")
    setup模块中显示被管理主机系统的详细信息

    获取内置变量方法:

    ansible rsync_server -m setup -a "filter=ansible_hostname"   -- ansible_hostname变量由setup模块提供
    常见主机信息:
    ansible_all_ipv4_addresses 			--显示ipv4信息
    ansible_devices									--仅显示磁盘信息
    ansible_distribution						--显示是什么系统,例如:centos,suse等
    ansible_distribution_major_version --显示系统主版本
    ansible_distribution_version		--显示系统版本
    ansible_machine									--显示系统类型,32位,64位
    ansible_eth0										--仅显示eth0的信息
    ansible_hostname								--显示主机名
    ansible_kernel									--显示内核版本
    ansible_lvm											--显示lvm相关信息
    ansible_memtotal_mb							--显示系统总内存
    ansible_memfree_mb							--显示系统可用内存
    ansible_swaptotal_mb						--显示总的swap内存
    ansible_swapfree_mb							--显示swap内存的可用内存
    ansible_mounts									--显示磁盘系统挂在情况
    ansible_processor								--显示CPU的个数(具体显示每个CPU的型号)
    ansible_vcpus	p	p								--显示总哦的CPU个数(只显示个数)
    

    获取子项信息的方法:只获取eth0中的ipv4信息,但只有在脚本中才能起作用,在命令行不生效
    ansible rsync_server -m setup -a "filter=ansible_eth0[ipv4]"
    使用方法:

    [root@m01 ansible-playbook]# cp rsync_server.yaml rsync_server_when.yaml 
    [root@m01 ansible-playbook]# cat rsync_server_when.yaml 
    - hosts: rsync_server
      tasks:
        - name: 01-install rsync
          yum: name=rsync state=installed 
        - name: 02-push conf file
          copy: src=/etc/ansible/server_file/rsync_server/rsyncd.conf dest=/etc/
        - name: 03-create user
          user: name=rsync create_home=no shell=/sbin/nologin
          #shell: useradd rsync -M -s /sbin/nologin
        - name: 04-create backup dir
          file: path=/backup state=directory owner=rsync group=rsync
        - name: 05-create password file
          copy: content=rsync_backup:oldboy123 dest=/etc/rsync.password mode=600
        - name: 06-start rsync server
          service: name=rsyncd state=started enabled=yes
    
    - hosts: rsync_clients
      tasks:
        - name: 01-install rsync
          yum: name=rsync state=installed 
        - name: 02-push conf file
          copy: src=/etc/ansible/server_file/rsync_server/rsyncd.conf dest=/etc/
        - name: 03-create password file
          copy: content=oldboy123 dest=/etc/rsync.password owner=root group=root mode=600
        - name: 04-start rsyncd server,set enabled.
          service: name=rsyncd state=started enabled=yes
        - name: 05-create test_nfs file
          file: dest=/tmp/test_nfs.txt state=touch
          when: (ansible_hostname == "nfs01")				##上一行执行的判断条件,ansible_hostname由setup模块提供
        - name: 05-create test_web file
          file: dest=/tmp/test_web.txt state=touch
          when: (ansible_hostname == "web01")				##上一行执行的判断条件
        - name: 06-check test nfs data backup
          shell: rsync -avz /tmp/test_nfs.txt rsync_backup@172.16.1.41::backup --password-file=/etc/rsync.password
          when: (ansible_hostname == "nfs01")				##上一行执行的判断条件
        - name: 07-check test web data backup
          shell: rsync -avz /tmp/test_web.txt rsync_backup@172.16.1.41::web --password-file=/etc/rsync.password
          when: (ansible_hostname == "web01")				##上一行执行的判断条件
    ## 注意在/etc/ansible/server_file/rsync_server/rsyncd.conf中增加web模块,并在41上增加对应目录,修改数组为chown rsync.rsync /web
    [root@m01 ansible-playbook]# ansible-playbook rsync_server_when.yaml 
    
    

    d.在剧本中设置循环信息

    循环的功能:yaml文件中有相同的模块时,使用循环进行合并
    cd /etc/ansible/ansible-playbook/ && cp rsync_server.yaml rsync_server_loop.yaml
    模块内定义变量,使用with_items赋值调用

    #循环结束 BEGIN
    - name: 02-push conf file && password file
    copy: src=/etc/ansible/server_file/rsync_server/{{ item.src }} dest={{ item.dest }} mode={{ item.mode }}  ##定义copy模块变量src,dest,mode
    with_items:		##变量赋值并引用
      - { src: 'rsyncd.conf', dest: '/etc/', mode: '644' }
      - { src: 'rsync.password', dest: '/etc/', mode: '600' }
    # 循环结束 END
    

    使用方法:

    [root@m01 ansible-playbook]# cat rsync_server_loop.yaml 
    - hosts: rsync_server
      tasks:
        - name: 01-install rsync
          yum: name=rsync state=installed 
        # 循环开始BEGIN  
        # 同一个name中有多个不同模块时直接报错,相同模块时会出现警告,只执行最后一个模块,此时使用循环功能
        #- name: 02-push conf file && password file
        #  copy: src=/etc/ansible/server_file/rsync_server/rsyncd.conf dest=/etc/
        #  copy: content=rsync_backup:oldboy123 dest=/etc/rsync.password mode=600
        #  将上述copy内容修改为格式大致相同
        #  copy: src=/etc/ansible/server_file/rsync_server/rsyncd.conf    dest=/etc/ mode=644
        #  copy: src=/etc/ansible/server_file/rsync_server/rsync.password dest=/etc/ mode=600
        - name: 02-push conf file && password file
          copy: src=/etc/ansible/server_file/rsync_server/{{ item.src }} dest={{ item.dest }} mode={{ item.mode }}  ##定义copy模块变量src,dest,mode
          with_items:		##变量赋值并引用
            - { src: 'rsyncd.conf', dest: '/etc/', mode: '644' }
            - { src: 'rsync.password', dest: '/etc/', mode: '600' }
        # 循环结束 END
        - name: 03-create user
          user: name=rsync create_home=no shell=/sbin/nologin
          #shell: useradd rsync -M -s /sbin/nologin
        - name: 04-create backup dir
          file: path=/backup state=directory owner=rsync group=rsync
        #copy 模块放到上面的copy模块部分
        #- name: 05-create password file
        #  copy: content=rsync_backup:oldboy123 dest=/etc/rsync.password mode=600
        - name: 06-start rsync server
          service: name=rsyncd state=started enabled=yes
    
    - hosts: rsync_client
      tasks:
        - name: 01-install rsync
          yum: name=rsync state=installed 
        - name: 02-push conf file
          copy: src=/etc/ansible/server_file/rsync_server/rsyncd.conf dest=/etc/
        - name: 03-create password file
          copy: content=oldboy123 dest=/etc/rsync.password owner=root group=root mode=600
        - name: 04-start rsyncd server,set enabled.
          service: name=rsyncd state=started enabled=yes
        - name: 05-create test file
          file: dest=/tmp/test.txt state=touch
        - name: 06-check test data backup
          shell: rsync -avz /tmp/test.txt rsync_backup@172.16.1.41::backup --password-file=/etc/rsync.password
    [root@m01 ansible-playbook]# ansible-playbook rsync_server_loop.yaml
    ...
    

    ansible格式编写:

    - name: install software
      yum: name=wget state=installed
    

    saltstack格式编写:

    - name: install software
      yum:
        name: ['rsync','tree','wget']
        state: installed
    

    e.在剧本中设置错误忽略

    功能:

    在剧本中,前面部分出现错误时,剧本不再往下执行
    若想继续往后执行,需要忽略当前错误,此时即可使用设置错误忽略功能
    可以加入ignore_errors: yes 忽略错误

    使用方法:

    - hosts: all
      remote_user: root
      tasks:
        - name: Ignore False
          command: /bin/false
          ignore_errors: yes
        - name: touch nowfile
          file: path=/tmp/moox_ignore state=touch
    

    f.在剧本中设置标签信息

    功能:

    在剧本中,若只想执行某个模块,或者跳过某个某块时,可以给该模块设置标签
    可以加入tags: tag1 指定模块
    执行时使用参数-t--tags=tag1 指定标签,
    指定执行哪个标签任务:ansible-playbook --tags=tag1 test_tags.yaml
    跳过指定标签执行任务:ansible-playbook --skip-tags=tag1 test_tags.yaml

    使用方法:

    - hosts: all
      remote_user: root
      tasks:
        - name: Ignore False
          command: /bin/false
          tags: tag1
        - name: touch nowfile
          file: path=/tmp/moox_ignore state=touch
    

    g.在剧本中设置触发信息

    h.在剧本中设置剧本整合

    05. 知识总结

    1. rsync服务一键化部署剧本
    2. 主机清单编写方法
      5种方式
    3. 剧本的扩展编写方法
      如何设置变量信息 3种
      如何设置注册信息 debug
      如何设置判断信息 setup

    作业:

    1. 一键化部署全网备份项目

    2. 一键化部署NFS服务

    3. 一键化部署实时同步服务

  • 相关阅读:
    Use 'mysqld --thread_stack=#' to specify a bigger stack.
    Caused by: com.mysql.jdbc.exceptions.MySQLSyntaxErrorException: You have an error in your SQL syntax;
    interface interface com.alibaba.dubbo.common.compiler.Compiler, class line com.alibaba.dubbo.common.compiler.support.JavassistCompiler) in
    javax.servlet.http.HttpServlet was not found on the Java Build Path
    js_jquery单机事件不起作用
    JavaScript 执行环境及作用域
    闭包的使用场景
    YUI css reset
    比较经典的数组去重和数组排序
    css 响应式布局
  • 原文地址:https://www.cnblogs.com/moox/p/12649976.html
Copyright © 2011-2022 走看看