linux9
linux 9 af_pr
看过一句话“为什么这么多的人宁愿干体力活,也不愿意学习去挣钱呢?” 因为“学习是主动吃苦,而生活的苦是自动找到懒人的” -yuchao
命令
rpm -qi nginx 查看软件安装信息
简历的书写学习到了没有?
两年python开发
擅长在linux环境OOP开发,熟悉centos7常用命令
熟悉nginx环境配置,如nginx调优(nginx.conf根据服务器参数更改),负载均衡以及代理配置
负责python web项目部署,架构vue+nginx+uwsgi+supervisor+virtualenv
熟悉mysql基本CURD语句,索引优化,主从复制原理
熟悉redis,mongoDB等NOSQL数据库,掌握redis持久化机制,主从复制以及哨兵搭建原理,了解redis-cluster
了解docker容器化管理,掌握容器,仓库,镜像管理命令,私有docker仓库搭建
了解消息队列rabbitmq
了解运维自动化工具saltstack,ansible配置
技能习得等级
了解 熟悉 熟练 擅长 精通
编辑全部窗口:
-->查看 --> 撰写栏 -->全部窗口
1 . rabbitmq的安装使用
1.通过阿里云的yum源,在epel源中有这个rabbitmq
yum install rabbitmq-server erlang -y
2.启动rabbitmq-server
systemctl start rabbitmq-server
3.开启后台管理界面
rabbitmq-plugins enable rabbitmq_management
4.创建rabbitmq的账号密码
rabbitmqctl add_user liuyang 123456
5.设置用户为管理员
sudo rabbitmqctl set_user_tags liuyang administrator
6.设置用户有权限访问所有队列
语法:
rabbitmqctl set_permissions [-p <vhostpath>] <user> <conf> <write> <read>
rabbitmqctl set_permissions -p "/" liuyang "." "." ".*"
7.重启rabbitmq服务端,让用户生效
systemctl restart rabbitmq-server
8.访问web管理界面,登录,查看队列信息
netstat -tunlp(查看进程id)(访问进不去,应该是电脑卡了)
http://192.168.230.132:15672/#/queues
9.用python操作rabbitmq,实现生产消费者模型
1.安装pika模块,模块版本需要指定,因为代码参数发生了变化(不知道模块版本的时候写个错的,然后从提示中找)
pip3 install -i https://pypi.douban.com/simple pika==0.13.1
1.生产者的代码
#!/usr/bin/env python3
import pika
# 创建凭证,使用rabbitmq用户密码登录
# 去邮局取邮件,必须得验证身份
credentials = pika.PlainCredentials("liuyang","123456")
# 新建连接,这里localhost可以更换为服务器ip
# 找到这个邮局,等于连接上服务器
connection = pika.BlockingConnection(pika.ConnectionParameters('192.168.230.132',credentials=credentials))
# 创建频道
# 建造一个大邮箱,隶属于这家邮局的邮箱,就是个连接
channel = connection.channel()
# 声明一个队列,用于接收消息,队列名字叫“水许传”
channel.queue_declare(queue='水许传')
# 注意在rabbitmq中,消息想要发送给队列,必须经过交换(exchange),初学可以使用空字符串交换(exchange=''),它允>许我们精确的指定发送给哪个队列(routing_key=''),参数body值发送的数据
channel.basic_publish(exchange='',
routing_key='水许传',
body='武大郎出摊卖烧饼了')
print("已经发送了消息")
# 程序退出前,确保刷新网络缓冲以及消息发送给rabbitmq,需要关闭本次连接
connection.close()
2.消费者的代码
import pika
# 建立与rabbitmq的连接
credentials = pika.PlainCredentials("liuyang","123456")
connection = pika.BlockingConnection(pika.ConnectionParameters('192.168.230.132',credentials=credentials))
channel = connection.channel()
channel.queue_declare(queue="水许传")
def callbak(ch,method,properties,body):
print("消费者接收到了数据:%r"%body.decode("utf8"))
# 有消息来临,立即执行callbak,没有消息则夯住,等待消息
# 老百姓开始去邮箱取邮件啦,队列名字是水许传
channel.basic_consume(callbak,queue="水许传",no_ack=True)
# 开始消费,接收消息
channel.start_consuming()
rabbitmq消息确认之ack
防止异常情况下数据丢失的异常机制
no-ack 若为true,不走,服务器出错,数据库丢失,
no-ack 为false , 走,服务器出错,数据不丢
官网资料:http://www.rabbitmq.com/tutorials/tutorial-two-python.html
默认情况下,生产者发送数据给队列,消费者取出消息后,数据将被清除。
特殊情况,如果消费者处理过程中,出现错误,数据处理没有完成,那么这段数据将从队列丢失
no-ack机制(为False不让不确认)
为了处理:数据处理过程中有问题,然后不返回出错
不确认机制
也就是说每次消费者接收到数据后,不管是否处理完毕,rabbitmq-server都会把这个消息标记完成,从队列中删除
3.消息确认机制的生产者代码
#!/usr/bin/env python3
import pika
# 创建凭证,使用rabbitmq用户密码登录
# 去邮局取邮件,必须得验证身份
credentials = pika.PlainCredentials("selfju","cxk")
# 新建连接,这里localhost可以更换为服务器ip
# 找到这个邮局,等于连接上服务器
connection = pika.BlockingConnection(pika.ConnectionParameters('192.168.16.142',credentials=credentials))
# 创建频道
# 建造一个大邮箱,隶属于这家邮局的邮箱,就是个连接
channel = connection.channel()
# 新建一个hello队列,用于接收消息
# 这个邮箱可以收发各个班级的邮件,通过
channel.queue_declare(queue='西游记')
# 注意在rabbitmq中,消息想要发送给队列,必须经过交换(exchange),初学可以使用空字符串交换(exchange=''),它允许我们精确的指定发送给哪个队列(routing_key=''),参数body值发送的数据
channel.basic_publish(exchange='',
routing_key='西游记',
body='大师兄,师傅被蔡许坤抓走了')
print("已经发送了消息")
# 程序退出前,确保刷新网络缓冲以及消息发送给rabbitmq,需要关闭本次连接
connection.close()
4.消息确认机制的消费者代码
import pika
credentials = pika.PlainCredentials("selfju","cxk")
connection = pika.BlockingConnection(pika.ConnectionParameters('192.168.16.142',credentials=credentials))
channel = connection.channel()
# 声明一个队列(创建一个队列)
channel.queue_declare(queue='西游记')
def callback(ch, method, properties, body):
print("消费者接受到了任务: %r" % body.decode("utf-8"))
# int('asdfasdf')
# 我告诉rabbitmq服务端,我已经取走了消息
# 回复方式在这
ch.basic_ack(delivery_tag=method.delivery_tag)
# 关闭no_ack,代表给与服务端ack回复,确认给与回复
channel.basic_consume(callback,queue='西游记',no_ack=False)
channel.start_consuming()
持久化
消息的可靠性是RabbitMQ的一大特色,那么RabbitMQ是如何保证消息可靠性的呢——消息持久化。 为了保证RabbitMQ在退出或者crash等异常情况下数据没有丢失,需要将queue,exchange和Message都持久化。
5.支持持久化的队列和消息
1.生产者的代码
import pika
# 有密码
credentials = pika.PlainCredentials("liuyang","123456")
connection = pika.BlockingConnection(pika.ConnectionParameters('192.168.230.132',credentials=credentials))
channel = connection.channel()
# 声明一个队列(创建一个队列)
# 默认此队列不支持持久化,如果服务挂掉,数据丢失
# durable=True 开启持久化,必须新开启一个队列,原本的队列已经不支持持久化了
'''
实现rabbitmq持久化条件
delivery_mode=2
使用durable=True声明queue是持久化
''' # 持久化参数durable
channel.queue_declare(queue='LOL',durable=True)
channel.basic_publish(exchange='',
routing_key='LOL', # 消息队列名称
body='我用双手成就你的梦想',
# 支持数据持久化
properties=pika.BasicProperties(
delivery_mode=2,#代表消息是持久的 2
)
)
connection.close()
6.持久化的消费者代码
import pika
credentials = pika.PlainCredentials("liuyang","123456")
def callback(ch, method, properties, body):
print("消费者接受到了任务: %r" % body.decode("utf-8"))
connection = pika.BlockingConnection(pika.ConnectionParameters('192.168.230.132',credentials=credentials))
channel = connection.channel()
2 确保队列持久化
channel.queue_declare(queue='LOL',durable=True)
'''
必须确保给与服务端消息回复,代表我已经消费了数据,否则数据一直持久化,不会消失
'''
def callback(ch, method, properties, body):
print("消费者接受到了任务: %r" % body.decode("utf-8"))
# 模拟代码报错
# int('asdfasdf') # 此处报错,没有给予回复,保证客户端挂掉,数据不丢失
# 告诉服务端,我已经取走了数据,否则数据一直存在
ch.basic_ack(delivery_tag=method.delivery_tag)
3 关闭no_ack,代表给与回复确认
channel.basic_consume(callback,queue='LOL',no_ack=False)
channel.start_consuming()
saltstack高级运维
python做运维自动化是第一语言
这个是快速的远程执行系统
为什么? 大量的重复性工作,远程执行命令,大规模部署,本地进行管理,跨数据中心(c/s)
4 saltstack运维工具的安装
1.环境准备
准备3台机器,配置好ip地址,互相可以通信,即可
一个master
一个minion
一个minion
2.配置hosts解析文件,强制进行主机名解析,加速salt的minion查找,分别在三台机器上,写入解析
修改主机名 的方法
1 vim /etc/sysconfig/network
HOSTNAME=liuyang3(主机名)
2 vim /etc/hosts
192.168.230.130 liuyang3
vim /etc/hosts (hostname 查看主机名)
ping bogon 是主机名
192.168.230.132 liu
192.168.230.132 localhost.localdomain
192.168.16.47 bogon
3.配置阿里云的源,下载saltstack软件包, 注意区分 服务端和客户端
1.在master上安装
yum install salt-master -y
2.在minion1上安装
yum install salt-minion -y
3.在minion2上安装
yum install salt-minion -y
4.学习salt-master的配置文件 和 salt-minion的配置文件
salt-master的配置文件内容如下
vim master #打开配置文件,填入如下内容
interface: 0.0.0.0 #绑定到本地的0.0.0.0地址
publish_port: 4505 #管理端口,命令发送
user: root #运行salt进程的用户
worker_threads: 5 #salt运行线程数,线程越多处理速度越快,不要超过cpu个数
ret_port: 4506 #执行结果返回端口
pidfile: /var/run/salt-master.pid #pid文件位置
log_file: /var/log/salt/master #日志文件地址
#自动接收minion的key
auto_accept: False
salt-minion的配置文件信息如下
vim /etc/salt/minion
master: s20 #指定mastet的通信地址
master_port: 4506
user: root
id: s20minion1 #id用于指定minion的身份信息 ,待会可以在master上查看到的
acceptance_wait_time: 10
log_file: /var/log/salt/minion
salt-minion2的配置
vim /etc/salt/minion
5.都重启了master和minion之后,查看密钥接受情况,salt通信是在minion初次启动时候,建立新的连接的
systemctl start salt-master
systemctl start salt-minion
6.在master机器上,查看minion的密钥信息
salt-key -L #查看所有密钥
salt-key -a s20minion1 #-a参数 单独接受一个密钥信息
salt-key -A #-A 接受所有的key信息
7.此时就可以在master上 管理 minion的机器了
salt "*" test.ping #验证salt minion信息是否存活
8.将输出的结果,转化为json信息,可以序列化后,丢给前端渲染
salt "*" test.ping --out=json
9.salt的命令学习
语法
salt 核心命令
salt 目标匹配 你要执行的salt模块
salt "s20minion1" test.ping
salt "*" test.fib 50
让机器远程返回主机名给我
参数解释 --summary显示详细信息
salt --summary '*' cmd.run 'hostname'
salt的万能模块 cmd.run 代表让minion机器去做些什么事
salt "*" cmd.run "touch /tmp/爱的魔力准quanquan"
salt "" cmd.run "rm -rf /tmp/"
远程安装软件
第一个方法 cmd.run
salt "*" cmd.run "yum install nginx -y"
salt还提供了更专业的安装软件的命令接口 pkg.install pkg.uninstall就是在调用yum而已
远程卸载nginx
salt '*' pkg.remove "nginx"
salt的服务管理模块 service模块,相当于在minion机器上,执行systemctl start nginx
salt '' service.start "nginx"
salt '' service.stop "nginx"
salt '*' service.restart "nginx"
远程安装nginx,并且启动的方式
salt "" pkg.install 'nginx'
salt "" service.start 'nginx'
salt命令的输出格式 有json和yaml两种
远程安装redis,并且输出json格式
salt "" pkg.install "redis" --out=json
salt "" service.start 'redis' --out=json
salt "*" service.status 'redis' --out=json
yaml语法学习
yaml转化python的数据结构
yaml
first_key:
second_key:
python
用python的字典和列表表示班级 男女同学分配
{
"s20":{"男同学":["丽华","小黑","老徐"],"女同学":["大宝","b哥","超哥"],"不详":["self菊"]}
}
在线yaml语法解析
http://www.bejson.com/validators/yaml_editor/
python的数据结构,转为yaml
{ s20:
{ '男同学': [ '丽华', '小黑', '老徐' ],
'女同学': [ '大宝', 'b哥', '超弟' ],
'不详': [ 'self菊', '蔡旭困' ] } }
yaml如下
"s20":
"男同学":
-
"丽华"
"小黑"-
"老徐"
同学": -
"大宝"
-
"b哥"
-
"超弟"
"不详":-
"self菊"
-
"蔡旭困"
-
-
salt工具之granis静态数据采集,当minion在启动的时候,发送自己所有的数据给master
在启动时候发给master,如果后期服务器硬件修改了,数据就是旧的了,得重启salt-minion
列出minion服务器所有的静态数据
salt '*' grains.items #列出服务器所有的静态数据
salt '*' grains.items --out=json #输出结果为json格式,可以序列化丢给其他程序使用
指定key value取得数据
salt 's20minion1' grains.item osrelease
python操作salt的api命令接口
5 linux下进行pycharm开发
1.获取pycharm的linux包
wget https://download.jetbrains.8686c.com/python/pycharm-community-2018.2.4.tar.gz
2.解压缩源码包