day 38综合架构批量管理ansible(自动化软件)

2019-08-25  本文已影响0人  流云若雨

一.课程介绍部分

批量管理服务配置应用
掌握模块功能应用(难点 模块太多 不容易记住)
copy(推送) fetch(拉取) file(管理数据信息/修改属性 或者创建/删除数据)
user(创建用户) group(创建用户)yum(下载安装软件) service(管理服务运行状态)
cron(定时任务模块)
特殊需求:
  archive unarchive(压缩/解压缩) setup(收集信息模块)
  debug(指定输出相应信息) template(模板模块) mysql(????) lineinfile(类似sed命令 修改替换文件内容)

模块功能

第四个模块 :copy 文件模块 可以将管理端数据进行批量分发/可以移动调整被管理端数据位置
重要模块参数:
src:指定管理端要分发的数据路径信息
dest:指定数据传输到被管理端什么目录中
mode:数据传输完毕后,设置数据权限信息
owner:数据传输完毕后,设置数据属主信息
group:数据传输完毕后,设置数据属组信息
backup:是否开启数据分发备份功能    了解
remote_src:指定源的路径信息,从被管理端进行读取
content:可以直接不创建文件,对文件进行分发,并且可以编辑文件简单内容信息4
模块参数用法一:
  ansible oldboy -m copy -a "src=/oldboy/oldboy.txt dest=/oldboy/ mode=600 owner=oldboy group=oldboy"
  说明: 对目录进行分发
  1) 修改文件权限信息 和 文件属主属组信息
  2) 可以在被管理端创建指定目录信息
  
  ansible oldboy -m copy -a "src=/oldboy/ dest=/oldboy/" 
  说明: 对目录进行分发
  src指定目录后面有斜线 oldboy/  xxxxxx
  src指定目录后面没斜线 oldboy   xxxxxx
  
  模块参数用法二: 备份数据/还原数据方法
  传输备份文件数据方法一:
  ansible oldboy -m copy -a "src=/oldboy/oldboy.txt dest=/oldboy/ backup=yes"
  
  传输备份文件数据方法二:
  ansible oldboy -m copy -a "src=/oldboy/oldboy.txt dest=/oldboy/oldboy.txt.bak remote_src=yes"
  还原数据 
  ansible oldboy -m copy -a "src=/oldboy/oldboy.txt.bak dest=/oldboy/oldboy.txt remote_src=yes"
  
  ============================================================================
  参数说明
  ansible oldboy -m copy -a "src=/oldboy/oldboy.txt dest=/opt/ remote_src=yes"
  == 相应被管理端  mv /oldboy/oldboy.txt  /opt/
  ansible oldboy -m copy -a "src=/oldboy/oldboy.txt dest=/opt/"
  == 相应管理端    scp -rp /oldboy/oldboy.txt  xx.xx.xx.xx:/opt/
  ==================================================================
第五个模块:fetch 文件模块 进行数据拉取操作
src :指定 远程主机需要拉取数据信息
dest:将数据保存到本地管理主机什么路径中
  拉取数据方法:
  ansible oldboy -m fetch -a "src=/opt/password.txt dest=/oldboy"
  
  拉取后数据信息
  [root@m01 ~]# tree /tmp/172.16.1.41/
  /tmp/172.16.1.41/
  └── etc
      └── httpd
          └── conf
              └── httpd.conf
  
  3 directories, 1 file
第六个模块:file 文件类型
 可以修改文件数据属性信息(直接修改数据属性)/创建或删除信息 
重要参数:
path:指定要操作的远程主句 数据路径信息
  mode:修改文件权限信息
  owner:修改数据属主信息
  group:修改数据属组信息
  state:状态参数系信息
  创建目录(directory) 创建文件(touch) 创建软链接(link) 创建硬链接(hard) 删除文件(ansent)  查看文件是否存在
模块参数 用法一:修改文件属性信息
  修改文件权限属性信息:
  ansible 172.16.1.41 -m file -a "path=/etc/hosts mode=666 owner=oldboy group=oldboy"
  修改目录权限属性信息: 问题* 如何递归修改目录权限???
  ansible 172.16.1.41 -m file -a "path=/oldboy/ mode=666 owner=oldgirl group=oldgirl"
  说明: 只是修改目录本身权限,不会进行递归修改权限信息(没有-R功能)
  
  模块参数用法二: 创建或删除文件数据
  创建目录:
  ansible 172.16.1.41 -m file -a "path=/oldboy/ state=directory"
  创建文件:
  ansible 172.16.1.41 -m file -a "path=/oldboy/oldboy.txt state=touch"
  创建链接:
  ansible 172.16.1.41 -m file -a "src=/oldboy/oldboy.txt  path=/oldboy/oldboy_soft_link state=link"  --- 创建软链接 
  ansible 172.16.1.41 -m file -a "src=/oldboy/oldboy.txt  path=/oldboy/oldboy_hard_link state=hard"  --- 创建硬链接
  删除数据:
  ansible 172.16.1.41 -m file -a "path=/oldboy/oldboy.txt state=absent"
  检查普通文件是否存在
  ansible 172.16.1.41 -m file -a "path=/etc/hosts state=file"
第七个模块:user 用户模块 创建或删除用户信息
name:指定创建用户名称信息
create_home:创建用户是否有家目录
shell:指定用户是否能够登陆系统   虚拟用户   sbin/nologin
uid:指定用户id值
password:指定用户密码信息   使用密文信息设置密码
state:默认present表示创建用户 使用absent删除用户信息
group:指定用户属于哪个用户组(主要组)==useradd -g
groups:指定用户属于哪个用户组(附属组)==useradd -G
模块参数用法一:创建用户
  ansible 172.16.1.41 -m user -a "name=rsync uid=2000 create_home=no shell=/sbin/nologin"    --- 创建虚拟用户  
  ansible 172.16.1.41 -m user -a "name=oldboy uid=2001"                                      --- 创建普通用户
  
  模块参数用法二: 给创建用户设置密码
  ansible 172.16.1.41 -m user -a 'name=oldboy password=$6$123456$yryajH2qY8ydGAcmwCNSmZM1/fI4gYqwTzXn9abB73ZmaDWJoe5s5Y.gOHgtBgqYrqRLB1Dsv6QTZsKsJbibJ1'
  
  模块参数用法三: 删除用户信息
  ansible 172.16.1.41 -m user -a 'name=oldboy state=absent'
  说明: 在删除用户是不会删除用户家目录. 问题* 如何将用户家目录删除 == userdel -r 
  [root@backup oldboy]# ll /home/oldboy -d
  drwx------ 2 2001 2001 83 Aug 23 11:33 /home/oldboy
  ================================================================================================
  补充: 利用user模块创建密文密码信息
  方法一: 
  ansible all -i localhost, -m debug -a "msg={{ 'mypassword' | password_hash('sha512', 'mysecretsalt') }}"
  mypassword:   指定明文密码信息
  mysecretsalt: 密码加密方式
  生成密文密码
  [root@m01 ~]# ansible all -i localhost, -m debug -a "msg={{ 'oldboy123' | password_hash('sha512', '123456') }}"
  localhost | SUCCESS => {
      "msg": "$6$123456$yryajH2qY8ydGAcmwCNSmZM1/fI4gYqwTzXn9abB73ZmaDWJoe5s5Y.gOHgtBgqYrqRLB1Dsv6QTZsKsJbibJ1"
  }
  
  方法二: 利用python命令生成密文信息
  第一个历程: 安装pip下载工具
  yum install -y python-pip
  第二个历程: 利用pip工具下载python程序包
  pip install passlib
  第三个历程: 生成密文信息
  [root@m01 ~]# python -c "from passlib.hash import sha512_crypt; import getpass; print(sha512_crypt.using(rounds=5000).hash(getpass.getpass()))"
  Password: 
  $6$IQhh.egT4ow2dzmd$fk9W1.J4q1ArQ8nykkhh5A0waFbgU1Qa4sUdNm42.oYSpSMmIIl0262cSDg1Q6Ph8p3rnqHOs372A.GzD11.w/
  ================================================================================================
第八个模块:group 用户模块 创建或删除用户组信息
重要参数信息
name:指定创建用户组名称信息
gid:指定创建用户组id编号信息
state:默认present  指定absent表示删除用户组
  模块参数用法一: 创建指定用户组
  ansible 172.16.1.41 -m group -a "name=oldboy gid=3000"
  
  模块参数用法二: 删除指定用户组
  ansible 172.16.1.41 -m group -a "name=oldboy state=absent"          
第九个模块:yum 安装软件模块 安装软件/卸载软件
name:指定需要安装软件名称
state:指定状态信息
安装软件(installed/latest/present)卸载软件(absent/removed)
  模块参数用法一: 安装软件程序
  ansible 172.16.1.41 -m yum -a "name=telnet-server state=installed"
  
  模块参数用法二: 卸载软件程序
  ansible 172.16.1.41 -m yum -a "name=telnet-server state=absent"
第十个模块:service 系统模块 控制服务运行状态
重要参数:
name:指定要管理的服务名称
state:指定服务运行状态
            停止(stopped) 启动(started)重启(restarted)平滑重启(reloaded)
enabled:指定服务是否开机自动启动  yes开机自启no开机不要运行
  模块参数用法一: 控制服务运行状态:
  ansible 172.16.1.41 -m service -a "name=rsyncd state=started"
  ansible 172.16.1.41 -m service -a "name=rsyncd state=stopped"
  ansible 172.16.1.41 -m service -a "name=rsyncd state=restarted"
  ansible 172.16.1.41 -m service -a "name=rsyncd state=reloaded"
  
  模块参数用法二: 设置服务开机运行状态:
  ansible 172.16.1.41 -m service -a "name=rsyncd enabled=no"
  ansible 172.16.1.41 -m service -a "name=rsyncd enabled=yes"
第十一个模块:cron 系统模块 批量设置定时任务
name:定义定时任务注释信息  可以避免出现重复的定时任务
minute:指定时间信息中分钟信息(0-59 */5  0,10)
hour:指定时间信息中小时信息(0-23 *)
day:指定时间信息中日期信息(1-31)
month:指定时间信息中月份信息(1-12)
wkkkday:指定时间信息中星期信息(0-6)
job:指定定时任务命令信息
  crontab -e 
  * * * * *  执行定时任务 &>/dev/null
  
  模块参数用法一: 批量设置定时任务
  ansible 172.16.1.41 -m cron -a "name=crond-id-02 minute=*/5 job='ntpdate ntp1.aliyun.com &>/dev/null'"

  模块参数用法二: 删除定时任务
  ansible 172.16.1.41 -m cron -a "name=crond-id-02 state=absent"

  模块参数用法三: 注释定时任务     
  ansible 172.16.1.41 -m cron -a "name=crond-id-01 minute=*/5 job='ntpdate ntp1.aliyun.com &>/dev/null' disabled=yes"
  ansible 172.16.1.41 -m cron -a "name=crond-id-01 minute=*/5 job='ntpdate ntp1.aliyun.com &>/dev/null' disabled=no"
第十二个模块: mount 系统模块 进行批量挂载操作
  src:    挂载存储设备信息
  path:   挂载点目录信息
  fstype: 挂载的文件系统类型
  state:  指定挂载或是卸载
          挂载: mounted present
          mounted: 临时挂载存储目录信息  永久也挂载了存储目录信息  推荐
          present: 只是实现永久挂载
          
          卸载: unmounted absent            
          unmounted: 只是实现临时卸载
          absent:    临时实现卸载    永久也实现卸载操作
  
  参数操作方法一: 进行挂载操作 
  ansible 172.16.1.41 -m mount -a "src=172.16.1.31:/data path=/mnt fstype=nfs state=mounted"
  ansible 172.16.1.41 -m mount -a "src=172.16.1.31:/data path=/mnt fstype=nfs state=present"
  
  参数操作方法二: 进行卸载操作
  ansible 172.16.1.41 -m mount -a "src=172.16.1.31:/data path=/mnt fstype=nfs state=unmounted"
  ansible 172.16.1.41 -m mount -a "src=172.16.1.31:/data path=/mnt fstype=nfs state=absent"
补充
====================================================================
补充: 如何学习模块使用方法:
01. 简单了解模块作用
    command – Execute commands on targets  在目标主机上执行命令模块
02. 模块详细说明
03. 掌握模块参数用法
    根据样例学习参数信息
    
补充: 学习ansible会有不同颜色提示
01. 绿色: 对主机信息进行查看, 操作执行成功
02. 黄色: 对主机信息进行查看, 对主机中信息有调整修改
03. 紫色: 错误提示信息, 建议忠告信息
04. 红色: 报错提示信息  
====================================================================
需求: 如何利用ansible模块, 进行rsync服务部署
考察: 所学习模块是否能够灵活应用
思路:
第一个历程: 确认好管理主机信息
管理服务端主机: 172.16.1.41 
管理客户端主机: 172.16.1.31 172.16.1.7 

第二个历程: 配置主机清单信息
vim /etc/ansible/hosts
[rsync_server]
172.16.1.41 
[rsync_client]
172.16.1.31
172.16.1.7

第三个历程: 进行rsync服务部署 
服务端:
1) 安装软件
   ansible rsync_server -m yum -a "name=rsync state=installed"
2) 编写配置文件
   ansible rsync_server -m copy -a "src=/ansible_file/rsync/rsyncd.conf  dest=/etc/"
3) 创建虚拟用户 
   ansible rsync_server -m user -a "name=rsync create_home=no shell=/sbin/nologin"
4) 创建密码文件并授权
   ansible rsync_server -m copy -a "content='rsync_backup:oldboy123' dest=/etc/rsync.password  mode=600"
5) 创建备份目录并授权
   ansible rsync_server -m file -a "path=/backup/ state=directory owner=rsync group=rsync"
6) 启动服务程序   
   ansible rsync_server -m service -a "name=rsyncd state=started enabled=yes"
    
客户端:
1) 创建密码文件 
   ansible rsync_client -m copy -a "content='oldboy123' dest=/etc/rsync.password mode=600"
2) 进行传输测试 扩展研究:synchronize
   ansible rsync_client -m shell -a "rsync -avz /etc/hosts rsync_backup@172.16.1.41::backup --password-file=/etc/rsync.password"

3) 掌握剧本编写

   将多个模块操作命令进行整合
   模块 === 命令 
   剧本 === shell脚本
   
   作用说明:
   01. 可以实现服务自动部署
   02. 可以提高运维工作效率
   03. 可以减少运维工作问题
   04. 可以节省公司运维成本

   剧本编写组成:
   1. 剧本角色信息: hosts --主机信息
   2. 剧本任务信息: tasks --任务信息 

   剧本编写规范:  遵循yaml语法规范 == python代码语法规范
01. 缩进规范: 两个空格表示一个缩进关系
       标题一
         标题二           
           标题三
       PS: 在缩进时只能用空格表示缩进,不能用tab键代替缩进
02. 字典规范: 冒号后面要有空格
       oldboy: 123456  key: value
       PS: 冒号结尾时不需要有空格/冒号信息出现在注释说明中不需要有空格
03. 列表规范: 横线后面要有空格
       name:
         - rsync 
         - nfs 
         - rpcbind 
编写测试剧本:
   [root@m01 ansible_playbook]# cat /ansible_playbook/test01.yml 
   - hosts: rsync_server
     tasks:
       - name: create user:alex
         user: name=alex uid=3000
       - name: install software:iftop
         yum: name=iftop state=installed
   
   - hosts: rsync_client
     tasks:
       - name: create user:alex
         user: name=alex uid=3000
剧本测试执行方法:
   1) 进行剧本编写检查测试
      ansible-playbook --syntax-check /ansible_playbook/test01.yml
   2) 剧本运行方式
      模拟执行:
      ansible-playbook -C test01.yml
补充
      =================================================================================
      补充: 取消cowsay小牛图案出现
      vim /etc/ansible/ansible.cfg   --- 编写修改ansible配置文件
      217 # set to 1 if you don't want cowsay support or export ANSIBLE_NOCOWS=1
      218 nocows = 1    --- 禁止调取远程主机cowsay程序
      =================================================================================  
真实执行:
      ansible-playbook -C test01.yml
测验: 编写剧本完成nfs服务一键自动部署
   第一个历程: 定义主机清单信息
   [nfs_server]
   172.16.1.31
   [nfs_client]
   172.16.1.41
   172.16.1.7
   
   第二个历程: 编写剧本信息
   服务端:
   1) 安装软件程序
   2) 编写配置文件 
   3) 创建存储目录
   4) 启动服务程序 
   
   客户端:
   1) 安装软件程序
   2) 进行挂载操作
   
   
   剧本编写方法:
   01: 采用变量格式编写剧本
   02: 采用字典格式编写剧本
   03: 采用json语法格式编写剧本 ???
   
   剧本信息: 方法一 变量格式编写剧本
   - hosts: nfs_server
     tasks:
       - name: 01:install software
         yum: name=nfs-utils state=installed
         yum: name=rpcbind   state=installed
       - name: 02:push conf_file to server
         copy: src=./nfs/exports dest=/etc/
       - name: 03:create data dir
         file: path=/data  state=directory owner=nfsnobody group=nfsnobody
       - name: 04:boot server
         service: name=rpcbind state=started enabled=yes
         service: name=nfs state=started enabled=yes
  
  - hosts: nfs_client
    tasks:
      - name: 01:install software
        yum: name=nfs-utils state=installed
      - name: 02:mount data dir
        shell: mount -t nfs 172.16.1.31:/data /mnt
   
   剧本信息: 方法二 字典格式编写剧本   
   - hosts: nfs_server
     tasks:
       - name: 01:install software
         yum:
           name:
             - nfs-utils 
             - rpcbind
           state: installed
       - name: 02:push conf_file to server
         copy:
           src: ./nfs/exports
           dest: /etc/
       - name: 03:create data dir
         file:
           path: /data
           state: directory
           owner: nfsnobody
           group: nfsnobody
       - name: 04:boot server rpc
         service:
           name: rpcbind
           state: started
           enabled: yes
       - name: 05:boot server nfs
         service:
           name: nfs
           state: started
           enabled: yes

   - hosts: nfs_client
     tasks:
       - name: 01:install software
         yum:
           name: nfs-utils
           state: installed
       - name: 02:mount data dir
         shell: mount -t nfs 172.16.1.31:/data /mnt 

5) 剧本编写扩展功能

a 在剧本中设置变量信息  OK
b 在剧本中设置注册信息  OK
c 在剧本中设置判断信息
d 在剧本中设置循环信息
e 在剧本中设置错误忽略
f 在剧本中设置标签信息
g 在剧本中设置触发信息
   
   
a 在剧本中设置变量信息     
设置变量方法一: 在剧本中设置变量 
- hosts: 172.16.1.41
  vars:
    data_dir: /oldboy
  tasks:
    - name: copy file 01
      copy: src={{ data_dir }}/oldboy01.txt  dest=/tmp
    - name: copy file 02
      copy: src={{ data_dir }}/oldboy02.txt  dest=/opt
    - name: copy file 03
      copy: src={{ data_dir }}/oldboy03.txt  dest=/usr/local/

设置变量方法二: 在命令中设置变量
ansible-playbook -e data_dir=/oldboy test_变量配置功能.yml

设置变量方法三: 在主机清单中设置
a: 单个主机设置变量
172.16.1.41 data_dir=/oldboy

b: 多个主机设置变量
[oldboy]
172.16.1.41
[oldboy:vars]
data_dir=/oldboy    
   
问题: 三种变量设置方式, 之间优先级关系是什么   
创建环境:
mkdir /oldboy/ -p
mkdir /oldgirl/ -p 
mkdir /olddog/ -p
结论:
命令配置变量  最优先
剧本配置变量  其次优先
主机清单配置  最后选择    
   
b 在剧本中设置注册信息       
[root@m01 ansible_playbook]# cat test_注册功能配置.yml 
- hosts: nfs_client
  tasks:
    - name: mount dir
      mount: src=172.16.1.31:/data path=/mnt fstype=nfs state=mounted
    - name: check mount
      shell: df -h
      register: oldboy
    - name: display mount info
      debug: msg={{ oldboy.stdout_lines }}     
   
   
c 在剧本中设置判断信息
  常见主机信息:
  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_memory_mb:                        详细显示内存情况。
  ansible_swaptotal_mb:                 显示总的swap内存。
  ansible_swapfree_mb:                      显示swap内存的可用内存。
  ansible_mounts:                           显示系统磁盘挂载情况。
  ansible_processor:                        显示cpu个数(具体显示每个cpu的型号)。
  ansible_processor_vcpus:                  显示cpu个数(只显示总的个数)。   
  
  - hosts: all
    tasks:
      - name: install software
        yum: name=nfs-utils state=installed
      - name: create data dir
        file: path=/data/ state=directory
        when: (ansible_hostname == "nfs01")   
        
  判断语法结构信息:
  01. 匹配单个信息:
  when: (ansible_hostname == "nfs01")
  
  02. 匹配多个信息 ???
  when: (ansible_hostname == "nfs01") or  (ansible_hostname == "backup") 
  when: (ansible_hostname == "nfs01") and (ansible_eth0 == "10.0.0.31")
  
  03. 对匹配信息进行取反
  when: (ansible_hostname != "nfs01")

05. 课程知识总结

01. ansible模块进行详细说明
    command shell script 
    copy fetch file
    user group
    yum service
    cron mount  
02. ansible剧本编写说明
    剧本组成部分: 
    1) play角色信息--hosts  
    2) task任务信息--tasks
    剧本编写规范:
    1) 缩进规范:  两个空格表示一个缩进关系 
    2) 字典规范:  冒号后面需要有空格
    3) 列表规范:  横线后面需要有空格
03. ansible剧本编写扩展方法
    a 剧本设置变量功能
    b 剧本设置注册功能
    c 剧本设置判断功能

作业:

01. 修改目录权限属性信息: 问题* 如何递归修改目录权限???
02. 默认在删除用户是不会删除用户家目录. 问题* 如何将用户家目录删除 == userdel -r 
03. 在进行判断匹配时,如何取出内置变量指定子集信息
描述人特点: 身高 体重 性别 学历: 金融学历_企业管理 财务学历_注册会计师 工作
04. 扩展研究 lineinfile

周一测验:
01. 笔试部分
02. 上机测验  rsync nfs sersync 三个服务一键化部署

userdel -r +用户名 表示删除用户

上一篇下一篇

猜你喜欢

热点阅读