awk以及ansible

张开发
2026/4/16 1:17:08 15 分钟阅读

分享文章

awk以及ansible
awkawk 介绍awk 是其取了三位创始人 Alfred AhoPeter Weinberger, 和 Brian Kernighan 的 Family Name 的首字符。awk 是一个强大的文本分析工具。awk 更像一门编程语言他可以自定义变量有条件语句有循环有数组有正则有函数等。awk 按行读取数据根据给出的条件进行查找并在找出来的行中进行操作。awk 有三种形势awkgawknawk平时所说的awk其实就是gawk。awk 命令awk 命令格式awk[options]scriptfile(s)awk[options]-fscriptfile file(s)script定义如何处理数据。file是 awk 处理的数据来源awk 也可以来自其它命令的输出。-fscriptfile 从脚本文件中读取awk命令每行都是一个独立的script。 script 格式如下script 格式如下BEGIN{action}pattern{action}END{action}脚本通常是被单引号或双引号包住一个awk脚本通常由四部分组成BEGIN { action }语句块awk 执行pattern { action }前要执行的脚本。pattern { action }语句块决定动作语句何时触发可以是以下任意一种 -正则表达式使用通配符的扩展集。 -关系表达式使用运算符进行操作可以是字符串或数字的比较测试。 -模式匹配表达式使用运算符~匹配和~!(不匹配)。END { action }语句块awk 执行pattern { action }后要执行的脚本。action部分决定对数据如何处理由一个或多个命令、函数、表达式组成之间由换行符或分号隔开并位于大刮号内。常见的action包括变量或数组赋值、输出命令、内置函数、控制流语句。BEGIN { action }、pattern { action }、END { action }都是可选项目。awk 工作流第一步执行BEGIN { commands }语句块中的语句。在awk从输入输出流中读取行之前执行通常在BEGIN语句块中执行如变量初始化打印输出表头等操作。第二步**从文件或标准输入中读取一行然后执行pattern { commands }语句块。**它逐行读取数据从第一行到最后一行重复这个过程直到读取完所有行。pattern语句块中的通用命令是最重要的部分它也是可选的。如果没有提供pattern语句块则默认执行{ print }即打印每一个读取到的行。{}类似一个循环体会对文件中的每一行进行迭代通常将变量初始化语句放在BEGIN语句块中将打印结果等语句放在END语句块中。第三步当读至输入流末尾时执行END { command }语句块。在awk从输入流中读取完所有的行之后执行比如打印所有行的分析结果它也是一个可选语句块。awk 示例示例1获取IP地址是192.168.200.186的网卡名[rootcentos7 ~16:39:30]# ip addr | grep 192.168.200.186inet192.168.200.186/24 brd192.168.200.255 scope global noprefixroute ens33#或者[rootcentos7 ~18:34:04]# ip addr | grep 192.168.200.186 | awk {print$NF}ens33#其中的{print$NF}NF是读取这一行最后的内容[rootcentos7 ~18:35:38]# ip addr | awk /192.168.200.186/ {print $NF}ens33示例2查看使用率超过10的文件系统[rootcentos7 ~18:37:57]# df -hFilesystem Size Used Avail Use% Mounted on devtmpfs2.0G02.0G0% /dev tmpfs2.0G02.0G0% /dev/shm tmpfs2.0G 12M2.0G1% /run tmpfs2.0G02.0G0% /sys/fs/cgroup /dev/mapper/centos_centos7-root 50G1.6G 49G4% / /dev/sda1 1014M 139M 876M14% /boot /dev/mapper/centos_centos7-home 146G 33M 146G1% /home tmpfs 394M0394M0% /run/user/0#去除%让use列显示位数字/[rootcentos7 ~18:38:01]# df -h | sed s/%// | awk $510 {print $0}Filesystem Size Used Avail Use Mounted on /dev/sda1 1014M 139M 876M14/boot[rootcentos7 ~18:38:01]# df -h | sed s/%// | awk $510 {print $0}Filesystem Size Used Avail Use Mounted on /dev/sda1 1014M 139M 876M14/boot#awk自带查找功能这里awk读取字符串和数字对字符串进行算术运算时awk 会从左向右解析直到遇到非数字字符解析到%停止[rootcentos7 ~18:41:21]# df -h | awk $51-110 {print $0}/dev/sda1 1014M 139M 876M14% /boot#0效果最好[rootcentos7 ~18:43:56]# df -h | awk $5010 {print $0}/dev/sda1 1014M 139M 876M14% /boot示例3提前系统运行数据。包括CPU 使用率内存 使用率当前用户登录数当前系统负载系统运行进程数量[rootcentos7 bin18:53:00]# vim monitor_os.sh#!/bin/bash#定义一个文件存放数据os_info_file/tmp/os_info.txt#-b : 表示批处理模式禁用交互式界面以纯文本流方式输出-n表示运行的迭代次数top-b-n1|head-n5${os_info_file}#使用awk查找cpu占用的情况cpu_usage$(awk/^%Cpu/ {print $2$4}${os_info_file})echoCPU 使用率${cpu_usage}memory_usage$(awk/^KiB Mem/ {print ($4-$6)/$4}${os_info_file})echo内存使用率${memory_usage}user_count$(awk/^top/ {print $6}${os_info_file})echo在线用户数量${user_count}load_usage$(awk/^top/ {print $(NF-2),$(NF-1),$NF}${os_info_file})echo当前系统负载${load_usage}running_process_count$(awk/^Tasks/ {print $4}${os_info_file})echo系统运行进程数量${running_process_count}rm-f${os_info_file}[rootcentos7 bin18:53:36]# chmod x monitor_os.sh[rootcentos7 bin18:53:46]# monitor_os.shCPU 使用率0 内存使用率0.0904882 在线用户数量2 当前系统负载0.00,0.01,0.05系统运行进程数量1ansible 环境准备ansible 架构控制节点下发指令或文件到受控制节点。受控制节点接受控制节点发过来的指令并执行。ansible 工作原理ansible控制节点通过ssh协议将python 模块推送到受控制节点受控制节点使用python执行python模块进行相应的配置。ansible 环境准备实验环境#host列表192.168.200.190 controller.xkw.cloud controller192.168.200.191 server1.xkw.cloud server1192.168.200.190 server2.xkw.cloud server2192.168.200.190 server3.xkw.cloud server3192.168.200.190 server4.xkw.cloud server4准备虚拟机模版准备1台干净的centos 7 虚拟机。注意模版虚拟机的CPU和内存的配置建议设置为1CPU和2G内存。开发脚本sethost不加参数执行sethost则提示命令使用方法。加参数执行sethost则第一个参数范围是190-194。超出范围也提示命令使用方法。正常执行示例sethost 190这设置正确的主机名和IP地址。vim~/bin/sethost#!/bin/bash# test root user((UID!0))echoPlease run as root.exit1usageUsage:$019[0-4]# test args number(($#!1))echo$usageexit2con_nameens33domain_namexkw.cloudhost_id$1if((host_id190));thenHOSTNAMEcontroller.${domain_name}elif((191host_idhost_id194));thenHOSTNAMEserver$[host_id-190].${domain_name}elseecho$usageexit3fihostnamectl set-hostname$HOSTNAMEnmcli connection modify${con_name}ipv4.addresses192.168.200.${host_id}/24 nmcli connection up${con_name}hostnameip-braddress关机打快照快照名为ansible。克隆虚拟机基于模版虚拟机快照ansible克隆出其他虚拟机并使用sethost脚本设置主机名和IP地址。以server1为例[rootcentos7 bin 18:53:00]# sethost 191配置 ansible 基础环境在模版虚拟机上配置/etc/hosts添加ansible主机清单[rootcentos7 bin19:10:19]1:11]# vim /etc/hosts127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6################# ansible ####################192.168.200.190 controller.xkw.cloud controller192.168.200.191 server1.xkw.cloud server1192.168.200.193 server2.xkw.cloud server2192.168.200.194 server3.xkw.cloud server3192.168.200.195 server4.xkw.cloud server4################# ansible ####################配置免密登录ansible节点[rootcentos7 bin19:10:19]2:58]# ssh-keygen -t rsa -N -f .ssh/id_rsa[rootcentos7 bin19:10:19]4:39]# \forhostincontroller server1 server2 server3 server4dosshpass-p123456ssh-copy-id root$hostdone[rootcentos7 bin19:10:19]02]#forhostincontroller server1 server2 server3 server4dosshroot$hosthostname;ip -br a show ens33;echodone# 输出内容如下controller ens33 UP192.168.200.190/24 server1 ens33 UP192.168.200.191/24 server2 ens33 UP192.168.200.192/24 server3 ens33 UP192.168.200.193/24 server4 ens33 UP192.168.200.194/24在模版虚拟机上开发脚本weihu用来集中管理其他机器。weihu cmd command将会在ansible 5台设备上执行command。weihu copy src dest将模版虚拟机上的src文件复制到ansible 5台设备dest位置。[rootcentos7 bin19:10:08]# vim weihu#!/bin/bashfunctionusage(){echoUsage: weihu cmd COMMAND, 在集群中所有的机器上执行对应COMMAND命令echoUsage: weihu copy source target将本地source文件推送到集群中所有的机器上exit}action$1HOSTLISTcontroller server1 server2 server3 server4(($#1))usagecase$actionincmd)# 删除参数1shiftCOMMAND$*forhostin$HOSTLISTdosshroot$host$COMMANDdone;;copy)# 删除参数1shiftforhostin$HOSTLISTdonum$#case$numin2)scp-r$1root$host:$2;;#[3-9]|[1-9][0-9])[3-9])last$(echo$*|awk{print $NF})args_exclude_last$(echo$*|seds#$last##)scp-r${args_exclude_last}root$host:${last};;*)usageesacdone;;*)usage;;esac赋予权限[rootcentos7 bin19:10:19]# chmod x weihu测试维护脚本[rootcentos7 bin19:10:19]# weihu cmd hostnamecontroller.xkw.cloud controller server1.xkw.cloud server1 server2.xkw.cloud server2 server3.xkw.cloud server3 server4.xkw.cloud server4[rootcentos7 bin19:10:19]# weihu copy /etc/hosts /etc/hostshosts100%449222.1KB/s 00:00 hosts100%449245.5KB/s 00:00 hosts100%449275.8KB/s 00:00 hosts100%449351.0KB/s 00:00 hosts100%449317.4KB/s 00:00[rootcentos7 bin19:10:19]7:33]# weihu cmd cat /etc/hosts127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6################# ansible ####################192.168.200.190 controller.xkw.cloud controller192.168.200.191 server1.xkw.cloud server1192.168.200.193 server2.xkw.cloud server2192.168.200.194 server3.xkw.cloud server3192.168.200.195 server4.xkw.cloud server4......准备一个专用的账户devpos用于控制节点远程登录其他节点。[rootdeploy ~15:21:59]# weihu cmd useradd devpos[rootdeploy ~15:36:17]# weihu cmd id devposuid1001(devpos)gid1001(devpos)groups1001(devpos)uid1001(devpos)gid1001(devpos)groups1001(devpos)uid1001(devpos)gid1001(devpos)groups1001(devpos)uid1001(devpos)gid1001(devpos)groups1001(devpos)uid1001(devpos)gid1001(devpos)groups1001(devpos)[rootdeploy ~15:36:22]# weihu cmd echo 123456 | passwd --stdin devpos[rootdeploy ~15:37:41]# sshpass -p 123456 ssh devposserver1 iduid1001(devpos)gid1001(devpos)groups1001(devpos)# 配置devpos账户免密提权为root[rootdeploy ~15:39:17]# weihu cmd echo devpos ALL(ALL)NOPASSWD: ALL /etc/sudoers.d/devpos配置控制节点使用devpos账户免密登录所有ansible节点。[rootdeploy ~15:47:55]# sshpass -p123456 ssh devposcontroller ssh-keygen -t rsa -N -f .ssh/id_rsa[rootdeploy ~15:48:30]# sshpass -p123 ssh devposcontroller for host in controller server1 server2 server3 server4;do sshpass -p123 ssh-copy-id devpos$host;done# 验证控制节点免密登录其他节点[devposcontroller ~15:50:01]$forhostincontroller server1 server2 server3 server4;dosshdevpos$hostid;doneuid1001(devpos)gid1001(devpos)groups1001(devpos)uid1001(devpos)gid1001(devpos)groups1001(devpos)uid1001(devpos)gid1001(devpos)groups1001(devpos)uid1001(devpos)gid1001(devpos)groups1001(devpos)uid1001(devpos)gid1001(devpos)groups1001(devpos)[devposcontroller ~15:50:12]$forhostincontroller server1 server2 server3 server4;dosshdevpos$hostsudoid;doneuid0(root)gid0(root)groups0(root)uid0(root)gid0(root)groups0(root)uid0(root)gid0(root)groups0(root)uid0(root)gid0(root)groups0(root)uid0(root)gid0(root)groups0(root)[devposcontroller ansible16:43:15]$ ansible-iinventory-mcommand-aidserver1 server1|CHANGED|rc0uid1001(devops)gid1001(devops)groups1001(devops)# 参数说明# -i inventory主机清单位置# -m command使用命令模块# -a hostname模块对应的具体参数# server1针对哪个机器操作[devposcontroller ansible16:43:41]$ ansible-iinventory-mcommand-aid-bserver1 server1|CHANGED|rc0uid0(root)gid0(root)groups0(root)# -b 提权为root操作# 使用user模块管理用户[devposcontroller ansible16:43:00]$ ansible-iinventory-muser-anamezhangsan statepresent-bserver1 server1|CHANGED{ansible_facts:{discovered_interpreter_python:/usr/bin/python},changed:true,comment:,create_home:true,group:1002,home:/home/zhangsan,name:zhangsan,shell:/bin/bash,state:present,system:false,uid:1002}[devposcontroller ansible16:43:46]$ ansible-iinventory-mcommand-aid zhangsanserver1 server1|CHANGED|rc0uid1002(zhangsan)gid1002(zhangsan)groups1002(zhangsan)# 删除用户[devposcontroller ansible16:44:33]$ ansible-iinventory-muser-anamezhangsan stateabsent removeyes-bserver1 server1|CHANGED{ansible_facts:{discovered_interpreter_python:/usr/bin/python},changed:true,force:false,name:zhangsan,remove:true,state:absent}[devposcontroller ansible16:45:49]$ ansible-iinventory-mcommand-aid zhangsanserver1 server1|FAILED|rc1id: zhangsan: no such usernon-zeroreturncode分组主机清单[devposcontroller ansible16:45:53]$viminventory[controllers]controller[web]server1 server2[db]server3 server4测试# 针对web主机组操作[devposcontroller ansible16:48:55]$ ansible-iinventory-mcommand-ahostname-owebs server2|CHANGED|rc0|(stdout)server2.xkw.cloud server1|CHANGED|rc0|(stdout)server1.xkw.cloud# -o 输出内容合并为一行# all代表所有机器[devposcontroller ansible16:49:03]$ ansible-iinventory-mcommand-ahostname-oall server2|CHANGED|rc0|(stdout)server2.xkw.cloud server1|CHANGED|rc0|(stdout)server1.xkw.cloud controller|CHANGED|rc0|(stdout)controller.xkw.cloud server3|CHANGED|rc0|(stdout)server3.xkw.cloud server4|CHANGED|rc0|(stdout)server4.xkw.cloud# web主机组安装nginx[devposcontroller ansible16:51:41]$ ansible-iinventory-myum-anamenginx statepresent-bwebs# web主机组卸载nginx[devposcontroller ansible16:51:41]$ ansible-iinventory-myum-anamenginx stateabsent-bwebs查看模块帮助# 查看模块清单并过滤出yum相关信息[devposcontroller ansible16:53:41]$ ansible-doc-l|grepyum yum Manages packages with the yum package manager yum_repository Add or remove YUM repositories# 查看yum模块帮助信息[devposcontroller ansible16:53:47]$ ansible-doc yum# 直接搜索EXAMPLE# 部分内容如下EXAMPLES: - name:installthe latest version of Apache yum: name: httpd state: latest - name: ensure a list of packages installed yum: name:{{ packages }}vars: packages: - httpd - httpd-tools - name: remove the Apache package yum: name: httpd state: absent - name:installthe latest version of Apache from the testing repo yum: name: httpd enablerepo: testing state: present...ansible最大的特点简单只要能看懂English就行。幂等性多次执行结果一致。假设第一次执行软件包未安装则执行安装。第二次执行则不需要做任何事情。playbook 编写和执行通过编写playbook完成重复、复杂的任务。ansible 命令类似于 shell 中单个命令。playbook 类似于 shell 脚本。[devposcontroller ansible16:55:36]$vimdeploy_web.yaml# yaml格式起始行一般不省略---# Playbook中第一个play# play具有属性namehostsbecometasks缩进一致# name属性用于简要描述play- name: debploy WebSite# hosts属性用于定义要在哪个受管理节点执行hosts: webs# tasks属性用于描述play中任务属性是列表格式tasks:# 第一个任务# 任务具有属性涵name和模块名等。# name属性用于简要描述任务- name: latest version of httpd and firewalld installed# 指明模块名也就是要执行的任务yum:# 指定要操作的rpm包名称name:# rpm包名称是-开头的列表格式或者逗号分隔的列表格式- httpd - firewalld# 定义软件包的状态lastet代表升级为最新版本state: latest# 第二个任务- name: prepare index.html# copy 模块用于将content属性值写入到目标文件copy: content:Welcome to {{ ansible_fqdn }} WebSite!\ndest: /var/www/html/index.html# 第三个任务- name:enableand start httpd# service模块用于启用并启动httpd服务service: name: httpd enabled:truestate: started# 第四个任务- name:enableand start firewalld# service模块用于启用并启动firewalld服务service: name: firewalld enabled:truestate: started# 第五个任务- name: firewalld permits access to httpdservice# firewalld用于放行http服务firewalld: service: http permanent:truestate: enabled immediate:yes# Playbook中第二个play-开头表示列表- name: Test WebSite hosts: localhost become: no tasks: - name: connect to intranet web server# uri模块用于测试网站是否可以访问uri: url: http://{{item}}loop: - server1 - server2# yaml格式结束行一般省略...# 执行剧本[devposcontroller ansible17:01:40]$ ansible-playbook-iinventory-bdeploy_web.yaml

更多文章