ansible快速部署加速方案


ansible是基于Python的 自动化部署 方案,但是目前只是通过命令行

ansible -i hosts all -a 'uptime'
# or
ansible-playbook -i hosts playbook.yml -e 'args' -t deploy

实现自动化部署.

长此以往,虽然可以实现所谓的自动化,但产品业务线多且杂的情况下,项目很难维护,更不用说以文件为存储的表现形式很差,针对目前使用ansible的经验以及使用中的困难,可以针对性的提出一些解决方案

加速

问题

自动化部署其中最大的障碍就是 网络 的原因

其中需要通过网络上传一些模板文件,有的甚至还需要上传一些压缩包,虽然说几MB的东西很快就能上传成功,但如果把这上传文件所需要的2秒乘以上百,上千台主机呢,更不用说ansible的表现形式就是一个任务一个任务的往下执行,假如在上传模板这一步卡住(等待所有服务器上传成功),这时某台未模板化的服务器的某服务需要重启,是不是会出问题呢

方案

针对这一问题,目前想到的解决方案如下:

  • 适当增加fork数

    目前fork数默认为50,可以适当增加

  • 大文件使用内网(外网)下载

    从部署机上上传文件可能会出现这样那样的问题,尤其是上传到国外服务器时经常会出现ansible playbook的任务卡住问题 …

ansible-playbook中tasks单进程


之前有一个需求,ansible-playbook中需要某一步单步执行,也就是说在有多台服务器时,某个任务只能一台服务器执行完后,另一台服务器才能执行,否者对应集群的服务会出问题

这是一个很简单的需求,ansible中也有对应的实现, --fork 1 或者 使用 serial

但是如果有人忘记加 --fork 1 了呢,而且该任务是在子任务中,使用 include 加载, serial 关键字无法在某一特定任务中使用,只能与 hosts 同级

所幸,在这里 https://www.bountysource.com/issues/26342862-support-for-serial-on-an-individual-task 找到了解决办法,使用 delegate_to

- name: service restart
  # serial: 1 would be the proper solution here, but that can only be set on play level
  # upstream issue: https://github.com/ansible/ansible …

redis集群搭建


Table of Contents

参考资料

Redis 集群是一个提供在多个Redis间节点间共享数据的程序集

准备

集群开始需要运行redis集群实例,而且要让集群正常运作至少需要三个主节点,这里创建六个节点,三个为主节点,三个为从节点,端口号分别为9001,9002,9003,9004,9005,9006

并创建六个以端口号为名字的目录, 在每个目录中运行一个Redis实例

mkdir -p redis/9001
cd redis
mkdir 9002
mkdir 9003
mkdir 9004
mkdir 9005
mkdir 9006

然后将对应的配置redis.conf放入相应的目录中(记得修改端口号)

最小配置选项:

port 9001
cluster-enabled yes
cluster-config-file node9001.conf
cluster-node-timeout 5000
appendonly yes

然后就可以启动redis实例了

redis-server redis/9001/redis.conf …

tornado中session实现


tornado中默认没有session的实现,虽然默认的 set_secure_cookie 已经足够安全了,但更安全的应该是客户端保存session_id,服务端保存对应的信息

注:保存在redis中的经测试是可以的,保存在内存中的貌似还不行

给出源码:

from uuid import uuid4
from redis import StrictRedis
from functools import wraps
from datetime import datetime, timedelta
from pytz import timezone


def singleton(cls):
    instances = {}

    @wraps(cls)
    def getinstance(*args, **kw):
        if cls not in instances:
            instances[cls] = cls(*args, **kw)
        return instances[cls]

    return getinstance


def current_time(tz=None):
    if tz is None …

手机与Linux桌面文件共享


手机: 某米 电脑: archlinux 环境: 同一wifi下

手机共享文件到电脑

最近才发现手机可以开启ftp服务对文件进行共享,直接进入文件管理器开启就行,电脑上使用

ftp target

进行连接

注: get 下载 put 上传

电脑共享文件到手机

这里采用python搭建一个简单的web服务(python3)供手机下载文件

# 首先 cd 到要共享的目录
python -m http.server --bind 0.0.0.0

查看本机IP

ifconfig
# 或者
ip addr

重要: 请确保关闭防火墙,否则手机无法连接

sudo systemctl stop iptables

然后手机浏览器访问 ip:8000 就能下载电脑端的文件了

非同一wifi环境下 : 可以先在电脑端开启wifi热点(可以不联网),我是直接使用networkmanger进行创建的

一个简单的数据分组算法


Table of Contents

之前有这么一个需求

将数据按照时间分组,比如说每5分钟为一组,或者每30分钟为一组,开始时间如果分钟数大于等于30分钟,则设置为30,如果小于30,则设置为0(也可以设置为更复杂的逻辑)

当然中间还有一些数据的统计,分析和计算暂时不管

获取开始时间

def get_start_date(start_date):
    time = datetime.fromtimestamp(int(start_date) / 1000)
    if time.minute >= 30:
        minute = 30
    else:
        minute = 0
    start_date = datetime(time.year, time.month, time.day, time.hour, minute,
                          0)
    start_date = mktime(start_date.timetuple()) * 1000
    return start_date

开始时间很简单,需要注意的是设置分钟,需要将时间戳转换为datetime,设置分钟数后再将datetime转为时间戳

time = datetime.fromtimestamp(int(start_date) / 1000 …

Linux总结(草稿)


Linux发展历史

Linux是由BSD发展而来,BSD又起源于UNIX。UNIX由贝尔实验室开发, 后来开放给各大学教学使用,其中伯克利大学通过对UNIX源码的研究以及不断的改进与扩展, 推出BSD,并于BSD 4.3版本加入网络模块,极大推进UNIX的发展。但后面由于版权等原因, UNIX与BSD之间发生冲突与法律纠纷,直到1998年,在此期间,芬兰大学生Linus Torvalds 于1991年发布首个Linux版本,linux也趁UNIX与BSD纠纷之际,得到非常快速的发展

Linux的最小组成

Linux最小由内核kernel,文件层次结构FHS,系统启动器bootloader组成,其中内存调度, 进程调度等由内核管理,内核可单独运行,但需要与其它组成相配合。

语言:一般有头文件与库文件,头文件为实现,库文件为声明

Linux的安装与启动

当linux启动时,首先启动内核,内核调用init来完成引导进程,init启动时,它会在/etc/inittab内查找默认的运行级别, 然后运行/etc/rc.d/init.d中运行级别的启动脚本。

分区:一般分根分区/与swap交换分区,根分区的设置是为了备份方便

文件系统:在存储设备上组织文件的方法,负责文件的增删改查,linux上常用文件系统有ext2,ext3,ext4,xfs,btrfs等 …

celery动态添加任务


celery是一个基于Python的分布式调度系统,文档在这 ,最近有个需求,想要动态的添加任务而不用重启celery服务,找了一圈没找到什么好办法(也有可能是文档没看仔细),所以只能自己实现囉

为celery动态添加任务,首先我想到的是传递一个函数进去,让某个特定任务去执行这个传递过去的函数,就像这样

@app.task
def execute(func, *args, **kwargs):
    return func(*args, **kwargs)

很可惜,会出现这样的错误

kombu.exceptions.EncodeError: Object of type 'function' is not JSON serializable

换一种序列化方式

@app.task(serializer='pickle')
def execute(func, *args, **kwargs):
    return func(*args, **kwargs)

结果又出现一大串错误信息

ERROR/MainProcess] Pool callback raised exception: ContentDisallowed('Refusing to deserialize untrusted content of type …

我的Linux历程


Linux

是一种计算机操作系统内核,以C语言和汇编语言写成,匹配POSIX标准,以GNU通用公共许可证(GPL2)发布,最早是由林纳斯·托瓦兹开发的类UNIX系统

Linux与UNIX的区别: UNIX系统大多是与硬件配套的,而Linux则可运行在多种硬件平台上。UNIX是商业软件,而Linux自由免费。

Linux发行版

简单的来说将Linux内核与一些系统软件,应用软件进行整合,有的发行版还包括图形界面(x11,wayland),目前所说的Linux大多代表Linux发行版

Linux历程

曾经在某论坛看到linux这个名词,立马装上虚拟机然后安装了我的第一个Linux版本--centos,并且装上了gnome桌面环境,随后开始了Linux折腾之旅, 大概是这样的 centos --> kali --> ubuntu --> fedora --> ubuntu kylin --> mint --> debian --> fedora --> archlinux ......,Linux发行版大概分为3系, debain系,包括ubuntu,mint,kali等,使用包管理器apt-get、aptitude、dpkg;centos或者说红帽系,包括众所周知的小白鼠版本fedora, 如果不是每半年要重装一次,我会一直使用它,而不是archlinux,所使用的包管理器yum,fedora已更换成dnf; 还有其它系,因为它们所占份额太小,包括archlinux …

关于网易云音乐个性推荐无法显示的问题


最近在使用网易云音乐时首页的个性推荐总是无法显示,一直在正在为你生成个性化推荐,网上也没找到什么办法,偶然间使用

┌─[jianglin]─[~]
└──╼ rm -rf .cache/netease-cloud-music/
┌─[jianglin]─[~]
└──╼ rm -rf .config/netease-cloud-music/

重新打开登陆后个性推荐就出现了,特此记录