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/
书写剧本步骤
- 理清服务作用,服务使用流程.
- 书写剧本核心: 列出步骤ՎՎʖ 根据步骤找出模块
- 书写剧本.
- 书写剧本前拍摄快照,边书写剧本边测试,最后测试完成,恢复快照,重新跑一次.(分步测试,联合测试)
(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 nfsserver/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 }