开发笔记

开发笔记

    • anaconda
    • 开发环境关闭DEBUG
    • py3使用django1.11不支持MYSQL-python的解决办法
    • mysql权限设置
    • 初始化django数据库
    • django ajax携带csrftoken
    • tab键补全: yum install bash-completion -y
    • yum源更新命令
    • uwsgi常用命令
    • nginx常用命令
    • supervisorctl常用命令
    • supervisor设置开机启动
    • docker常用命令
    • nodejs
    • redis
    • celery
    • 标签隐藏、显示
    • windows刷新缓存
    • ssl证书cer转pem
    • cas.py源码修改
    • tar分卷
    • 拆分合并文件
    • Sublime Text
    • css
    • celery
    • 批量kill
    • cas client验证ticket
    • oracle
    • nginx 编译安装
    • python行转列
    • django 模型model filter
    • CSRF\CORS
    • docker常用命令
    • docker-compose常用命令
    • mysql-Inception启动
    • VMware
    • linux离线安装docker
    • 本地安装docker启动时报错
    • 搭建并迁移离线docker registry镜像仓库
    • 离线安装ansible
    • 离线安装mysql5.7
    • 批量配置免密登录
    • svn客户端
    • python 调用ansible api(python2.7 ansible2.7)
    • gunicorn

anaconda

环境变量配置:D:\Anaconda2\Scripts
查看安装包:conda list
查看虚拟环境:conda env list 或 conda info -e
更新conda: conda update conda
创建虚拟环境:conda create -n your_env_name python=3.6   指定路径:conda create  --prefix=/var/local/data/pyenv/xls python=3.6
激活虚拟环境: activate your_env_name
安装额外的包: conda install -n your_env_name [package]  
requirements安装包:while read requirement; do conda install --yes $requirement || pip install $requirement; done < requirements.txt
关闭虚拟环境: deactivate env_name
查找包:conda search pyqtgraph
更新包: conda update numpy (–all 更新所有的包)
移除环境: conda remove -n your_env_name --all
删除环境中的包: conda remove --name your_env_name package_name
查看有镜像列表:conda config --show channels(custom_channels|custom_channels)
设置国内镜像: conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/         conda config --set show_channel_urls yes
uwsgi安装:conda  install -c conda-forge uwsgi      conda install --channel conda-forge uwsgi
本地安装: conda install --use-local obspy-1.0.1-py27_0.tar.bz2
环境克隆:conda create -n BBB --clone AAA
共享环境: conda env export --name snowflakes> environment.yaml
通过环境文件创建环境:conda env create -f environment.yaml 
更新所有库: conda update --all
更新conda自身: conda update conda
更新anaconda自身: conda update anaconda

开发环境关闭DEBUG

使用django.views.static.serve()方法:url(r'^static/(?P.*)$', 'django.views.static.serve', {'document_root': settings.STATIC_ROOT})  url(r'^media/(?P.*)$', 'django.views.static.serve', {'document_root': settings.MEDIA_ROOT})
改变项目运行方式:python manage.py runserver 0.0.0.0:8000 --insecure

py3使用django1.11不支持MYSQL-python的解决办法

在setting.py 添加: import pymysql     pymysql.install_as_MySQLdb()

mysql权限设置

权限设置:
	grant all privileges on *.* to root@localhost identified by 'mysql'; (如果想远程登录的话,将"localhost"改为"%")
	show grants for 'test'@'%';
	grant all on *.* to   dba@localhost;  
    revoke all on *.* from dba@localhost; 
	UPDATE user SET Password = PASSWORD('newpass') WHERE user = 'root';
	CREATE USER 'username'@'host' IDENTIFIED BY 'password'; 
	flush privileges;
创建数据库	CREATE DATABASE `mydb` CHARACTER SET utf8 COLLATE utf8_general_ci;

配置文件中设置binlog模式为row:
	[mysqld]
	log_bin=mysql_bin
	binlog-format=Row
	server-id=1
查看是否启用了日志 show variables like 'log_bin';
查看MySQLbinlog模式 show global variables like "binlog%";
设置binlog模式 set global binlog_format='ROW'; 
复制一个库 mysqldump test -uroot -psf123456 --add-drop-table | mysql pms -u root -psf123456
备份多个数据库  mysqldump -u username -p --databases dbname2 dbname2 > Backup.sql
备份所有数据库  mysqldump -u username -p -all-databases > BackupName.sql
备份表 mysqldump -u username -p dbname table1 table2 ...-> BackupName.sql
还原 mysql -u root -p < C:\backup.sql
删除用户及权限 drop user 用户名@'%';
查询每张表的行数
	use information_schema;
	select table_name,table_rows from tables
	where TABLE_SCHEMA = 'bsm'
	order by table_rows desc;		
查询一个表中有多少个字段 ELECT COUNT(*) FROM information_schema. COLUMNS WHERE table_schema = '数据库名' AND table_name = '表名';
查询一个数据库中有多少张表 SELECT COUNT(*) TABLES, table_schema FROM information_schema.TABLES   WHERE table_schema = '数据库名' GROUP BY table_schema;
查询一个数据库中一共有多少个字段 SELECT COUNT(column_name) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = '数据库名';
查询一个数据库中的所有表和所有字段、字段类型及注释等信息 SELECT TABLE_NAME, column_name, DATA_TYPE, column_comment FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = '数据库名' ;	

初始化django数据库

python manage.py makemigrations # 让 Django 知道我们在我们的模型有一些变更
python manage.py migrate TestModel   # 创建表结构
python manage.py collectstatic #将所需要的静态文件收集到STATIC_ROOT
python manage.py createsuperuser #将所需要的静态文件收集到STATIC_ROOT

命令行设置超级用户:
	在路径/tools/app/EMGC下依次执行以下命令:
		/tools/pyenv/emgc/bin/python
		import os,django
		os.environ.setdefault("DJANGO_SETTINGS_MODULE", "EMGC.settings")
		django.setup()
		from django.contrib.auth.models import User
		User.objects.filter(username="01375150").update(is_superuser=1)

django ajax携带csrftoken

$.ajaxSetup({
    headers: { "X-CSRFToken": getCookie("csrftoken") }
});
function getCookie(name) {
	var cookieValue = null;
	if (document.cookie && document.cookie != '') {
		var cookies = document.cookie.split(';');
		for (var i = 0; i < cookies.length; i++) {
			var cookie = jQuery.trim(cookies[i]);
			// Does this cookie string begin with the name we want?
			if (cookie.substring(0, name.length + 1) == (name + '=')) {
				cookieValue = decodeURIComponent(cookie.substring(name.length + 1));
				break;
			}
		}
	}
	return cookieValue;
}

tab键补全: yum install bash-completion -y

yum源更新命令

重命名 Centos-7.repo -> CentOs-Base.repo
yum clean all
yum makecache
yum update

uwsgi常用命令

wget http://projects.unbit.it/downloads/uwsgi-latest.tar.gz 
uwsgi --ini uwsgin.ini
uwsgi --reload uwsgi.pid
uwsgi --stop uwsgi.pid
uwsgi --connect-and-read uwsgi/uwsgi.status

nginx常用命令

编译安装 https://www.cnblogs.com/luobiao320/p/7189934.html
nginx -c
-t
-s stop 快速停止nginx
-s quit 平滑停止nginx
-s reopen 重新打开日志文件
-s reload 平滑重载所有配置	
开机启动:
	[Unit]
	Description=nginx
	After=network.target
	[Service]
	Type=forking
	ExecStart=/usr/local/nginx/sbin/nginx
	ExecReload=/usr/local/nginx/sbin/nginx -s reload
	ExecStop=/usr/local/nginx/sbin/nginx -s quit
	PrivateTmp=true		  
	[Install]
	WantedBy=multi-user.target

supervisorctl常用命令

supervisord,初始启动Supervisord,启动、管理配置中设置的进程。-c /etc/supervisor.conf 指定配置
supervisorctl shutdown 停服务
supervisorctl stop programxxx,停止某一个进程(programxxx),programxxx为[program:chatdemon]里配置的值,这个示例就是chatdemon。
supervisorctl start programxxx,启动某个进程
supervisorctl restart programxxx,重启某个进程
supervisorctl stop groupworker: ,重启所有属于名为groupworker这个分组的进程(start,restart同理)
supervisorctl stop all,停止全部进程,注:start、restart、stop都不会载入最新的配置文件。
supervisorctl reload,载入最新的配置文件,停止原有进程并按新的配置启动、管理所有进程。
supervisorctl update,根据最新的配置文件,启动新配置或有改动的进程,配置没有改动的进程不会受影响而重启。

supervisor设置开机启动

新建一个“supervisord.service”文件
[Unit] 
Description=Supervisor daemon
[Service] 
Type=forking 
ExecStart=/var/local/data/pyenv/xls/bin/supervisord 
ExecStop=/var/local/data/pyenv/xls/bin/supervisorctl shutdown 
ExecReload=/var/local/data/pyenv/xls/bin/supervisorctl reload 
KillMode=process 
Restart=on-failure 
RestartSec=42s
[Install] 
WantedBy=multi-user.target	
====================================================================
将文件拷贝至:“/usr/lib/systemd/system/supervisord.service”
开机启动: systemctl enable supervisord
验证否开机启动:systemctl is-enabled supervisord
端口被占用解决办法:
	find / -name supervisor.sock
	unlink /name/supervisor.sock

docker常用命令

yum -y install docker-io
保存容器:docker commit -a "runoob.com" -m "my apache" a404c6c174a2  mymysql:v1
删除容易:docker rm -f db01 db02
删除本地镜像:docker rmi -f runoob/ubuntu:v4
运行容器: docker run -itd -p 127.0.0.1:80:8080/tcp --name=auditsql ubuntu:15.10 /bin/bash   (docker run --privileged  -itd -p 8090:80 -p 8003:3306 --name=opsmanage 989761b870ec  /usr/sbin/init)
数据拷贝: docker cp /www/runoob 96f7f14e99ab:/www/

nodejs

设置淘宝镜像:npm install -g cnpm --registry=https://registry.npm.taobao.org  npm config set registry " https://registry.npm.taobao.org " 
vue安装:cnpm install vue -g   cnpm install --global vue-cli
创建 webpack 模板:vue init webpack my-project
安装依赖:cnpm install
运行:cnpm run dev
生成静态文件:npm run build
设置0.0.0.0:在package.json 添加:
						"scripts": {
							"dev": "webpack-dev-server -d --inline --hot --env.dev --host 0.0.0.0",
							"build": "rimraf dist && webpack -p --progress --hide-modules"
						},

redis

客户端:redis-cli(远程主机redis-cli -h 127.0.0.1 -p 6379 -a "mypass")
测试服务是否启动: ping
存储数据的相关信息: info Keyspace
查看所有的key: keys *
清空所有数据: flushall 
使用某个库:SELECT [序号]
清除任务:
	有密码的时候 清除任务 redis-cli -h host -p port -a password -n 11 ltrim transcode 0 196 (-n 后面跟的是你要清除的第几个数据库)
	没有密码的时候 redis-cli -n 11 ltrim transcode 0 196 (-n 后面跟的是你要清除的第几个数据库)

celery

启动workers: celery -A tasks worker --loglevel=info
重启workers: celery multi restart w1 -A project -l info
立即停止workers: celery multi stop w1
任务执行完成后停止workers: celery multi stopwait w1
启动beat:celery -A  project.periodic_task  beat  -l  debug

标签隐藏、显示

显示:style="display:block"或者 $('#div_1').show();
隐藏:style="display:none"或者$('#div_2').hide();

windows刷新缓存

清理apr缓存:apr -d
清理dns缓存:ipconfig\flushdns
刷新ip: ipconfig\all ipconfig\release  ipconfig\renew 

ssl证书cer转pem

openssl x509 -outform der -in cas.sf-express.com.cer -out cas.sf-express.com.pem
openssl s_client -connect cas.sf-express.com:443 -CAfile  cas.sf-express.com.cer

cas.py源码修改

        # url += '?' + urllib_parse.urlencode(params)
		#modified url params
        #  "http://cas/lougout?service=myurl"
        service = "service="+urllib_parse.urlencode(params)[4:]
        url += '?' + service

tar分卷

tar -czvf - * | split -b 95m -d - tools.tar.gz #分卷压缩proc目录,并保持每个压缩包的大小不超过2m字节。命令执行后,会生成proc.tar.gz00、proc.tar.gz01等文件
cat tools.tar.gz* | tar -xzvf - #将各个分卷压缩包解压到当前目录
cat tools.tar.gz* > proc.tar.gz #将各个分卷压缩包合成为一个proc.tar.gz文件
附录:split命令的使用
	split proc.tar.gz -b 2m #将proc.tar.gz文件分割为多个小文件,并保持每个小文件的大小不超过2m字节。命令运行后,源文件依然存在。生成的小文件以默认格式命名,为:xaa、xab等
	split proc.tar.gz -b 2m -d #基本同上,只是生成的小文件以数字格式命名,为:x00、x01等
	split proc.tar.gz -b 2m -d proc.tar.gz #基本同上,只是生成的小文件名前缀是自定义的,为:proc.tar.gz00、proc.tar.gz01等
	split a.txt -C 300k -d a.txt #将a.txt文本文件分割为多个小文件,并保持每个小文件的大小不超过300k字节,而且尽量保持每行的完整性

拆分合并文件

split -b 1G bsm.sql bsm.sql-
cat bsm.sql-a* > bsm.sql

Sublime Text

打开控制台:  Ctrl + ` 。
插件安装: Ctrl+Shift+p   输入install 选择Package Control:Install Package。
插件列表: Ctrl+Shift+P,在对话框中输入“list”,选择“Package Control:List Packages”。
移除插件: Ctrl+Shift+P,在对话框中输入“remove”,选择“Package Control: Remove Packages”。
分屏: 菜单 “View-Layout”就可以选择你的分屏样式。
创建新窗: 快捷键Ctrl+Shift+N 创建一个新窗口。
Emmet 插件: Tab 。
JsFormat 插件: 在打开的JavaScript文件里点右键,选择JsFormat。
SublimeTmpl 插件: 
				Ctrl+Alt+h  新建 html 文件
				Ctrl+Alt+j  新建 javascript 文件
				Ctrl+Alt+c  新建 css 文件
				Ctrl+Alt+p  新建 php 文件
				Ctrl+Alt+r  新建 ruby 文件
				Ctrl+Alt+Shift+p     新建 python 文件
View In Browser 插件:在打开的文档任一处点右键。
LiveReload 插件: 快捷键 Ctr+Alt+V。

css

ol>li:  有序列表
ul>li:  无序列表
dl>dt>dd:  自定义列表
块标签: 独占一行,可以设置宽高。 
行内标签: 不能设置宽高,特殊的是img\input是可以设置宽高。
块级转行级: display:inline。
行级转块级: display:block。
行级转块级,不独占一行 : display:online-block。

position\z-index属性: https://www.cnblogs.com/zhuzhenwei918/p/6112034.html

position:fixed。 指元素的位置相对于浏览器窗口是固定位置,即使窗口是滚动的它也不会滚动,
				且fixed定位使元素的位置与文档流无关,因此不占据空间,且它会和其他元素发生重叠。
				
position:relative; 即使相对元素的内容移动了,但是预留空间的元素仍然保存在正常流动,
					也就是说相对移动之后,不会对下面的其他元素造成影响。
					
position:absolute; 定位元素的父元素具有position:relative/absolute/fixed时,
				   定位元素都会依据父元素而定位,而父元素没有设置position属性或者设置了默认属性,
				   那么定位属性会依据html元素来定位。那么它就会脱离文档流,这样的后果是父元素无法被撑开。

position: sticky;	它就像是relative和fixed的合体,当在屏幕中时按常规流排版,当卷动到屏幕外时则表现如fixed。
					该属性的表现是现实中你见到的吸附效果。
					
z-index: 5; 只能在position属性值为relative或absolute或fixed的元素上有效。
					
					
float:left\right\none; 使元素脱离文档流,按照指定的方向发生移动,遇到父级的边界或者相邻的浮动元素就会停下来。
浮动的特点:	https://blog.csdn.net/baidu_37107022/article/details/71515984
	1、块元素可以在一行显示
	2、按照一个指定的方向移动,遇到父级的边界或者相邻的浮动元素就会停下来
	3、行内元素支持宽高
	4、脱离文档流
		浮动后跟的元素(没有浮动)的位置是从前面浮动元素的位置开始的
		注意:非浮动元素里的内容会留出前面浮动元素的位置(盒模型的位置)
	5、块元素默认宽度会被改变(包裹性)
		块元素不设置宽度,那宽度会自动变成内容所撑开的宽度
	6、父级高度塌陷(破坏性)
		子元素有浮云后,那父级元素的高度不会自动撑开了
	7、换行不会被解析成空格
		浮云后的元素就会脱离文档流了,那它就不属于文档流里的结构了,所以换行、空格都跟父级没关系了
		
浮动的副作用:https://blog.csdn.net/baidu_37107022/article/details/71554283
	1. 块状元素,会钻进浮动元素的下面,被浮动元素所覆盖。
	2. 行内元素,例如文字, 则会环绕在浮动元素的周围,为浮动元素留出空间。
	3. 浮动元素的父元素塌陷。
	
清除浮动方法:https://blog.csdn.net/baidu_37107022/article/details/71557806
	1、clear
	2、给父级添加高度
		有的时候是不能给父级添加高度的,所以这个方法就用不了(父级没有高度的情况下)
	3、inline-block
		具有与上一个的清除浮动一样的总是,同时加了以后这个元素就没有办法居中了
	4、overflow:hidden;
		如果子级有定位的话,并且这个定位超出了父级的范围,那样的话就看不到了,所以不能加这个命令
	5、空标签
空标签是没有内容,但是它的作用是用来清除浮动的,所以不符合行为、样式、结构相分离的标准 ie6下标签是有一个最小高度19px,解决后也会有2像素的偏差 6、br清除浮动
与上面的问题是一样 7、after伪类清除浮动(现在最主流的方法) after 代表选择到的元素的内容的最后面 after伪类的内容默认是一个行内元素 content 设置的内容

celery

celery3.x版本安装:http://shineforever.blog.51cto.com/1429204/1737323
celery4.x版本安装:http://www.cnblogs.com/alex3714/p/6351797.html  (金角大王)
celery3.x版本的,用的django-celery模块,celery4.x用的是django-celery-beat。因为celery4
celery4.x版本的django-celery-beat在djang-admin后台添加task后系统不会对修改后的任务即时生效,而是需要重启celery-beat服务才能生效。
celery3.x版本在django-admin后台增删改查task后不用重启celery-beat就能生效。

启动worker: celery -A UDSTIF worker -l info -P eventlet (win10上运行celery4.x就会出现这个问题:ValueError: not enough values to unpack (expected 3, got 0) 。安装pip install eventlet。运行worker添加参 -P eventlet)
启动beat: celery -A UDSTIF beat -l debug
启动flower: celery flower --broker=redis://localhost:6379
查看已注册的task: celery -A UDSTIF inspect registered

批量kill

ps -ef | grep uwsgi | grep -v grep | grep -v uwsgi.log |cut -c 9-15 | xargs kill -s 9

cas client验证ticket

base_url: https://cas.sf-express.com/cas/serviceValidate
{'ticket': 'ST-129899-snX6EEyf69XDL92d5UGX-casnode1', 'service': 'http://10.118.80.125:8080/emgc/login/?next=%2Femgc%2F'}

params = {
        'ticket': ticket,
        'service': self.service_url
    }
if self.proxy_callback:
	params.update({'pgtUrl': self.proxy_callback})
base_url = urllib_parse.urljoin(self.server_url, self.url_suffix)
page = requests.get(base_url, params=params)
try:
	return page.content
finally:
	page.close()
	page.close()

oracle

/*第1步:创建临时表空间  */
create temporary tablespace test_temp
tempfile '/app/orcl_data/test_temp.dbf'
size 50m
autoextend on
next 50m maxsize 20480m
extent management local;
/*第2步:创建数据表空间  */
create tablespace test_data  
logging  
datafile '/app/orcl_data/test_data.dbf' 
size 50m  
autoextend on  
next 50m maxsize 20480m  
extent management local;  
/*第3步:创建用户并指定表空间  */
create user test identified by test  
default tablespace test_data  
temporary tablespace test_temp;  
/*第4步:给用户授予权限  */
grant connect,resource,dba to test;
/*删除表空间、用户  */
drop tablespace test_data;
drop tablespace test_temp;
drop user test; 

nginx 编译安装

yum -y install gcc gcc-c++
yum -y install zlib zlib-devel pcre pcre-devel 
yum -y install openssl openssl-devel
yum install -y perl-ExtUtils-Embed
 相对路径 
./configure --prefix=.. --sbin-path=sbin/nginx --conf-path=conf/nginx.conf --error-log-path=logs/error.log --http-log-path=logs/access.log --pid-path=run/nginx.pid --lock-path=lock/nginx.lock --user=nginx --group=nginx --http-client-body-temp-path=tmp/client_temp --http-proxy-temp-path=tmp/proxy_temp --http-fastcgi-temp-path=tmp/fastcgi_temp --http-uwsgi-temp-path=tmp/uwsgi_temp --http-scgi-temp-path=tmp/scgi_temp --with-http_stub_status_module --without-http_rewrite_module --without-http_gzip_module
 绝对路径:
configure arguments: --prefix=/tools/nginx --conf-path=/tools/nginx/conf/nginx.conf --error-log-path=/tools/nginx/logs/error.log --http-log-path=/tools/nginx/logs/access.log --pid-path=/tools/nginx/run/nginx.pid --lock-path=/tools/nginx/lock/nginx.lock --user=nginx --group=nginx --http-client-body-temp-path=/tools/nginx/tmp/client_temp --http-proxy-temp-path=/tools/nginx/tmp/proxy_temp --http-fastcgi-temp-path=/tools/nginx/tmp/fastcgi_temp --http-uwsgi-temp-path=/tools/nginx/tmp/uwsgi_temp --http-scgi-temp-path=/tools/nginx/tmp/scgi_temp --with-http_stub_status_module --without-http_gzip_module --with-pcre=/root/pcre-8.38

make 
make install
useradd -r  tools -s /bin/false -M

python行转列

[[row[i] for row in tableList] for i in range(len(tableList[0]))]

django 模型model filter

Person.objects.filter(name="abc")  # 等于
Person.objects.filter(name__exact="abc") 名称严格等于 "abc" 的人
Person.objects.filter(name__iexact="abc")  # 名称为 abc 但是不区分大小写,可以找到 ABC, Abc, aBC,这些都符合条件
Person.objects.filter(name__contains="abc")  # 名称中包含 "abc"的人
Person.objects.filter(name__icontains="abc")  #名称中包含 "abc",且abc不区分大小写
Person.objects.filter(name__regex="^abc")  # 正则表达式查询
Person.objects.filter(name__iregex="^abc")  # 正则表达式不区分大小写
Person.objects.exclude(name__contains="WZ")  # 排除包含 WZ 的Person对象

CSRF\CORS

CSRF:因为是基于cookie来进行用户识别的,cookie如果被截获,用户就会很容易受到跨站请求伪造的攻击。
CORS: 服务器要支持CORS(跨来源资源共享)策略,一般我们在服务端这么做就可以了 Access-Control-Allow-Origin:*	

docker常用命令

	yum -y install docker-io
	保存容器:docker commit -a "runoob.com" -m "my apache" a404c6c174a2  mymysql:v1
	删除容易:docker rm -f db01 db02
	删除本地镜像:docker rmi -f runoob/ubuntu:v4
	运行容器: docker run -itd -p 127.0.0.1:80:8080/tcp --name=auditsql ubuntu:15.10 /bin/bash   (docker run --privileged  -itd -p 8090:80 -p 8003:3306 --name=opsmanage 989761b870ec  /usr/sbin/init)
	数据拷贝: docker cp /www/runoob 96f7f14e99ab:/www/
	后台运行 docker run -d --name=inception alpine
	进入容器 docker exec -it 081c1dd221d4 sh  / docker exec -it 081c1dd221d4 /bin/bash
	构建容器 docker build -t inception .
	从容器创建镜像 docker commit -a "01375150" -m "add omnidb" b6a0a9613a58 omnidb
	常见异常:
		1、错误
			提示:在执行systemctl httpd start时,出现错误:Failed to get D-Bus connection: Operation not permitted
			原因:好像是因为dbus-daemon没能启动
			解决:创建container时,在后面加上/usr/sbin/init: docker run -d -e "container=docker" --privileged=true [ID] /usr/sbin/init
	停止所有容器 docker stop $(docker ps -a -q) 
	删除所有容器 docker  rm $(docker ps -a -q) 
	删除所有镜像 docker rmi `docker images -q` 			
	查看镜像的详细信息 docker inspect 71fe75e71a62

docker-compose常用命令

docker-compose常用的命令有:
	docker-compose up -d 启动容器,如果镜像不存在则先下载镜像,如果容器没创建则创建容器,如果容器没启动则启动
	docker-compose down 停止并移除容器
	docker-compose restart 重启服务
	强行删除镜像:
		systemctl stop docker
		rm -rf /var/lib/docker
		systemctl start docker

mysql-Inception启动

使用之定义配置文件 nohup /root/Yearning/install/inception/bin/Inception --defaults-file=/root/Yearning/install/inception/bin/my.cnf &
nohup /app/inception/bin/Inception --defaults-file=/app/inception/conf/inc.cnf &

VMware

1、修改VM服务为手动。打开服务(运行->services.msc),找到VMware Agent Service、VMAuthdService、VMnetDHCP、VMware NAT Service四个服务,将启动类型修改为“手动” 

2、编写批处理命令(见附件“启动VM服务.rar”,下载后双击即可运行)。 
1)启动: 
	net start VMnetDHCP 
   net start "VMware NAT Service" 
   net start VMUSBArbService 
2)关闭: 
	net stop VMnetDHCP 
   net stop "VMware NAT Service" 
   net stop VMUSBArbService 

linux离线安装docker

外网机器:
	1、搭建仓库,下载createrepo以及所有依赖
		yum -y  install epel-release
		mkdir /var/ftp/pub/localrepo
		yum -y install createrepo --downloadonly --downloaddir=/var/ftp/pub/localrepo
	2、下载docker、以及所有依赖
		yum remove docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-selinux docker-engine-selinux docker-engine
		yum install -y yum-utils device-mapper-persistent-data lvm2 --downloadonly --downloaddir=/var/ftp/pub/localrepo
		yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
		yum makecache fast
		yum -y install docker-ce --downloadonly --downloaddir=/var/ftp/pub/localrepo
内网机器:
	1、将目标机器系统自带的仓库文件,转移备份
		mkdir /etc/yum.repos.d/backup
		mv /etc/yum.repos.d/*.repo /etc/yum.repos.d/backup
		yum clean all
		yum makecache
	2、安装搭建仓库所需的的软件包,主包为createrepo,请按如下顺序安装
		mkdir -p /var/ftp/pub/localrepo
		cd /var/ftp/pub/localrepo
		rpm -qa | grep libxml2 | xargs rpm -e --nodeps
		rpm -qa | grep deltarpm| xargs rpm -e --nodeps
		rpm -ivh deltarpm-3.6-3.el7.x86_64.rpm
		rpm -ivh python-deltarpm-3.6-3.el7.x86_64.rpm
		rpm -ivh libxml2-2.9.1-6.el7_2.3.x86_64.rpm
		rpm -ivh libxml2-python-2.9.1-6.el7_2.3.x86_64.rpm
		rpm -ivh createrepo-0.9.9-28.el7.noarch.rpm
		touch /etc/yum.repos.d/localrepo.repo
		echo "[localrepo]" >> /etc/yum.repos.d/localrepo.repo
		echo "name=Local Repository" >> /etc/yum.repos.d/localrepo.repo
		echo "baseurl=file:///var/ftp/pub/localrepo" >> /etc/yum.repos.d/localrepo.repo
		echo "gpgcheck=0" >> /etc/yum.repos.d/localrepo.repo
		echo "enabled=1" >> /etc/yum.repos.d/localrepo.repo
		createrepo -v /var/ftp/pub/localrepo
		yum repolist
	3、利用本地yum仓库,安装所需软件包
		yum remove docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-selinux docker-engine-selinux docker-engine
		yum install -y yum-utils device-mapper-persistent-data lvm2
		yum -y install docker-ce    #rpm -e systemd-219-19.el7.x86_64  --nodeps   rpm -e cryptsetup-1.6.7-1.el7.x86_64 
	4、安装完成后,删除搭建的本地yum仓库,恢复系统yum仓库文件
		rm -rf /var/ftp/pub/localrepo
		rm -rf /etc/yum.repos.d/localrepo.repo
		mv /etc/yum.repos.d/backup/*.repo /etc/yum.repos.d/
		rm -rf /etc/yum.repos.d/backup
		yum clean all			

本地安装docker启动时报错

错误:
	Error starting daemon: SELinux is not supported with the overlay2 graph driver on this kernel. Either boot into a ne...led=false)
原因:	
	这台机器的linux的内核中的SELinux不支持 overlay2 graph driver 。解决方法有两个,要么启动一个新内核,要么就在docker配置文件里面里禁用selinux,--selinux-enabled=false
解决: 
	1、将配置文件的“--selinux-enabled”改成“--selinux-enabled=false”,然后再重启docker。
	2、vi  /etc/sysconfig/docker
		OPTIONS='--selinux-enabled=false --log-driver=journald --signature-verification=false --registry-mirror=https://fzhifedh.mirror.aliyuncs.com --insecure-registry=registry.sese.com'    #修改这里的"--selinux-enabled",改成"--selinux-enabled=false"		

搭建并迁移离线docker registry镜像仓库

外网机器:
	1、下载registry的docker镜像 
		docker pull registry:latest
	2、创建docker镜像存储目录
		mkdir -p /data/registry-data 
	3、添加http访问权限,修改文件/etc/docker/daemon.json,之后就可以使用http的方式registry
		cp /etc/docker/daemon.json /etc/docker/daemon.json.bak
		vim /etc/docker/daemon.json
		{"insecure-registries":["127.0.0.1:5000"]}
	4、重启docker服务
		systemctl restart docker
	5、运行registry服务,在A机器上运行registry服务并将/data/registry-data目录挂载到容器内/var/lib/registry目录中
		docker run -d --name=registry -v /data/registry-data:/var/lib/registry -p 5000:5000 docker.io/registry
	6、修改本地镜像tag
		docker tag registry.cn-hangzhou.aliyuncs.com/cookie/yearning 127.0.0.1:5000/yearning
		docker tag docker.io/mysql 127.0.0.1:5000/mysql:5.7
	7、上传镜像到本地的registry仓库中
		docker push 127.0.0.1:5000/yearning
		docker push 127.0.0.1:5000/mysql:5.7
	8、打包registry镜像
		docker save -o registry.tar docker.io/registry
	9、打包/data/registry-data目录
		tar czvf registry-images-data.tar.gz /data/registry-data
内网机器:
	1、添加http访问权限,修改文件/etc/docker/daemon.json,之后就可以使用http的方式registry
		cp /etc/docker/daemon.json /etc/docker/daemon.json.bak
		vim /etc/docker/daemon.json
		{"insecure-registries":["127.0.0.1:5000"]}
	2、重启docker服务
		systemctl restart docker
	3、导入registry镜像
		docker load -i registry.tar
	4、解压镜像数据
		tar zxvf registry-images-data.tar.gz -C /data/registry-data/
	5、运行registry容器
		docker run -d --name=registry -v /data/registry-data:/var/lib/registry -p 5000:5000 docker.io/registry
	6、验证使用
		docker pull 127.0.0.1:5000/yearning
		docker pull 127.0.0.1:5000/mysql:5.7

离线安装ansible

外网机器:
	1、下载、安装pip
		yum -y install python-pip --downloadonly --downloaddir=/var/ftp/pub/localrepo
		yum install python-pip
	2、下载ansible
		mkdir py_packages
		pip install --download  ./py_packages  ansible  #或者pip download -d ./py_packages   ansible
内网机器:
	1、将目标机器系统自带的仓库文件,转移备份
		mkdir /etc/yum.repos.d/backup
		mv /etc/yum.repos.d/*.repo /etc/yum.repos.d/backup
		yum clean all
		yum makecache
	2、安装搭建仓库所需的的软件包,主包为createrepo,请按如下顺序安装
		mkdir -p /var/ftp/pub/localrepo
		cd /var/ftp/pub/localrepo
		rpm -qa | grep libxml2 | xargs rpm -e --nodeps
		rpm -qa | grep deltarpm| xargs rpm -e --nodeps
		rpm -ivh deltarpm-3.6-3.el7.x86_64.rpm
		rpm -ivh python-deltarpm-3.6-3.el7.x86_64.rpm
		rpm -ivh libxml2-2.9.1-6.el7_2.3.x86_64.rpm
		rpm -ivh libxml2-python-2.9.1-6.el7_2.3.x86_64.rpm
		rpm -ivh createrepo-0.9.9-28.el7.noarch.rpm
		cp -f /root/myrpm/* /var/ftp/pub/localrepo
		touch /etc/yum.repos.d/localrepo.repo
		echo "[localrepo]" >> /etc/yum.repos.d/localrepo.repo
		echo "name=Local Repository" >> /etc/yum.repos.d/localrepo.repo
		echo "baseurl=file:///var/ftp/pub/localrepo" >> /etc/yum.repos.d/localrepo.repo
		echo "gpgcheck=0" >> /etc/yum.repos.d/localrepo.repo
		echo "enabled=1" >> /etc/yum.repos.d/localrepo.repo
		createrepo -v /var/ftp/pub/localrepo
	3、安装pip
		yum install python-pip
	4、安装完成后,删除搭建的本地yum仓库,恢复系统yum仓库文件
		rm -rf /var/ftp/pub/localrepo
		rm -rf /etc/yum.repos.d/localrepo.repo
		mv /etc/yum.repos.d/backup/*.repo /etc/yum.repos.d/
		rm -rf /etc/yum.repos.d/backup
		yum clean all
	5、安装ansible
		pip install --no-index --find-links=file:./py_packages ansible

离线安装mysql5.7

外网机器:
	1、下载并安装MySQL官方的 Yum Repository
		wget -i -c http://dev.mysql.com/get/mysql57-community-release-el7-10.noarch.rpm
		yum -y install mysql57-community-release-el7-10.noarch.rpm
	2、下载MySQL服务
内网安装:
	1、安装MySQL服务器
		yum -y install mysql-community-server
	2、获取密码并修改
		grep "password" /var/log/mysqld.log
		ALTER USER 'root'@'localhost' IDENTIFIED BY 'new password';
		SHOW VARIABLES LIKE 'validate_password%';

批量配置免密登录

手动:
	1.生成秘钥:ssh-keygen
	2.公钥复制:ssh-copy-id user@ip
自动:
	1.安装expect: yum -y install expect
	2、准备配置文件:ip列表
	3、脚本:
		#!/bin/bash
		datadir=$1
		PASSWORD=PassW0@@rd#
		auto_ssh_copy_id() {
			expect -c "set timeout -1;
				spawn ssh-copy-id $1;
				expect {
					*(yes/no)* {send -- yes\r;exp_continue;}
					*assword:* {send -- $2\r;exp_continue;}
					eof        {exit 0;}
				}";
		}

		ssh_copy_id_to_all() {
			cat ${datadir} | while read line
			do
				arr=($line)
				SERVER=${arr[0]}
				#PASSWORD=${arr[1]}
				auto_ssh_copy_id $SERVER $PASSWORD
			done
		}

		check_is_ok() {
			>./exec_result.txt
			cat ${datadir} | while read line
			do
				arr=($line)
				ssh ${arr[0]} "date" < /dev/null #也可以用 ssh -n 。主要用于防止ssh 读入完while中的数据,导致read无数据可读
				if [ $? = 0 ];
				then
					echo ${arr[0]} success >> ./exec_result.txt
				else
					echo ${arr[0]} failed >> ./exec_result.txt
				fi
			done
		}

		ssh_copy_id_to_all
		check_is_ok

svn客户端

安装 yum install -y subversion
获取pkg svn checkout http://svn-pro.sf-express.com/svn/upgrade-new/releases/CMSP/PRD_V8.7/R1	

python 调用ansible api(python2.7 ansible2.7)

#!/usr/bin/python2
# -*- coding: utf-8 -*-

import time
import os
import tempfile
import json
import shutil
from collections import namedtuple
from ansible.parsing.dataloader import DataLoader
from ansible.vars.manager import VariableManager
from ansible.inventory.manager import InventoryManager
from ansible.playbook.play import Play
from ansible.executor.task_queue_manager import TaskQueueManager
from ansible.executor.playbook_executor import PlaybookExecutor
from ansible.plugins.callback import CallbackBase
import ansible.constants as C
 
 
class ResultCallback(CallbackBase):
    def __init__(self, *args, **kwargs):
        # super(ResultsCollector, self).__init__(*args, **kwargs)
        self.host_ok = {}
        self.host_unreachable = {}
        self.host_failed = {}
 
    def v2_runner_on_unreachable(self, result):
        self.host_unreachable[result._host.get_name()] = result
 
    def v2_runner_on_ok(self, result, *args, **kwargs):
        self.host_ok[result._host.get_name()] = result
 
    def v2_runner_on_failed(self, result, *args, **kwargs):
        self.host_failed[result._host.get_name()] = result
 
 
class AnsibleApi(object):
    def __init__(self, playbook_path, extra_vars, host_list):
        self.playbook_path = playbook_path
        self.inventory_file = tempfile.mktemp(str(int(time.time())))
        host_list.insert(0, '[remotehost]')
        with open(self.inventory_file, 'w+') as file:
            hosts = []
            for host in host_list:
                hosts.append(str(host))
            file.write('\n'.join(hosts))
        self.Options = namedtuple('Options',
                             ['connection',
                              'remote_user',
                              'ask_sudo_pass',
                              'verbosity',
                              'ack_pass',
                              'module_path',
                              'forks',
                              'become',
                              'become_method',
                              'become_user',
                              'check',
                              'listhosts',
                              'listtasks',
                              'listtags',
                              'syntax',
                              'sudo_user',
                              'sudo',
                              'diff'])
        self.ops = self.Options(connection='smart',
                              remote_user=None,
                              ack_pass=None,
                              sudo_user=None,
                              forks=5,
                              sudo=None,
                              ask_sudo_pass=False,
                              verbosity=5,
                              module_path=None,
                              become=None,
                              become_method=None,
                              become_user=None,
                              check=False,
                              diff=False,
                              listhosts=None,
                              listtasks=None,
                              listtags=None,
                              syntax=None)
        self.loader = DataLoader()
        self.passwords = dict()
        self.results_callback = ResultCallback()
        self.inventory = InventoryManager(loader=self.loader, sources=[self.inventory_file])
        self.variable_manager = VariableManager(loader=self.loader, inventory=self.inventory)
        self.variable_manager.extra_vars = extra_vars
 
    def runansible(self,host_list, task_list):
 
        play_source = dict(
            name="Ansible Play",
            hosts=host_list,
            gather_facts='no',
            tasks=task_list
        )
        play = Play().load(play_source, variable_manager=self.variable_manager, loader=self.loader)
 
        tqm = None
        try:
            tqm = TaskQueueManager(
                inventory=self.inventory,
                variable_manager=self.variable_manager,
                loader=self.loader,
                options=self.ops,
                passwords=self.passwords,
                stdout_callback=self.results_callback,
                run_additional_callbacks=C.DEFAULT_LOAD_CALLBACK_PLUGINS,
                run_tree=False,
            )
            result = tqm.run(play)
        finally:
            if tqm is not None:
                tqm.cleanup()
            shutil.rmtree(C.DEFAULT_LOCAL_TMP, True)
 
        results_raw = {}
        results_raw['success'] = {}
        results_raw['failed'] = {}
        results_raw['unreachable'] = {}
 
        for host, result in self.results_callback.host_ok.items():
            results_raw['success'][host] = json.dumps(result._result)
 
        for host, result in self.results_callback.host_failed.items():
            results_raw['failed'][host] = result._result['msg']
 
        for host, result in self.results_callback.host_unreachable.items():
            results_raw['unreachable'][host] = result._result['msg']
 
        print results_raw
 
 
    def playbookrun(self):
        playbook = PlaybookExecutor(playbooks=self.playbook_path,
                                    inventory=self.inventory,
                                    variable_manager=self.variable_manager,
                                    loader=self.loader, options=self.ops, passwords=self.passwords)
        result = playbook.run()
        return result
		
    def __del__(self):
        if self.inventory_file:
            os.remove(self.inventory_file)
 
if __name__ == "__main__":
    a = AnsibleApi( playbook_path=['/root/test-ansible-playbook/test-command.yml'], extra_vars={'myvar': 'test my var'}, host_list=['192.168.252.102','192.168.252.101'])
    #host_list = ['192.168.252.102']
    #tasks_list = [
    #    dict(action=dict(module='command', args='ls -l')),
    #    dict(action=dict(module='shell', args='python sleep.py')),
    #    dict(action=dict(module='synchronize', args='src=/home/op/test dest=/home/op/ delete=yes')),
    #]
    #a.runansible(host_list,tasks_list)
    #a.playbookrun(playbook_path=['/root/test-ansible-playbook/test-command.yml'], extra_vars={'myvar': 'test my var'}, host_list=['192.168.252.102'])
    a.playbookrun()

gunicorn

gunicorn settingConf.wsgi:application -c ./gunicorn.conf.py
/app/pyenv/bin/gunicorn settingConf.wsgi:application -c /app/yearning/src/gunicorn.conf.py	
gunicorn.conf.py    
    import os
	from multiprocessing import cpu_count	
	bind = "0.0.0.0:8080"
	workers = cpu_count()*2
	backlog = 1024
	worker_class = 'gevent'
	daemon = True
	forworded_allow_ips = '*'
	timeout = 1000
	proc_name = 'yearning_prc'
	pidfile = '/app/yearning/yearning.pid'
	accesslog = '/app/yearning/logs/all.log'
	errorlog = '/app/yearning/logs/error.log'

你可能感兴趣的:(开发笔记)