一. 云计算 云计算 openstack docker kvm 虚拟化技术:在本身物理机的基础上虚拟出云主机 #唯一的不好是 安全性不高 数据保存在别人那里的 (影响不大)
#trouble shooting的能力 问题解答的能力
#注:ssh开启2种验证 - 先公钥认证 再密码认证 密码认证失败 提示permit deny
二. ansible不是守护进程 #ansible 不是守护进程 执行ansible命令的时候才会执行ansible #守护进程:一直在内存里面,等待别人连接 #ssh是守护进程 #执行1条命令 命令不是守护进程
#ansible不是一个守护进程(守护进程:起来后一直在内存中运行,等待其他人访问) #ansible就是一个命令脚本,使用Python写的
#[root@cPen_A ansible]# sudo -i #注:直接回到root用户
三. ansible的模块 ansible的模块
1. copy模块 从本地copy文件分发到目录主机路径 参数说明: src= 源文件路径 # 注:source 源
dest= 目标路径 # 注:destination 目的地
注意src= 路径后面带/ 表示带里面的所有内容复制到目标目录下,不带/是目录递归复制过去 content= 自行填充的文件内容 owner 属主 group 属组 mode权限
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 示例1:shell模块、copy模块 --------------------------------------------------------------------------------------------------------------------------------- ansible 接 指定主机 -m 指定模块 -a 执行的参数 [root@cPen_A ansible] [root@cPen_A lianxi] [root@cPen_A lianxi]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 示例2:指定webser组,将/etc/passwd 赋值到主机/tmp目录下,指定权限777 --------------------------------------------------------------------------------------------------------------------------------- [root@cPen_A lianxi] =========================================================================================== 示例3:copy src路径后面带/不带/的区别 --------------------------------------------------------------------------------------------------------------------------------- [root@cPen_A copy_dir] [root@cPen_A copy_dir]
2. fetch模块 #注:从远程主机拉取文件到本地
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 示例 --------------------------------------------------------------------------------------------------------------------------------- [root@cPen_A lianxi] 192.168.0.22 | CHANGED => { "changed" : true , "checksum" : "c468f7340237d9f531122f5b03345ce8ac5641b4" , "dest" : "/lianxi/192.168.0.22/etc/hostname" , "md5sum" : "8d23b0947f191eb9c20728677271eb4d" , "remote_checksum" : "c468f7340237d9f531122f5b03345ce8ac5641b4" , "remote_md5sum" : null } [root@cPen_A lianxi] 192.168.0.20 192.168.0.22 ansible-copy copy_dir [root@cPen_A lianxi] [root@cPen_A 192.168.0.20] etc
1 2 3 4 5 6 从远程主机拉取文件到本地 fetch会自动的在dest指定目录后加上远程主机命名的目录结构后面接src目录结构 fetch存储到本地的目录结构 dest + 远程主机名 + src
3. command模块 在远程主机上执行命令,属于裸执行,非键值对显示;不进行shell解析
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 示例1:command 、shell --------------------------------------------------------------------------------------------------------------------------------- [root@cPen_A 192.168.0.20] [root@cPen_A 192.168.0.20] 示例2:command 裸执行 (后面传的参数不会做解析) --------------------------------------------------------------------------------------------------------------------------------- [root@cPen_A 192.168.0.20] 192.168.0.22 | FAILED | rc=2 >> [Errno 2] 没有那个文件或目录 [root@cPen_A 192.168.0.20] ============================================================================================ [root@cPen_A ansible] [root@cPen_A ansible]
4. shell模块 1 2 3 4 示例 --------------------------------------------------------------------------------------------------------------------------------- [root@cPen_A 192.168.0.20] 跟command 一样,只不过shell模块可以解析管道之类的功能
5. file模块 设置文件属性(创建文件) 常用参数: path目标路径 state directory为目录,link为软件链接 group 目录属组 owner 属主 等,其他参数通过ansible-doc -s file 获取
state – absent 删除文件和目录的 directory 目录 touch 新建空文件 link 软链接 hard 硬链接
1 2 3 4 5 6 7 8 9 10 11 12 13 14 示例1:查看file文件帮助信息 -------------------------------------------------------------------------------------------- [root@cPen_A lianxi] ============================================================================================ 示例2:在目标主机/tmp目录下创建目录 --------------------------------------------------------------------------------------------------------------------------------- [root@cPen_A lianxi] ============================================================================================ 示例3:设置修改文件属性 --------------------------------------------------------------------------------------------------------------------------------- [root@cPen_A lianxi]
6. cron模块 通过cron模块对目标主机生成计划任务 常用参数: 除了分(minute)时(hour)日(day)月(month)周(week)外 name: 本次计划任务的名称 state: present 生成(默认) |absent 删除 (基于name)
1 2 3 4 5 6 7 8 [root@cPen_A ~] root 702 1 0 10:59 ? 00:00:00 /usr/sbin/crond -n root 3582 3553 0 14:41 pts/3 00:00:00 grep --color=auto crond [root@cPen_A ~] [root@cPen_A log ] Nov 25 12:01:01 cPen_A run-parts(/etc/cron.hourly)[3498]: finished 0anacron
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 示例1:添加计划任务 --------------------------------------------------------------------------------------------------------------------------------- [root@cPen_A log ] [root@cPen_B ~] */3 * * * * date >>/tmp/time.txt [root@cPen_A log ] ============================================================================================ 示例2:删除计划任务 --------------------------------------------------------------------------------------------------------------------------------- [root@cPen_A log ]
1 2 3 4 5 6 ntp服务是一个时间管理服务器 示例:ntp服务 系统时间管理服务 [root@cPen_A log ] [root@cPen_B ~] [root@cPen_A log ]
7. yum模块 故名思义就是yum安装软件包的模块; 常用参数说明: enablerepo,disablerepo表示启用与禁用某repo库 name 安装包名 state (present’ orinstalled’, latest’)表示安装, (absent’ or `removed’) 表示删除
#注:name安装的包名 state 安装还是卸载
1 2 3 4 示例:安装wget [root@cPen_A log ] 示例:卸载wget [root@cPen_A log ]
8. service模块 服务管理模块 常用参数: name:服务名 state:服务状态 started(启动) stopped(关闭) restarted(重启) reloaded(重新加载) enabled: 是否开机启动 true|false runlevel: 启动级别 (systemed方式忽略)
1 2 3 4 5 6 7 [root@cPen_A log ] 示例:关闭vsftpd服务 [root@cPen_A log ] 示例:开启vsftpd服务 [root@cPen_A log ]
9. script模块 1、把本地的脚本传到远端执行;前提是到远端可以执行,不要把Linux下的脚本同步到windows下执行;
#注:只在远程服务器执行脚本,不上传脚本到远程服务器
1 2 3 4 5 6 7 8 9 10 11 12 13 [root@cPen_A ~] echo "test ansible" >>/tmp/ansible.txt[root@cPen_A ~] -------------------------------------------------------------------------------------------- 示例:执行慢 机器多 怎么解决 答:可以使用多进程去执行 -f 6 指定6个进程去执行 command 模块不能识别管道符号、shell模块 可以识别copy模块 推送 script模块 不需要上传脚本,在远程服务器执行脚本
四. 查看系统版本 1 2 3 4 5 示例:查看系统版本 [root@cPen_B ~] 4.18.0-193.el8.x86_64 [root@cPen_B ~] CentOS Linux release 8.2.2004 (Core)
五. 链接 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 示例:软链接 [root@cPen_A lianxi] [root@cPen_A lianxi] lrwxrwxrwx 1 root root 12 11月 25 11:30 ansible-copy-likcs-s -> ansible-copy 示例:硬链接 [root@cPen_A lianxi] [root@cPen_A lianxi] -rw-r--r-- 2 root root 20 11月 25 10:12 ansible-copy-link rm -rf 删除源文件 硬链接文件 依旧没事[root@cPen_A lianxi] -rw-r--r-- 2 root root 20 11月 25 10:12 ansible-copy lrwxrwxrwx 1 root root 12 11月 25 11:30 ansible-copy-likcs-s -> ansible-copy -rw-r--r-- 2 root root 20 11月 25 10:12 ansible-copy-link 符号链接数 1 是 rm -rf 删除的是 文件名 和 磁盘里面data的链接data还存在于磁盘里 ,过一段时间 新的数据会覆盖 data
六. playbook 如果ansible的各模块(能实现各种功能)是车间里的各工具;playbook就是指导手册,目标远程主机就是库存和原料对象 #注:语法 yaml格式配置
1、playbook的核心元素 hosts : playbook配置文件作用的主机 tasks: 任务列表 variables: 变量 templates:包含模板语法的文本文件 handlers :由特定条件触发的任务 roles :用于层次性、结构化地组织playbook。roles 能够根据层次型结构自动装载变量文件、tasks以及handlers等2、playbook运行方式 ansible-playbook --check 只检测可能会发生的改变,但不真执行操作 ansible-playbook --list-hosts 列出运行任务的主机 ansible-playbook --syntax-check playbook.yaml 语法检测 ansible-playbook -t TAGS_NAME playbook.yaml 只执行TAGS_NAME任务 ansible-playbook playbook.yaml 运行
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 示例:编写/执行 playbook -------------------------------------------------------------------------------------------- [root@cPen_A ~] - hosts: all remote_user: root tasks: - name: up file copy: src=/etc/passwd dest=/tmp/passwd_tmp [root@cPen_A ~] ============================================================================================ 示例:yaml文件怎么去编写 -------------------------------------------------------------------------------------------- [root@cPen_A ~] [root@cPen_A ~] >>> import yaml >>> fp = open("ansible_playbook_sc.yaml" ) >>> dict = yaml.load(fp) >>> dict [{'hosts' : 'all' , 'remote_user' : 'root' , 'tasks' : [{'name' : 'up file' , 'copy' : 'src=/etc/passwd dest=/tmp/passwd_tmp' }]}]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 1、创建yaml文件 [root@cPen_A ~] - hosts: all remote_user: root tasks: - name: up file copy: src=/etc/passwd dest=/tmp/passwd_tmp 2、可以使用Python解析yaml >>> import yaml >>> fp = open("ansible_playbook_sc.yaml" ) >>> dict = yaml.load(fp) >>> dict [{'hosts' : 'all' , 'remote_user' : 'root' , 'tasks' : [{'name' : 'up file' , 'copy' : 'src=/etc/passwd dest=/tmp/passwd_tmp' }]}]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 示例:多个操作 -------------------------------------------------------------------------------------------- [root@cPen_A ~] - hosts: all remote_user: root tasks: - name: up file copy: src=/etc/passwd dest=/tmp/passwd_tmp - name: download redis yum: name=redis state=installed - hosts: webser tasks: - name: remove file shell: rm -rf /tmp/passwd_tmp [root@cPen_A ~]
七. 总结 ansible通过常用模块在命令行就可以针对主机清单来管理配置远程主机,无需要代理客户端程序,但需要目标主机有ssh和python2.4+;基于ssh协议既可以通过用户名和密码,也可以通过私钥,推荐使用私钥; windows上需要安装powershell及winrm服务也可以做到,关于这方面 可以参考我之前的博客 ansible自动化管理windows 通过ansib-doc来获取模块信息及指定模块帮助信息; ansible-playbook 基于YAML语法配置;可以对playbook文件进行测试,解析并执行应用于指定无端主机;非常方便我们统一编排分发管理远程主机;
八. 练习 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 示例:每天凌晨1点 检查/etc/passwd 文件是否被修改,并且生成检查报告 示例:编写脚本 实现ansible node节点(管理的主机)服务器备份 备份/var/log/messages日志 备份到/backup目录下,并且取名2020-11-25-01-log.tar.gz,每一个小时执行一次 示例:每天凌晨1点 检查/etc/passwd 文件是否被修改,并且生成检查报告 ----------------------------------------------------------------------------------------------------------- 方法1 md5sum 检查文件是否修改 md5sum -c --status check_file.sh md5sum -c --status d.md5 &&echo "文件未被修改" ||echo "文件已被修改" md5sum /etc/passwd &> d.md5 ----------------------------------------------------------------------------------------------------------- 方法2 check_ectpasswd.sh a='md5sum /etc/passwd' b='tail -n1 /root/b' [[ $a ==$b ]]&&echo "文件未被修改!" >> /root/c||echo "文件已被修改!" >> /root/c $a >> /root/b----------------------------------------------------------------------------------------------------------- 方法3 touch /tmp/passwd.logtouch /tmp/passwd.txta=`md5sum /etc/passwd` b=`md5sum /tmp/passwd.txt` c=${a:0:32} d=${b:0:32} if [ $c = $d ] then echo "$(date) 文件未被修改" >>/tmp/passwd.log cat /etc/passwd >/tmp/passwd.txt else echo "$(date) 文件已被修改" >>/tmp/passwd.log cat /etc/passwd >/tmp/passwd.txt fi =========================================================================================================== ansible_playbook_zuoye.yaml - hosts: all remote_user: root tasks: - name: check file cron: hour=1 day=*/1 job='/usr/bin/bash ~/check_file.sh'
1 2 3 4 5 6 示例:编写脚本 实现ansible node节点(管理的主机)服务器备份 备份/var/log/messages日志 备份到/backup目录下,并且取名2020-11-25-01-log.tar.gz,每一个小时执行一次 - hosts: all remote_user: root tasks: - name: backup messages cron: hour=1 job='tar czf /backup/$(date +%Y-%m-%d-%H-log.tar.gz) /var/log/messages'
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 示例:md5sum 检查文件是否修改 md5sum -c --status [root@cPen_A lianxi] -c, --check read MD5 sums from the FILEs and check them --status don't output anything, status code shows success [root@cPen_A lianxi]# md5sum /etc/passwd > d.md5 #注:写进这个文件 文件名必须是这个 不能变 [root@cPen_A lianxi]# cat d.md5 28b2503e7fb565ddc0b8ec1f9ad6a9c7 /etc/passwd [root@cPen_A lianxi]# md5sum -c --status d.md5 #注:检查文件是否修改 [root@cPen_A lianxi]# echo $? #注:文件未修改,返回0 0 [root@cPen_A lianxi]# useradd chen223344 [root@cPen_A lianxi]# md5sum -c --status d.md5 [root@cPen_A lianxi]# echo $? #注:文件修改,返回1 1