Linux集群管理

1.ssh密钥认证全过程

 2.Ansible

  • 自动化运维: 批量管理,批量分发,批量执行,维护。。
  • Ansible是python写的. 

 3.Ansible管理架构

  • Inventory 主机清单:被管理主机的ip列表,分类.
  • ad-hoc模式: 命令行批量管理(使用ans模块),临时任务.
  • playbook 剧本模式: 类似于把操作写出脚本,可以重复运行这个脚本

  • 什么是主机清单: 让ansible管理的节点的列表.
  • ansible默认读取在/etc/ansible/hosts文件,并非/etc/hosts.
  • 未来实际使用中一般我们会把主机清单文件存放在指定的目录中,运行ansible的时候通过-i选项指定主机清单文件即可.

 4.Ansible必知必会模块

  • ansible中的模块就类似于Linux中的命令,我们Linux命令管理系统,我们通过ansible模块实现批量管理.
  • ansible中模块一般相当于Linux中的一些命令.yum模块,file模块,user模块.
  • ansible中的模块拥有不同的选项,这些选项一般都是一些单词,拥有自己的格式与要求.

(1)command模块

  • 是ans默认的模块,适用于执行简单的命令,不支持特殊符号.
  • 案例01:批量获取所有主机的主机名
  • 批量执行hostname命令
ansible all   -m command  -a 'ip a s eth0'
ansible all     -a 'ip a s eth0'

(2)shell模块

  • 与command模块类似,但是shell支持特殊符号.
  • 案例02:批量删除/tmp/下面所有内容
ansible all -m shell  -a 'rm -fr /tmpՎˇ'

(3)script模块

  • 执行流程:分发脚本(传输脚本),在被管理端运行脚本
  • 案例04: 批量执行脚本获取主机信息
ansible all   -m script  -a '/server/scripts/ansiblescripts.sh'

(4)file模块

  • file模块不仅可以管理文件,还可以管理目录,管理软连接.
  • file模块相当于把touch命令,mkdir命令,rm命令,ln -s命令结合在一起了.

案例05: 创建/opt/lidao.txt  
ansible all  -m file -a 'path=/opt/lidao.txt state=touch

(5)copy模块

  • 批量分发:scp,1个节点(管理节点)发送文件或压缩包到所有被管理端. 注意:copy是单向的传输

  • 案例10: 分发书写好的/etc/hosts文件,如果文件存在则备份下
ansible all -m copy  -a 'src=/etc/hosts dest=/etc/hosts backup=yes'

(6)服务管理

  • systemd模块相当于是linux systemctl命令:
    • 开启/关闭/重启服务
    • 开机自启动

 (7)软件管理

  • yum模块
  • get_url模块,wget命令
  • yum_repository模块yum源配置模块,未来可以通过copy模块

get_url模块
  • 相当于是wget命令.所有主机能访问网络才行.
  • 推荐在管理节点下载好,使用copy仅分发即可.

 yum_repository模块
  • 未来书写好yum配置文件,copy分发过去即可. 

-m yum_repository  
-a 'name=epel 
    description="Extra Packages for Enterprise Linux 
7 - $basearch"
   
baseurl="http:Վˌmirrors.aliyun.com/epel/7/$basearch"
    enabled=yes
    gpgcheck=no
    '

 (8)user模块

  • user用户管理 : useradd,userdel
  • group用户组管理 : groupadd

  • 案例15: 创建www-ans用户uid 2000虚拟用户 
ansible all -m user -a 'name=www-ans uid=2000 shell=/sbin/nologin create_home=no state=present'
案例16: 批量更新密码
ansible all  -m user -a "name=lidao996 password={{ '1' | password_hash('sha512', 'lidao') }} state=present"
关于{{}}相关的解释
{{ '1' | password_hash('sha512', 'lidao') }}
表示1是密码,经过管道,传递给了password_hash()插件, sha512加密算法,lidao是随机字符用于生成随机加密后的密码

(9)mount模块

  • 实现mount命令进行挂载可以修改/etc/fstab实现永久挂载

#在web服务器上安装nfs
ansible web -m yum -a 'name=nfs-utils state=present'
#创建挂载点
ansible web -m file -a 'path=/ans-upload/  state=directory'
#挂载nfs
ansible web -m mount -a 'src=172.16.1.31:/data/  path=/ans-upload/ fstype=nfs state=mounted   ' 
#检查
ansible web  -a 'df -h'
ansible web  -a 'grep upload /etc/fstab '

(10)cron模块

  • 用于管理系统的定时任务,替代了crontab -e功能

  • 案例18: 每3分钟同步时间.
ansible all  -m cron -a 'name="sync time by lidao996"  minute="Վʺ3" job="/sbin/ntpdate ntp1.aliyun.com &>/dev/null" state=present'

 (11)playbook剧本

  • playbook 文件,用于长久保存并且实现批量管理,维护,部署的文件. 类似于脚本存放命令和变量,剧本中存放的时候?模块Վʡ
  • 剧本yaml格式,yaml格式的文件:空格,冒号.
  • 剧本未来我们批量管理,运维必会的内容.

 剧本案例

[root@m01 /server/scripts/playbook]# cat   
02.dist_file.yml 
- hosts: all
 tasks:
    - name: 01 创建目录
     file: 
       path: /server/files/  
       state: directory
    - name: 02 分发文件
     copy: 
       src: /etc/hosts 
       dest: /server/files/

书写剧本步骤

  1. 理清服务作用,服务使用流程.
  2. 书写剧本核心: 列出步骤ՎՎʖ 根据步骤找出模块
  3. 书写剧本.
  4. 书写剧本前拍摄快照,边书写剧本边测试,最后测试完成,恢复快照,重新跑一次.(分步测试,联合测试) 

(12)变量

a.剧本中的变量

cat 05.vars.yml 
- hosts: all
 vars:
   dir: /oldboy/lidao/upload/
 tasks:
    - name: mkdir 
     file:
       path: "{{ dir }}"
       state: directory
使用变量的时候如果变量是某个选项的开头,则变量引用的时候需要加上双引号
b.变量文件
[root@m01 /server/scripts/playbook]# cat 05.vars.yml 
- hosts: all
 vars_files: ./vars.yml
 tasks:
    - name: file
     file:
       path: "{{ dir }}/{{ user }}-{{ file }}"
       state: touch
[root@m01 /server/scripts/playbook]# cat vars.yml 
dir: /tmp/
file: lidao.txt
user: lidao996kkk

 c.主机组使用变量

xxxx-check.yml
group_vars/
   lb/vars.yml  #存放lb组的变量
   web/vars.yml #存放web组的变量
   data/vars.yml #存放xxx组的变量
   all/vars.yml  #所有主机共用的变量
   未来一般使用all分组即可,把所有变量存放在一起,供剧本使用

 d.facts变量

  • 运行剧本的时候ans会收集每个主机的基本信息,这些信息形成的变量叫做facts变量.
  • facts变量setup模块获取
常用fact变量
ansible_hostname   #主机名
ansible_memtotal_mb #内存大小(总计) 单位mb 
ansible_processor_vcpus        #cpu数量
ansible_default_ipv4.address   #默认的网卡ip eth0
ansible_distribution           #系统发行版本名字
CentOS Ubuntu Debian ՎՎʢ
ansible_processor_vcpus 
ansible_processor_cores
ansible_date_time.date

 (13)include

  • 1个ansible剧本内容过多,涉及到多个play(- host:web),可读性变弱,不方便调试.
  • 于是人们想出把单个大的剧本拆分为多个,小的剧本.
  • 多个小的剧本可以通过include功能合并使用

(14)Roles

  • 通过使用include_tasks功能,大型剧本,缩小体积,变的更加模块化.
  • 我们发现新的问题,handlers,变量文件,发送配置文件(可能是j2文件)存放比较 混乱 .
  • 于是人们发明了一套规范,这个规范是一套剧本目录结构的要求与标准,让我们书写剧本的时候,把剧本的内容和需要的文件,按照目录要求,分门别类存储.
  • 这套规则一般叫roles规则,roles的本质就是规定了1套目录结构,用于书写剧本的
[root@m01 /server/scripts/playbook/roles]# tree -F 
.
├── hosts
├── nfs-server/
│   ├── files/
│   │   └── exports
│   ├── handlers/
│   │   └── main.yml
│   ├── tasks/
│   │   └── main.yml
│   └── templates/
│       └── motd.j2
└── top.yml


5 directories, 6 files
[root@m01 /server/scripts/playbook/roles]# cat nfs￾server/tasks/main.yml 
    - name: 01. 部署nfs-utils
     yum: 
       name: nfs-utils,rpcbind
       state: installed
     tags:
        - 01-install-nfs
    - name: 02. 修改配置文件
     copy:
       src: exports
       dest: /etc/exports
       backup: yes
     tags:
        - 02-conf
     notify:
        - restart nfs server
      #copy发送过去
      #replace sed 'sՎՎ˂g'
    - name: 03. 共享目录
     file:
       path: /backup-nfs/
       owner: nfsnobody
       group: nfsnobody
       state: directory
     tags:
        - 03-mkdir
    - name: 04. 启动服务 rpc nfs
     systemd:
       name: "{{ item }}"
       enabled: yes
       state: started 
     loop:
        - rpcbind
        - nfs
     tags:
        - 04-start-service
    - name: 05 分发motd 
     template:
       src: motd.j2
       dest: /etc/motd
       backup: yes
     tags:
        - 05-motd

 (15)Vault

  • 加密指定的文件: ansible-vault用于加密敏感信息
  • hosts文件 加密
  • 变量文件 加密

(16)Ansible 优化

性能
  • ssh连接速度优化,关闭UseDNS,GSSAPIAuthcation ....
  • 不要让ansible运行交互式的命令,非要用使用命令的非交互模式.
  • 需要使用ans,yum安装软件,可以自建本地yum仓库,然后ans安装.(自建yum源,自己制作的rpm包)
  • 调整ansible并发数量( -f 调整并发数量 默认是5 ansible.cfg forks=5 ,实际调整根据负载情况.)
  • 给ansible配置缓存(redis),队列.缓存facts.
  • 给主机进行分组操作与管理.
  • 关闭gather_facts,如果不用facts变量可以关闭, 剧本中: gather_facts: false 配置文件: gathering = explicit
  • 关闭host,key,check 一般使用密码认证的时候需要关闭,如果不关闭 ansible配置文件 host_key_checking = False
安全⭐
  • ⭐ 配置sudo用户 ans ALL=(ALL) NOPASSWD: ALL 密码是1,ssh端口是 22
  • 配合vpn,jms一起使用
  • 用户ՎՎʕ>vpn---->jms(跳板机)---->ansible
  • 用户的密码,进行加密( hash, ansible-vault)

5.总结

Ansible知识点
SSH密钥认证
Ansible-Inventory主机清单:记录被管理节点的名单,分类.
Ansible各种模块:
命令脚本: shell,command,script (脚本开头Վʿ/bin/bash)
文件目录相关: file,copy,template ,lineinfile,repl  ace
用户管理: user ,group
服务管理: systemd,cron ,iptables,firewalld,synchronize
软件管理: yum,apt,get_url ,yum_repository
磁盘管理: mount
调试模块: debug类似于echo命令
Ans剧本playbook:格式 play,task,模块
Ans剧本变量:
在剧本文件中定义vars
根据主机组定义变量文件:group_vars
register变量
facts变量
流程控制
handlers触发器:分发配置文件的时候使用,重启对应的服务.
loop/with_items(with_系列之一) 变量item.
单个变量.
多个变量.
when判断主机名,判断发行版本. 如果满足when条件就执行对应的内容,如果不满足则提示skip.
调试
-C , --syntax-check , --step
tag标签.书写剧本加上(-t,Վʔskip-tags)
ignore_errors
进阶功能
include_tasks
roles
valut
galaxy
优化……
Ansible任务
  • rsync,nfs,sersync(变量,循环,handlers)

 6.每日工作任务

进阶:

1)流程控制

handlers触发器 ⭐⭐⭐⭐⭐
  • 应用场景:一般用于分发配置文件的时候.
  • 如果配置文件发生变化则重启服务,如果没有变化则重启.
1 - hosts: backup
2 gather_facts: no
3 tasks:
4    - name: 分发配置文件
5     copy:
6       src: files/exports
7       dest: /etc/exports
8       backup: yes9     notify:
10        - 重启服务
11
12 handler:
13    - name: 重启服务
14     systemd:
15       name: nfs
16       state: reloaded

 

when判断
  • 用于给ans运行的task(模块)设置条件,满足或不满足条件在运行对应的模块.
  • 应用建议: when进行判断,一般与变量一起使用.
  • when条件一般与facts变量或register变量一起使用
[root@m01 /server/scripts/playbook]# cat 11.whensys.yml 
- hosts: all
 tasks:
    - name: yum sl,cowsay
     yum: 
       name: sl,cowsay
       state: installed
     when: ansible_distribution Վҧ "CentOS"
        
     
    - name: apt cmatrix
     apt:
       name: cmatrix
       state: present
     when: ansible_distribution Վҧ "Ubuntu"
  • when用于进行判断,满足/不满足条件就执行对应的模块(不满足条件的主机提示skip).
  • when一般与变量一起使用.
  • 符号 Վҧ Վʱ is match is not match
  • (条件1) and (条件2)
  • (条件1) or (条件2)
2类循环:
  • with_*:with_items
  • loop
  • 批量创建文件,批量添加用户,批量启动或重启服务.
  • 案例03: 批量启动服务 rpcbind 然后 nfs服务
 hosts: all
 gather_facts: false
 tasks:
    - name: add user  
     user:
       name: "{{ item.name }}"
       uid:  "{{ item.uid }}"
       state: present
     loop:
        - { name: 'oldboy', uid: 2020 }
        - { name: 'lidao', uid: 2021 }
        - { name: 'lidao996', uid: 2022 }

posted @ 2024-05-18 20:30  嘉禾世兴  阅读(18)  评论(0编辑  收藏  举报