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.解压缩源码包

原文地址:https://www.cnblogs.com/Doner/p/11154214.html