ansible

作者: mrwangjian | 来源:发表于2020-02-12 16:30 被阅读0次

    老男孩教育61期--week12--系统批量管理服务(ansible)

    01. 课程介绍部分:

    1)ansible软件作用概述
    2)ansible软件功能组成
    3)ansible软件安装配置 (hosts 配置主机清单信息)
    4)ansible软件应用方法 (模块 剧本)
    5)ansible自动部署服务 (rsync nfs sersync)
    6)ansible扩展配置说明
    7)ansible剧本角色配置
    

    02. 知识重点回顾:

    1)网络知识部分补充
       a 网络重要协议原理  ARP
       b 网络知识概念分类  IP  分类  子网划分
       c 网络上网原理介绍  企业上网原理(vlan)  虚拟主机上网原理(nat 桥接 仅主机)
       d 系统网络路由配置  
    2)远程管理服务概念    SSH telnet
    3)远程连接方式说明    基于口令  基于密钥(私钥 公钥)
    4)基于密钥连接配置    利用批量分发公钥脚本
    5)远程服务配置文件    什么是监听信息
    6)远程入侵防范案例    
    

    03. ansible程序服务概念介绍

    ansible软件概念:实现批量管理
    串行批量管理:yum install -y nginx  --> web01(01) web02 web03
    并行批量管理:yum install -y nginx  --> web01 
                                            web02 
                                            web03
    ansible软件作用:
    1)批量管理系统服务
    2)批量管理服务部署
    3)批量分发数据信息
    4)批量采集数据信息
    
    ansible软件对运维帮助:
    01. 提高工作的效率
    02. 提高工作准确度
    03. 减少维护的成本
    04. 减少重复性工作
    
    ansible软件特点说明:
    01. 管理端不需要启动服务程序
    02. 管理端不需要编写配置文件
    03. 服务功能强大
    
    分为:普通开源版(500台-(200~300)) saltstack
          企业架构版 管理端(总) --- 分支管理端  --- 服务器主机     
    

    04. ansible程序功能组成

    ansible主机清单  inventory
    ansible模块功能  module     yum  cron  service  copy  script  shell     命令
    ansible剧本编写  playbook   让多件事进行汇总                            脚本
    

    05. ansible软件安装部署

    准备工作:
    01. 主机公钥分发完毕
    02. 确认epel源更新完毕
    yum install -y ansible
    /etc/ansible/ansible.cfg   默认配置文件
    /etc/ansible/hosts         主机清单       能管理哪些主机
    /etc/ansible/roles         角色目录       规范化配置
    /usr/bin/ansible
    /usr/bin/ansible-playbook
    

    06. ansible程序主机清单配置:/etc/ansible/hosts

    第一种方式:简单配置
       172.16.1.7
       172.16.1.31
       172.16.1.41
       
    第二种方式:分组配置
    [web]
    172.16.1.7
    [data]
    172.16.1.31
    172.16.1.41
       
    第三种方式:符号匹配主机信息
    172.16.1.1 172.16.1.2  .. 172.16.1.200
    [data]
    172.16.1.[30:45]
    web[01:30]
       
    第四种方式:配置特殊变量信息
    特殊变量官方参考:https://docs.ansible.com/ansible/latest/user_guide/intro_inventory.html
    [web]
    172.16.1.7  ansible_user=root  ansible_password=123456  ansible_port=22
    [web]
    web01  ansible_host=172.16.1.7   ansible_user=root  ansible_password=123456  ansible_port=22
       
    第五中方式:嵌入式配置:
    第一种嵌入式:嵌入子组
    [rsync:children]
    rsync_server
    rsync_client
       
    [rsync_server]
    172.16.1.41
       
    [rsync_client]
    172.16.1.7
    172.16.1.31
       
    第二种嵌入式:嵌入变量 (剧本)
    [rsync_client]
    172.16.1.7  
    172.16.1.31
    [rsync_client:vars]
    ansible_user=root
    ansible_password=123456
       
    
    ansible管理多台主机命令:
    语法格式:
    ansible  主机信息  -m(指定使用的模块)  模块名称  -a(指定完成的动作)  "动作操作信息"
    [root@m01 scripts]# ansible 172.16.1.7 -m command -a "hostname"
    172.16.1.7 | CHANGED | rc=0 >>
    web01
    

    07. ansible程序模块功能 总的模块 2000+

    常用的模块:10+
    command  shell(万能) copy     fetch  file 
    script   yum           service  cron   user 
    mount    ping          setup    debug  mysql(相关)
    archive??(压缩)  unarchive(解压)
    
    
    1) command --- 可以批量管理主机执行命令(默认)
    官方:https://docs.ansible.com/ansible/latest/modules/command_module.html#command-module
    参数:
    chdir    --- 在执行命令操作前进行切换目录
    [root@m01 scripts]# ansible 172.16.1.7 -m command -a "chdir=/tmp pwd"
    172.16.1.7 | CHANGED | rc=0 >>
    /tmp
    
    creates  --- 判断一个文件是否存在,如果存在,后续命令不会被执行
    [root@m01 scripts]# ansible 172.16.1.7 -m command -a "creates=/etc/hosts touch /etc/hosts01"
    172.16.1.7 | SUCCESS | rc=0 >>
    skipped, since /etc/hosts exists
    
    removes  --- 判断一个文件是否存在,如果不存在,后续命令不会被执行
    
    2)shell   --- 可以批量管理主机执行命令(万能模块)
    官方:https://docs.ansible.com/ansible/latest/modules/shell_module.html#shell-module
    参数:
    chdir    --- 在执行命令操作前进行切换目录
    [root@m01 scripts]# ansible 172.16.1.7 -m shell -a "chdir=/tmp pwd"
    172.16.1.7 | CHANGED | rc=0 >>
    /tmp
    
    creates  --- 判断一个文件是否存在,如果存在,后续命令不会被执行
    [root@m01 scripts]# ansible 172.16.1.7 -m shell -a "creates=/etc/hosts touch /etc/hosts01"
    172.16.1.7 | SUCCESS | rc=0 >>
    skipped, since /etc/hosts exists
    
    removes  --- 判断一个文件是否存在,如果不存在,后续命令不会被执行 
    
    3)script --- 批量执行脚本信息
    shell  -- 批量多个主机执行脚本
    第一步:编写脚本
    [root@m01 scripts]# cat yum.sh 
    #!/bin/bash
    yum install -y iftop
    
    第二步:将脚本进行分发
    第三步:脚本直接运行(授予执行权限)
    第四步:批量运行脚本
    ansible rsync -m shell -a "/server/scripts/yum.sh"
    
    script -- 批量多个主机执行脚本
    第一步:编写脚本
    [root@m01 scripts]# cat yum.sh 
    #!/bin/bash
    yum install -y iftop
    第二步:批量运行脚本
    ansible rsync -m script -a "/server/scripts/yum.sh"
    
    4)yum  --- 批量部署软件程序
    官方:https://docs.ansible.com/ansible/latest/modules/yum_module.html#yum-module
    参数: 
    name:  指定安装软件的名称
    state:  指定软件安装或卸载
    ansible 172.16.1.7 -m yum -a "name=htop state=installed"
    
    5)service  --- 批量管理服务运行状态
    官方: 
    name:   指定服务名称
    state:  started  restarted reloaded stopped
    enabled:设置服务是否开机自动运行  yes开机自动运行  no
    ansible 172.16.1.7 -m service -a "name=sshd state=started enabled=yes"
    
    6)copy     --- 将管理端主机数据文件,分发给被管理端
                --- 将被管理端目录中的数据移动到其他目录   172.16.1.31  /etc/hosts  /tmp
    官方:https://docs.ansible.com/ansible/latest/modules/copy_module.html#copy-module
    参数: 
    src:   将管理端什么数据进行分发
    dest:  将数据分发到远程主机什么路径中
    owner: 传输文件之后修改文件属主权限
    group: 传输文件之后修改文件属组权限
    mode:  直接修改文件权限位(12位)
    ansible 172.16.1.7 -m copy -a "src=/etc/hosts dest=/tmp owner=oldboy group=oldboy mode=666"
    
    backup:在分发传输文件之前,将源文件进行备份,按照时间信息备份
    remote_src: no 默认从管理端找寻数据进行分发  yes 默认从被管理端找寻数据进行分发
    ansible 172.16.1.7 -m copy -a "dest=/etc/hosts src=/tmp/hosts.bak owner=oldboy group=oldboy mode=666 remote_src=yes"
    
    content:在分发文件时,在文件中创建简单信息
    ansible 172.16.1.7 -m copy -a "content='oldboy123' dest=/tmp/oldboy.txt  mode=600"
    
    7)fetch   --- 将远程主机数据进行拉取 
    参数: 
    src:   远程主机的数据信息
    dest:   本地保存数据的路径   dest-->path
      
    8) file    --- 修改文件属性信息 用于创建数据信息(文件  目录  链接文件  删除数据)
    官方:https://docs.ansible.com/ansible/latest/modules/file_module.html#file-module
    参数: 
    path:    指定处理数据路径信息
    owner:   传输文件之后修改文件属主权限
    group:   传输文件之后修改文件属组权限
    mode:    直接修改文件权限位(12位)
    state:   touch(创建文件)  directory(创建目录) hard(创建硬链接) link(创建软连接)
             absent(删除数据)
    
    创建文件/目录:
    ansible 172.16.1.7 -m file -a "path=/tmp/oldboy.txt state=touch"
    ansible 172.16.1.7 -m file -a "path=/tmp/oldboy_dir state=directory"
    
    创建链接文件
    ansible 172.16.1.7 -m file -a "src=/tmp/oldboy.txt  path=/tmp/oldboy_soft_link.txt state=link"
    ansible 172.16.1.7 -m file -a "src=/tmp/oldboy.txt  path=/tmp/oldboy_hard_link.txt state=hard"
    
    删除数据信息
    ansible 172.16.1.7 -m file -a "path=/tmp/oldboy_dir state=absent"
    
    9)mount  --- 挂载模块
    官方:https://docs.ansible.com/ansible/latest/modules/mount_module.html#mount-module
    参数: 
    src:    指定需要被挂载存储数据信息 分区/共享目录
    path:   挂载点目录
    fstype: 指定挂载后,文件系统类型   ext3 ext4 xfs nfs
    state:  mounted  present  unmounted  absent     
    mounted 特点:推荐
    01. 会立即进行挂载操作
    02. 可以实现永久挂载
    present 特点:
    01. 可以实现永久挂载
    
    unmounted 特点: 
    01. 进行临时卸载
    absent 特点:
    01. 进行临时卸载 
    02. 进行永久卸载
    03. 挂载点目录会被删除
    
    ansible 172.16.1.7 -m mount -a "src=172.16.1.31:/data path=/mnt state=mounted fstype=nfs"
    ansible 172.16.1.7 -m mount -a "src=172.16.1.31:/data path=/mnt state=unmounted fstype=nfs"
    
    10)cron  --- 批量设置定时任务信息
    官方:https://docs.ansible.com/ansible/latest/modules/cron_module.html#cron-module
    参数:
    name:   定义定时任务注释信息
    minute: 表示分钟信息
    hour:   表示小时信息
    day:    表示日期信息
    month: 表示月份信息
    weekday: 表示星期信息
    job:    表示定义任务信息
    state:  present 创建定时任务   absent 删除定时任务
    disabled: 让定时任务临时失效
    
    crontab -e 
    # xxxx
    * * * * *   任务信息 &>/dev/null
    
    利用ansible编写时间同步定时任务:每隔5分钟,进行时间同步:
    ansible 172.16.1.7 -m cron -a "name='date sync' minute=*/5  job='ntpdate ntp1.aliyun.com &>/dev/null'"
    
    删除定时任务:
    ansible 172.16.1.7 -m cron -a "name='date sync' state=absent"
    
    注释定时任务:
    ansible 172.16.1.7 -m cron -a "name='date sync' minute=*/5  job='ntpdate ntp1.aliyun.com &>/dev/null'  disabled=yes"
    
    11)user --- 批量创建用户模块  group
    官方:
    参数: 
    name:    指定用户名称
    uid:    指定用户uid信息
    group:   指定属于哪个组  主要组
    groups:  指定属于哪个组  附属组
    password:  指定用户密码信息(必须密文的信息)
    shell:  指定用户shell信息  /sbin/nologin
    create_home:  no 不创建家目录
    
    创建用户:
    ansible 172.16.1.7 -m user -a "name=oldgirl uid=777 group=oldboy groups=oldboy666 shell=/sbin/nologin create_home=no"
    
    删除用户:
    ansible 172.16.1.7 -m user -a "name=oldgirl state=absent"
    
    设置用户密码信息:
    ansible 172.16.1.7 -m user -a 'name=oldgirl password="$6$oldboy123$W3jkmkkVTr.9UStm4S50RT2uIEjB/4GEtaAeVCSZ..uWVN1YGxHvluss9JVfAPV0gSJoGn1qAfxGyttIsTjcz0"'
    

    08. ansible剧本编写说明

    剧本作用:
    1)将多个模块操作功能进行整合
    2)实现重复工作简单化(提高工作效率)
    3)实现批量管理特殊需求
    
    如何编写剧本:角色信息  任务信息
    hosts: 角色信息 
    tasks: 任务信息 
    
    剧本编写规范: pythonyaml
    1) 缩进  两个空格表示一个缩进关系
       hosts: xxx 
         tasks
           oldboy
    2) 冒号  创建键值对 key--value  age: 18  冒号后面必须有空格  age:18(错误)
             PS: 冒号结尾  冒号出现在描述和注释信息中
    3)列表  相同的信息/类别出现多次 多个列表利用短横线空格
             - 60期人名信息  张三 李四
             - 61期人名信息  张三 李四
    

    09. 实践编写剧本:

    练习01:批量创建oldgirl01用户(rsync服务端)  批量分发/etc/fstab --> /tmp(rsync服务端和客户端)   
    第一个历程:编写角色信息(设置主机清单)
    [rsync:children]
    rsync_server
    rsync_client
    
    [rsync_server]
    172.16.1.41
    
    [rsync_client]
    172.16.1.7
    172.16.1.31
    
    第二个历程:编写剧本信息:
    mkdir /etc/ansible/ansible_playbook -p
    vim test01.yaml
    - hosts: rsync_server
      tasks:
        - user: name=oldgirl01
        - group: name=oldgirl01
    
    - hosts: rsync
      tasks:
        - copy: src=/etc/fstab dest=/tmp/
    
    第三个历程:测试剧本
    ansible-playbook  --syntax-check  test01.yaml    --- 检查语法结构
    ansible-playbook  -C test01.yaml                 --- 模拟执行剧本
    
    第四个历程:执行剧本
    ansible-playbook   test01.yaml
    
    练习题2:编写rsync服务一键化安装的剧本
    服务端:
    01. 安装软件        rsync 
    02. 编写配置文件    rsyncd.conf 
    03. 创建虚拟用户    rsync 
    04. 创建备份目录    /backup  rsync.rsync 
    05. 创建密码文件    /etc/rsync.password  600   rsync_backup:oldboy123
    06. 启动程序服务    systemctl start/enable rsyncd
    客户端:
    01. 创建密码文件    /etc/rsync.password  600   oldboy123
    
    修改主机清单:
    [rsync_server]
    172.16.1.41
    
    [rsync_client]
    172.16.1.7
    172.16.1.31
        
    编写剧本
    - hosts: rsync_server
      tasks:
        - name: 01:安装部署软件
          yum: name=rsync state=installed 
        - name: 02:分发配置文件
          copy: src=./rsyncd.conf dest=/etc/rsyncd.conf
        - name: 03:创建虚拟用户
          user: name=rsync shell=/sbin/nologin create_home=no
        - name: 04:创建备份目录
          file: path=/backup state=directory owner=rsync group=rsync
        - name: 05:创建密码文件
          copy: content='rsync_backup:oldboy123' dest=/etc/rsync.password  mode=600
        - name: 06:启动服务程序
          service: name=rsyncd state=started enabled=yes
    
    - hosts: rsync_client
      tasks:
        - name: 01:创建密码文件
          copy: content='oldboy123' dest=/etc/rsync.password mode=600
    
    练习题3:编写nfs服务一键化安装的剧本
    服务端:
    01. 安装软件        nfs-utils rpcbind 
    02. 编写配置文件    exports  
    03. 创建存储目录    /data  nfsnobody.nfsnobody 
    04. 启动程序服务    systemctl start/enable rpcbind-->nfs
    客户端:
    01. 安装软件        nfs-utils
    02. 挂载操作        /data   /mnt    
    
    修改主机清单:
    [nfs_server]
    172.16.1.31
    
    [nfs_client]
    172.16.1.7
    172.16.1.41
    
    编写剧本:
    - hosts: nfs_server
       tasks:
         - name: 01:安装部署软件
           yum: 
             name:
               - nfs-utils 
               - rpcbind   
             state: installed 
         - name: 02:分发配置文件
           copy: src=./exports dest=/etc/exports
         - name: 03:创建存储目录
           file: path=/data state=directory owner=nfsnobody group=nfsnobody
         - name: 04:启动服务程序
           service:
             name: 
               - rpcbind
               - nfs
             state: started
             enabled: yes
     
     - hosts: nfs_client
       tasks:
         - name: 01:安装部署软件
           yum: name=nfs-utils state=installed
         - name: 02:目录进行挂载
           mount: src=172.16.1.31:/data path=/mnt fstype=nfs state=mounted
    
    练习题4:编写sersync服务一键化安装的剧本
    

    10. 剧本编写扩展说明:

    a 剧本编写设置变量   OK
    b 剧本编写注册信息   OK
    c 剧本编写循环功能
    d 剧本编写判断功能  
    e 剧本编写忽略错误
    f 剧本编写标签功能
    g 剧本编写忽略采集
    h 剧本编写触发功能
    i 剧本编写汇总功能
    
    1)剧本设置变量功能:
    第一种:在剧本中设置变量:
    - hosts: 172.16.1.7
      vars:
        dir_info: /etc/
        dest_file: hosts_bak
      tasks:
        - name: 传输文件
          copy: src={{ dir_info }}hosts  dest={{ dir_info  }}{{ dest_file }}
    
    第二种:在命令行指定变量
    - hosts: 172.16.1.7
      tasks:
        - name: 传输文件
          copy: src={{ dir_info }}hosts  dest={{ dir_info  }}{{ dest_file }}
    ansible-playbook -e dir_info=/etc/ -e dest_file=hosts_bak test_变量功能.yaml
    
    第三种:在主机清单文件中指定
    [rsync_client]
    172.16.1.7
    172.16.1.31
    [rsync_client:vars]
    dir_info=/etc/
    dest_file=hosts_bak
    
    - hosts: 172.16.1.7
      tasks:
        - name: 传输文件
          copy: src={{ dir_info }}hosts  dest={{ dir_info  }}{{ dest_file }}
    
    结论:三种配置方法:命令行配置变量最优先,剧本文件中配置其次,主机清单中配置最不优先
    
    2) 剧本编写注册信息
    编写剧本: 
    - hosts: 172.16.1.7
      tasks:
        - name: 启动SSH服务程序
          service: name=sshd state=started
        - name: 检查SSH端口信息
          shell: netstat -lntup|grep 22
          register: port_info
        - name: 显示SSH端口信息
          debug: msg={{ port_info.stdout_lines }}
    
    TASK [显示SSH端口信息] *************************************************************************************
    ok: [172.16.1.7] => {
        "msg": [
            "tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      6747/sshd           ", 
            "tcp6       0      0 :::22                   :::*                    LISTEN      6747/sshd           "
        ]
    }
    
    
    补充:ansible结果颜色含义
    绿色: 命令执行成功  没有对远程主机做任何修改
    黄色: 命令执行成功  大部分情况表示对远程主机做了改动
    红色: 命令执行失败
    粉色: 建议进行操作的方法
    蓝色: 显示命令或剧本执行的过程
    
    SSH服务进程信息:
    sshd: root@pts/0      --- ssh连接会话进程
    sshd: root@notty      --- ansible建立ssh连接会话进程
    /usr/sbin/sshd -D     --- 显示服务程序进程
    
    ansible帮助文档如何查看:
    ansible-doc -l        --- 查看所有ansible模块信息
    ansible-doc -s 模块   --- 查看指定模块详细说明
    ansible-doc 模块    --- 查看指定模块更加详细说明
    
    如何创建用户密文密码
    方法一:利用ansible的模块功能
    ansible all -i localhost, -m debug -a "msg={{ 'mypassword' | password_hash('sha512', 'mysecretsalt') }}"
    mypassword:  指定明文密码信息
    mysecretsalt:加密计算方式(辅助加密)
    
    ansible all -i localhost, -m debug -a "msg={{ '123456' | password_hash('sha512', 'oldboy123') }}"
    localhost | SUCCESS => {
      "msg": "$6$oldboy123$W3jkmkkVTr.9UStm4S50RT2uIEjB/4GEtaAeVCSZ..uWVN1YGxHvluss9JVfAPV0gSJoGn1qAfxGyttIsTjcz0"
    }
    
    方法二:利用python模块功能(环境准备)
    yum install -y python-pip
    pip install passlib   -- 安装不上(pip源需要更新)
    ==================================================
    更新pip源:
    pypi
    配置方法
    在文件
    
    ~/.pip/pip.conf
    中添加或修改:
    
    [global]
    index-url = https://mirrors.aliyun.com/pypi/simple/
    
    [install]
    trusted-host=mirrors.aliyun.com
    ==================================================  
    python -c "from passlib.hash import sha512_crypt; import getpass; print(sha512_crypt.using(rounds=5000).hash(getpass.getpass()))"
    

    11. 课程知识总结梳理:

    1)ansible软件概念介绍
       作用  功能  特点
    2)ansible软件部署安装
       a 公钥分发完毕
       b epel源
    3)ansible软件配置方法
       主机清单信息  5种方式
    4)ansible模块应用方法
       command shell script file copy yum service cron mount user debug 
    5)ansible剧本编写应用
       剧本编写格式  hosts: 角色 tasks: 任务 
       剧本编写规范  缩进 冒号 列表
    6)实现了服务一键化部署 nfs rsync
    7)ansible剧本扩展编写
       a 剧本变量设置功能
       b 剧本变量注册功能
    

    作业:

    1. 自学模块的使用
      ping setup fetch archive压缩 unarchive解压 group rpm
    2. 总结sersync如何一键化部署
    3. 预习 剧本编写扩展功能 角色功能
      HTTP协议 nginx服务

    相关文章

      网友评论

          本文标题:ansible

          本文链接:https://www.haomeiwen.com/subject/nvhaxhtx.html