Browse Source

changed ...

Thankxie 2 months ago
parent
commit
8fa56194d5
100 changed files with 6690 additions and 0 deletions
  1. 49 0
      docs/Cloud/ceph/ceph-deploy.md
  2. 11 0
      docs/Cloud/ceph/ceph.md
  3. 0 0
      docs/Cloud/ceph/install.md
  4. 7 0
      docs/Cloud/k8s/index.md
  5. 49 0
      docs/Cloud/openstack/create_vm.md
  6. 9 0
      docs/Cloud/openstack/glance.md
  7. 23 0
      docs/Cloud/openstack/heat.md
  8. 39 0
      docs/Cloud/openstack/horizon.md
  9. 71 0
      docs/Cloud/openstack/index.md
  10. 61 0
      docs/Cloud/openstack/kvm.md
  11. 46 0
      docs/Cloud/openstack/neutron.md
  12. 161 0
      docs/Cloud/openstack/neutron/l3_ha.markdown
  13. 56 0
      docs/Cloud/openstack/nova.md
  14. 95 0
      docs/Cloud/openstack/optimize.md
  15. 68 0
      docs/Cloud/openstack/qemu-img.md
  16. 86 0
      docs/Cloud/openstack/quota.md
  17. 7 0
      docs/Cloud/openstack/quota/openvswitch.markdown
  18. 146 0
      docs/Cloud/openstack/quota/openvswitch/vlan.markdown
  19. BIN
      docs/Cloud/openstack/quota/openvswitch/vlan/pasted_image.png
  20. 314 0
      docs/DevOps/ansible/config.md
  21. 48 0
      docs/DevOps/ansible/copy模块.markdown
  22. 41 0
      docs/DevOps/ansible/defalut.cfg.markdown
  23. BIN
      docs/DevOps/ansible/images/pasted_image.png
  24. BIN
      docs/DevOps/ansible/images/pasted_image001.png
  25. BIN
      docs/DevOps/ansible/images/pasted_image002.png
  26. BIN
      docs/DevOps/ansible/images/pasted_image003.png
  27. BIN
      docs/DevOps/ansible/images/pasted_image004.png
  28. BIN
      docs/DevOps/ansible/images/pasted_image005.png
  29. BIN
      docs/DevOps/ansible/images/pasted_image006.png
  30. 56 0
      docs/DevOps/ansible/index.markdown
  31. 28 0
      docs/DevOps/ansible/install.markdown
  32. 494 0
      docs/DevOps/ansible/loop.md
  33. 16 0
      docs/DevOps/ansible/playbooks.markdown
  34. 28 0
      docs/DevOps/ansible/roles.markdown
  35. 40 0
      docs/DevOps/ansible/shell模块.markdown
  36. 9 0
      docs/DevOps/ansible/start.md
  37. 86 0
      docs/DevOps/ansible/tags用法.markdown
  38. 33 0
      docs/DevOps/ansible/when.markdown
  39. 0 0
      docs/DevOps/index.md
  40. 87 0
      docs/Linux/bond-model.md
  41. 40 0
      docs/Linux/centos/CentOS.md
  42. 74 0
      docs/Linux/centos/bond.md
  43. 19 0
      docs/Linux/centos/index.md
  44. 63 0
      docs/Linux/centos/networks.markdown
  45. 0 0
      docs/Linux/centos/optimizing.md
  46. 122 0
      docs/Linux/command/ab.md
  47. 29 0
      docs/Linux/command/accept.md
  48. 104 0
      docs/Linux/command/ack.md
  49. 134 0
      docs/Linux/command/alias.md
  50. 28 0
      docs/Linux/command/apachectl.md
  51. 131 0
      docs/Linux/command/apk.md
  52. 74 0
      docs/Linux/command/apropos.md
  53. 102 0
      docs/Linux/command/apt-get.md
  54. 30 0
      docs/Linux/command/apt-key.md
  55. 28 0
      docs/Linux/command/apt-sortpkgs.md
  56. 51 0
      docs/Linux/command/aptitude.md
  57. 160 0
      docs/Linux/command/ar.md
  58. 36 0
      docs/Linux/command/arch.md
  59. 22 0
      docs/Linux/command/arj.md
  60. 72 0
      docs/Linux/command/arp.md
  61. 46 0
      docs/Linux/command/arpd.md
  62. 50 0
      docs/Linux/command/arping.md
  63. 35 0
      docs/Linux/command/arptables.md
  64. 26 0
      docs/Linux/command/arpwatch.md
  65. 41 0
      docs/Linux/command/as.md
  66. 84 0
      docs/Linux/command/at.md
  67. 100 0
      docs/Linux/command/atop.md
  68. 36 0
      docs/Linux/command/atq.md
  69. 39 0
      docs/Linux/command/atrm.md
  70. 982 0
      docs/Linux/command/awk.md
  71. 70 0
      docs/Linux/command/axel.md
  72. 85 0
      docs/Linux/command/badblocks.md
  73. 53 0
      docs/Linux/command/base64.md
  74. 47 0
      docs/Linux/command/basename.md
  75. 38 0
      docs/Linux/command/batch.md
  76. 79 0
      docs/Linux/command/bc.md
  77. 48 0
      docs/Linux/command/bg.md
  78. 59 0
      docs/Linux/command/bind.md
  79. 96 0
      docs/Linux/command/blkid.md
  80. 55 0
      docs/Linux/command/blockdev.md
  81. 50 0
      docs/Linux/command/bmodinfo.md
  82. 65 0
      docs/Linux/command/break.md
  83. 70 0
      docs/Linux/command/builtin.md
  84. 41 0
      docs/Linux/command/bunzip2.md
  85. 21 0
      docs/Linux/command/bye.md
  86. 39 0
      docs/Linux/command/bzcat.md
  87. 22 0
      docs/Linux/command/bzcmp.md
  88. 22 0
      docs/Linux/command/bzdiff.md
  89. 22 0
      docs/Linux/command/bzgrep.md
  90. 186 0
      docs/Linux/command/bzip2.md
  91. 23 0
      docs/Linux/command/bzip2recover.md
  92. 21 0
      docs/Linux/command/bzless.md
  93. 21 0
      docs/Linux/command/bzmore.md
  94. 80 0
      docs/Linux/command/cal.md
  95. 31 0
      docs/Linux/command/cancel.md
  96. 73 0
      docs/Linux/command/cat.md
  97. 91 0
      docs/Linux/command/cd.md
  98. 62 0
      docs/Linux/command/cdrecord.md
  99. 98 0
      docs/Linux/command/chage.md
  100. 0 0
      docs/Linux/command/chattr.md

+ 49 - 0
docs/Cloud/ceph/ceph-deploy.md

@@ -0,0 +1,49 @@
+# 扩容
+
+## 添加OSD
+### 备份ceph.conf文件
+登录至 osd 节点;
+```
+mv /etc/ceph/ceph.conf /etc/ceph/ceph.conf.bak`date +%Y%m%d%H%M`
+```
+
+### 清空数据盘
+登录至 ceph admin 节点   
+这里的hostname是指ceph osd 节点的hostname;  
+sdx是指该节点需要作为osd的设备。    
+```
+ceph-deploy disk zap  $hostname:$sdx
+```
+
+### 添加osd
+在admin节点/home/ceph_cluster目录中执行  
+这里的hostname是指ceph osd 节点的hostname;sdx是指该节点需要作为osd的设备。   
+```
+ceph-deploy osd create $hostname:$sdx
+```
+
+### 将OSD添加到ceph crushmap
+根据osd在主机上的分布情况,将其添加到ceph集群的crushmap中,在admin节点执行下述命令。  
+ID是osd号,WEIGHT是权重,POOL是pool域(这里为sas_root),RACK是rack域(这里是sas_rack01),HOST为host域  
+```
+ceph osd crush add $ID $WEIGHT pool=$POOL rack=$RACK host=$HOST
+```
+
+
+### 中止
+```
+ceph osd set norebalance
+ceph osd set nobackfill
+ceph osd set norecover
+```
+
+### crushmap备份编辑
+
+```
+获得默认 crushmap (加密)      [ ceph osd getcrushmap -o crushmap.dump ]
+备份当前 crushmap  [ cp  crushmap.dump crushmap.dump_20151218  <- 备份这个当前 crush map ]
+转换crushmap 格式(加密格式 -> 明文)  [ crushtool -d crushmap.dump -o crushmap.txt ]
+转换 crushmap 格式(明文 -> 加密格式)   [ crushtool -c crushmap.txt -o crushmap.done ]
+重新使用新 crushmap  [ ceph osd setcrushmap -i crushmap.done ]
+
+```

+ 11 - 0
docs/Cloud/ceph/ceph.md

@@ -0,0 +1,11 @@
+
+
+### 修改副本
+
+```
+  ceph osd pool set $pool_name size 2
+  ceph osd pool set $pool_name min_size 1
+```
+
+### 添加OSD
+

+ 0 - 0
docs/Cloud/ceph/install.md


+ 7 - 0
docs/Cloud/k8s/index.md

@@ -0,0 +1,7 @@
+# kubernets
+
+# 介绍
+
+# 安装
+
+# 应用

+ 49 - 0
docs/Cloud/openstack/create_vm.md

@@ -0,0 +1,49 @@
+# create vm
+Created 星期二 15 三月 2016
+
+images_id
+
+常:
+net_id
+subnet_id
+
+变:
+内型:flavor; 
+镜像:images_id;
+IP地址:ip_address; 
+虚拟机名:vm_name; 
+物理机:
+ 
+
+
+一、创建网络:
+测试网络 template_public  网络  id  47d15423-fb80-445b-8828-aea42ce43b55
+subnet_id   子网 id   860057ff-16b7-4246-b76f-3ae8dab14fa9
+
+neutron port-create --fixed-ip subnet_id=860057ff-16b7-4246-b76f-3ae8dab14fa9,ip_address=10.1.10.12 --name test12 47d15423-fb80-445b-8828-aea42ce43b55
+	
+二、创建 volume
+nova volume-create --volume-type sas --display-name volume-name-3 50
+	
+nova volume-create --image-id 7e3c38f8-e426-4f6e-b0c2-d35db7aaaec8 --volume-type sas --display-name xiecd 1  | grep " id " |cut -d "|" -f3 |cut -d " " -f2 
+	
+nova volume-create --image-id "%s" \
+--volume-type sas --display-name "%s" "%s" \
+| grep " id " |cut -d "|" -f3 |cut -d " " -f2 
+
+三 、创建虚拟机:
+nova boot --config-drive true --flavor m1.tiny --block-device source=image,id=7e3c38f8-e426-4f6e-b0c2-d35db7aaaec8,dest=volume,size=50,bootindex=0 --nic port-id=6506a7cf-c196-40e4-80d7-071a19d79ee9 --security-group default  --availability-zone nava:cc1  instance-name
+	
+nova boot --config-drive true --flavor 1 --boot-volume 5a25de58-acf3-4e17-8a58-1ac84d085abd(volume_id)
+  --nic port-id=f370d408-6946-4142-9c29-f1438441c48c(port_id) --security-group default vm_name
+	
+ 指定物理机选用 --availability-zone nova:cc3 
+	
+网络部分:--nic port-id  
+  --nic net-id
+
+id_pub_router=`neutron router-create --ha true $NAME_PUBLIC_ROUTER \
+   | grep " id " |cut -d '|' -f3 |cut -d ' ' -f2`
+					
+					
+

+ 9 - 0
docs/Cloud/openstack/glance.md

@@ -0,0 +1,9 @@
+# glance
+Created 星期二 15 三月 2016
+
+上传镜像
+glance image-create --name "CentOS-7.1-FitCloud-Desktop-v2016010903"  --file CentOS-7.1-FitCloud-Desktop-v2016010903.img.gz --disk-format raw --container-format bare --visibility public --min-disk 5 --progress
+
+
+glance image-create --name "deploy-svn-ymf"  --location <http://10.121.1.249/yjsyf/svn-ymf.img> --disk-format raw --container-format bare --visibility public --progress
+

+ 23 - 0
docs/Cloud/openstack/heat.md

@@ -0,0 +1,23 @@
+# heat
+Created 星期三 17 二月 2016
+
+一、单击右上角的Create Key Pair,如图3所示,输入Key Pair Name,单击Create Kye Pair。
+heat_key
+	
+二、<https://git.openstack.org/openstack/heat-templates>
+
+
+cirros
+
+heat_template_version: 2013-05-23  
+   
+description: Simple template to deploy a single compute instance  
+   
+resources:  
+my_instance:  
+type: OS::Nova::Server  
+properties:  
+key_name: heat_key  
+image: cirros  
+flavor: m1.tiny
+

+ 39 - 0
docs/Cloud/openstack/horizon.md

@@ -0,0 +1,39 @@
+# horizon
+Created 星期三 17 二月 2016
+
+
+#### 建网络:
+网络概况
+名称
+ext-net
+ID
+c148ccbf-1b70-4908-8b6a-0a6c7dd48bb5
+项目ID
+d04021d5a4144b4c9f579fdc1d1c2a9a
+状态
+ACTIVE
+管理员状态
+UP
+共享的
+False
+外部网络
+True
+MTU
+未知
+提供者网络
+网络类型: flat
+物理网络: external
+段ID: -
+	
+	
+#### 创建实例
+	#!/bin/sh  
+			passwd ubuntu<<EOF 
+			ubuntu 
+			ubuntu 
+			EOF 
+			sed ­i 's/PasswordAuthentication no/PasswordAuthentication yes/g' /etc/ssh/sshd_config 
+			service ssh restart
+
+
+

+ 71 - 0
docs/Cloud/openstack/index.md

@@ -0,0 +1,71 @@
+# 命令行操作
+
+
+## 环境变量
+```
+# cat admin-openrc.sh 
+export OS_PROJECT_DOMAIN_NAME=Default
+export OS_USER_DOMAIN_NAME=Default
+export OS_PROJECT_NAME=admin
+export OS_USERNAME=admin
+export OS_PASSWORD=Abc12345
+export OS_AUTH_URL=https://192.168.226.110:35357/v3
+export OS_CACERT=/etc/keystone/ssl/ca.crt
+export OS_AUTH_TYPE=password
+export OS_IDENTITY_API_VERSION=3
+export OS_REGION_NAME=RegionOne
+export OS_IMAGE_API_VERSION=2
+export OS_VOLUME_API_VERSION=3
+export IRONIC_API_VERSION=1.22
+
+```
+## glance
+### 上传镜像
+```
+glance image-create --name dahua_p8500 --visibility public --progress --disk-format=raw --container-format bare --file dahua_p8500_50G.raw 
+glance image-create --file cirros-0.3.4-x86_64-disk.img.raw --name cirros --disk-format raw --container-format bare --visibility public --progress --property hypervisor_type=kvm
+```
+
+## Nova常用
+
+### 重置虚拟机状态
+`nova reset-state  dc21fc3f-40a6-48f7-b98d-1bec92b99726 --active`
+
+### 开关所有虚拟机
+替换 `xiecd` 为你相关查询  开机 start 关机 stop
+```
+for i in `nova list --all | grep xiecd | awk {'print $2'}`; do echo $i; nova start $i; sleep 5; done
+```
+### 删除虚拟机
+```
+nova delete ed3a405e-2dc9-49ae-bf89-4785b60efe6f
+```
+
+### 创建云硬盘
+```
+ cinder create --source-volid f381219a-6426-403d-8ff8-2a720a5e92f1 --volume-type nova_ip_sas --name Fhzz-vm01 1024
+```
+
+### 创建云主机
+```
+nova boot xiecd --flavor m1.large --block-device source=image,id=ef2fe1fc-35ce-42e3-b0bd-f91b51177247,dest=volume,size=5,shutdown=remove,bootindex=0 --nic net-id=a690235d-8418-4975-af2d-841984da0b88 --availability nova --config-drive true --admin-pass xiecd.com
+```
+
+```
+nova boot YS-Win2k8-vm14 --flavor 4V8G500G --boot-volume ec9d2688-c6ee-48b3-8af3-f77539ee626e --security-groups default --nic net-id=7c54dac4-57ff-4f30-9ed4-493613360ad7,v4-fixed-ip=66.0.34.63 --availability nova --config-drive true --admin-pass Fh123456
+```
+[create_vm](create_vm.md)   
+[glance](glance.md)     
+[heat](heat.md)     
+[horizon](horizon.md)       
+[index](index.md)       
+[kvm](kvm.md)   
+[neutron/](neutron/.md) 
+[neutron](neutron.md)   
+[nova](nova.md)     
+[nova](nova.md)     
+[openstack](openstack.md)       
+[optimize](optimize.md)     
+[qemu-img](qemu-img.md)         
+[quota/](quota/.md)         
+[quota](quota.md)       

+ 61 - 0
docs/Cloud/openstack/kvm.md

@@ -0,0 +1,61 @@
+# Kvm
+Created 星期四 31 十二月 2015
+# 快速开始
+# 安装 kvm
+## 准备前提
+### 操作系统安装
+* [ubuntu 18.04 桌面版文档]()
+* centos
+
+### 硬件设置
+在开机启动时,进入BIOS中开起CPU虚拟化的支持
+进入BIOS中,在config –> CPU选项中
+Intel(R) Virtualization Technology (Enabled)
+Intel(R) VT-d Feature (Enabled)
+不同BIOS菜单稍有不同。
+## 安装kvm
+
+### ubuntu18.04 安装KVM virt-manager
+    sudo apt-get install openssh-server
+    sudo apt-get install qemu virtinst python-libvirt virt-viewer virt-manager
+
+# 网络配置
+
+## 使用网卡桥接的方式
+    sudo apt-get install bridge-utils
+1) 查看网卡的设置  
+    ifconfig  
+    已有的网卡 eth0是直接插入网线的以太网卡,  
+    lo是本地网络,本机内部资源  
+    virbr0是刚才我们装完KVM后,自己生成的虚拟网卡  
+2) 网卡桥接  
+我们增加一个叫br0的虚拟网卡,让这个网卡可以和eth0以太网的网卡做桥接  
+
+>sudo vi /etc/network/interfaces  
+
+    auto lo
+    iface lo inet loopback
+    auto eth0
+    iface eth0 inet manual
+    auto br0
+    iface br0 inet static
+    address 10.0.1.249
+    netmask 255.255.255.0
+    gateway 10.0.1.1
+    bridge_ports eth0
+
+>保存,重起网卡设置
+
+    sudo /etc/init.d/networking restart
+
+## NAT 模式  
+
+## 主机共享模式 (略)
+
+# 镜像修改密码
+    安装guestfish工具
+
+
+
+
+

+ 46 - 0
docs/Cloud/openstack/neutron.md

@@ -0,0 +1,46 @@
+# neutron
+Created 星期一 14 三月 2016
+
+[+l3_ha](./neutron/l3_ha.markdown)
+
+
+方案:
+<http://geek.csdn.net/news/detail/71426>
+
+
+常用命令:
+ovs-vsctl show  
+	
+ovs-vsctl list-br    查看br  
+ovs-vsctl del-br
+	
+添加网桥
+ovs-vsctl add-br br-ex-2
+ovs-vsctl add-port br-ex-2 eth2   
+	
+	
+subnet-update {subnet-id} --enable_dhcp=false
+
+
+
+1, 需要在l3-agent.ini中将gateway_external_network_id与external_network_bridge设置成空
+gateway_external_network_id = 
+external_network_bridge =
+2, /etc/neutron/plugins/openvswitch/ovs_neutron_plugin.ini
+bridge_mappings = physnet1:br-eth0,physnet2:br-eth1
+3, 创建两个router(l3-agent的_process_routers会周期性处理这两个router关联的网关),各关联一个外部网络
+
+neutron net-create ext_net_1 -- --router:external=True --provider:network_type flat --provider:physical_network physnet1
+
+neutron subnet-create --allocation-pool start=192.168.100.102,end=192.168.100.126 --gateway 192.168.100.1 ext_net_1 192.168.100.100/24 --enable_dhcp=False
+
+neutron router-interface-add $ROUTER_ID_1 $SUBNET_ID_1
+neutron router-gateway-set $ROUTER_ID_1 $EXT_NET_ID_1
+
+neutron net-create ext_net_2 -- --router:external=True --provider:network_type flat --provider:physical_network physnet2
+
+neutron subnet-create --allocation-pool start=192.168.101.102,end=192.168.101.126 --gateway 192.168.101.1 ext_net_2 192.168.100.101/24 --enable_dhcp=False
+
+neutron router-interface-add $ROUTER_ID_2 $SUBNET_ID_2
+neutron router-gateway-set $ROUTER_ID_2 $EXT_NET_ID_2
+

File diff suppressed because it is too large
+ 161 - 0
docs/Cloud/openstack/neutron/l3_ha.markdown


+ 56 - 0
docs/Cloud/openstack/nova.md

@@ -0,0 +1,56 @@
+# nova
+Created 星期四 17 三月 2016
+
+#### nova-manage
+quota show 
+ nova-manage project quota project_id
+设置配置值:
+ nova-manage project quota d04021d5a4144b4c9f579fdc1d1c2a9a --key floating_ips --value 30\
+	
+	
+cinder quota-update --gigabytes 10000 d04021d5a4144b4c9f579fdc1d1c2a9a 
+	
+	
+neutron quota-update --port 200 --tenant-id d04021d5a4144b4c9f579fdc1d1c2a9a
+	
+	
+1、Nova
+	
+nova flavor-list                 查看配置模板列表
+	
+nova image-list                查看镜像列表
+	
+nova secgroup-list           查看安全规则
+nova boot  --flavor m1.tiny  --image cirros-0.3.4-x86_64  --nic net-id=DEMO_NET_ID   --security-group default  --key-name demo-key  demo-instance1启动虚机
+	
+nova-manage service list         nova服务列表,服务所在物理点和域,以及服务状态
+	
+nova list     列出虚机,在执行该命令前,得先source 帐户openrc文件
+	
+nova show uuid(虚机id)   可以查看该虚机的详细信息,如虚机名,镜像模板,启动时间等等。如果要查看所在物理点,需在执行该命令前,先source 管理员openrc文件
+	
+nova live-migration  热迁移
+nova evacuate uuid   物理节点号        冷迁移虚机到新的物理点 
+nova start uuid 开机
+	
+nova stop uuid 关机
+	
+nova delete uuid 删除虚机
+	
+nova reset-state uuid 重置虚机状态  --active
+	
+nova reboot --hard uuid  对虚机进行硬重启
+nova reset-state --active uuid 将虚机状态重置为active,对于部分error虚机无法删除时,运行该命令再删除一般能将虚机删除
+	
+nova get-vnc-console demo-instance1 novncnn   获取到VNC的web登录地址,直接输入获取到的http地址到浏览器即可登录虚机
+	
+nova volume-list查看volume列表
+	
+nova volume-attach demo-instance1  volume_id 将volume挂载到demo-instance1虚机
+	
+
+nova list --all | grep btjy |awk '{print $2}' >> vm_hosts.txt
+   for i in `cat vm_hosts.txt`; do echo $i; nova stop $i; sleep 10; done
+	 
+	
+

+ 95 - 0
docs/Cloud/openstack/optimize.md

@@ -0,0 +1,95 @@
+# optimize
+Created 星期四 31 十二月 2015
+
+
+
+# CPU Tuning
+##Cache share tuning
+  对于物理 CPU,同一个 core 的 threads 共享 L2 Cache,同一个 socket 的 cores 共享 L3 cache,所以虚拟机的 vcpu 应当尽可能在同一个 core 和 同一个 socket 中,增加 cache 的命中率,从而提高性能。IBM 测试过,合理绑定 vcpu 能给 JVM 来的 16% 的性能提升[2]。
+  实现策略:虚拟机 vcpu 尽可能限定在一个 core 或者一个 socket 中。例如:当 vcpu 为 2 时,2 个 vcpu 应限定在同一个 core 中,当 vcpu 大于 2 小于 12 时,应限定在同一个 socket 中。
+
+<vcpu placement='static' cpuset='0-5'>4</vcpu>       # cpuset 限定 vcpu
+
+###NUMA tuning
+网易运维团队测试得出:2 个 vcpu 分别绑定到不同 numa 节点的非超线程核上和分配到一对相邻的超线程核上的性能相差有 30%~40%(通过 SPEC CPU2006 工具测试)。可见,同一个虚拟机的 vcpu 需限定在同一个 NUMA 节点,并且分配该 NUMA 节点下的内存给虚拟机,保证虚拟机尽可能访问 local memory 而非 remote memory。
+关于 memory allocation mode: If memory is overcommitted in strict mode and the guest does not have sufficient swap space, the kernel will kill some guest processes to retrieve additonal memory. Red Hat recommends using preferred allocation and specifying a single nodeset (for example, nodeset='0') to prevent this situation[1].
+
+<numatune>
+
+  <memory mode="preferred" nodeset="0"/> 
+
+</numatune>
+
+####IRQ tuning
+CPU0 常用于处理中断请求,本身负荷较重[3]。事实上,线上环境 CPU0 完全处理 eth0 的 IRQ,eth1 的 IRQ 完全由另一个 CPU 处理,同时 CPU0 处理着大量的 CAL 类型中断。预留 2 个或者 4 个物理 CPU,这些 CPU 和对应网卡中断做绑定,使得其它 CPU 更好更完整的为云主机所用。  
+VCPU topology tuning
+Selecting any desired number of sockets, but with only a single core and a single thread usually gives the best performance results[1]. 即 VCPU 的 topology 设置为 sockets = vcpu_number, cores = 1, threads = 1. 
+Disk IO Tuning
+Disk IO cache Tuning
+kvm 支持多种虚拟机多种 IO Cache 方式:writeback, none, writethrough 等。性能上:writeback > none > writethrough,安全上 writeback < none < writethrough。For the best storage performance on guest operating systems that use raw disk volumes or partitions, completely avoid the page cache on the host[2].
+
+<disk type='file' device='disk'>
+
+  <driver name='qemu' type='qcow2' cache='none'/>  # cache 可为 writeback, none, writethrough,directsync,unsafe 等
+
+  ...
+
+</disk>
+
+                  
+###Disk IO scheduler
+cfq 参数调优。
+Memory Tuning
+
+1. 关于 zone_reclaim_mode,设置为 disable 。
+2. 关于 swappiness 参数,若 CPU macro-architecture 非 Intel Nehalem 架构,无需要修改优化。
+3. 关闭 KVM 内存共享:When KSM merges across nodes on a NUMA host with multiple guest virtual machines, guests and CPUs from more distant nodes can suffer a significant increase of access latency to the merged KSM page[1].
+
+Disable KSM 方式有两种: 
+  1) 禁止某个 Guest 与其它 Guest 共享内存,XML 文件可配置为
+
+<memoryBacking>
+
+<nosharepages/>
+
+</memoryBacking>
+
+  2)  禁止所有 Guest 直接共享内存,Host 配置为
+
+echo 0 > /sys/kernel/mm/ksm/pages_shared
+
+echo 0 > /sys/kernel/mm/ksm/pages_sharing
+
+
+4. 打开透明大页:KVM guests can be deployed with huge page memory support in order to improve performance by increasing CPU cache hits against the Transaction Lookaside Buffer (TLB)[1].  
+
+打开透明大页方式有两种:
+  1) 允许某个 Guest 开启透明大页
+
+Guest XML Format
+
+<memoryBacking>
+
+   <hugepages/>
+
+</memoryBacking>
+
+ 
+
+echo 25000 > /pro c/sys/vm/nr_hugepages
+
+mount -t hugetlbfs hugetlbfs /dev/hugepages
+
+service libvirtd restart
+
+ 2) 允许 Host 中所有 Guest 开启透明大页
+
+echo always > /sys/kernel/mm/transparent_hugepage/enabled
+
+echo never > /sys/kernel/mm/transparent_hugepage/defrag
+
+echo 0 > /sys/kernel/mm/transparent_hugepage/khugepaged/defrag
+
+Network IO Tuning
+开启 vhost_net 模式[3]。 
+

File diff suppressed because it is too large
+ 68 - 0
docs/Cloud/openstack/qemu-img.md


+ 86 - 0
docs/Cloud/openstack/quota.md

@@ -0,0 +1,86 @@
+# quota
+Created 星期五 27 五月 2016
+
+修改项目配额:
+方法一:通过界面修改;管理员帐号登录:dashboard ,在项目中,找到需要修改的项目;动作栏选择 "修改配额" 即可;
+
+方法二:命令方式:
+在dashborad 中找到需要修改的项目 id; 
+登至 控制节点上:**d04021d5a4144b4c9f579fdc1d1c2a9a** 为项目id
+	
+	
+设置计算相关:	
+显示:
+nova quota-defaults --tenant d04021d5a4144b4c9f579fdc1d1c2a9a
+		
+设置:
++-----------------------------+-------+
+| Quota                       | Limit |
++-----------------------------+-------+
+| instances                   | 10    |
+| cores                       | 40    |
+| ram                         | 51200 |
+| floating_ips                | 10    |
+| fixed_ips                   | -1    |
+| metadata_items              | 128   |
+| injected_files              | 5     |
+| injected_file_content_bytes | 10240 |
+| injected_file_path_bytes    | 255   |
+| key_pairs                   | 100   |
+| security_groups             | 10    |
+| security_group_rules        | 20    |
+| server_groups               | 10    |
+| server_group_members        | 10    |
++-----------------------------+-------+
+		
+fixed-ips                               每个 project 可用固定 IP 地址, 必须大于等于实例可用的 IP 地址数量  
+floating-ips                每个 project 可用的浮动 IP 地址  
+injected-file-content-bytes             添加的文件最大可包含多少 bytes   
+injected-file-path-bytes                指定的文件目录下最大可包含的文件 bytes  
+injected-files                          每个 project 可以包含的文件数量  
+instances                               每个 project 可包含的最多的 instances 数量  
+key-pairs                               每个用户可用的  key-pairs 的数量  
+metadata-items                          每个实例可拥有的 metadata-items  数量  
+ram                                     允许每个 project 中的 instances 可用的 ram (MB) 数量  
+security-group-rules                    可用的安全组规则  
+security-groups                         每个 project 的安全组  
+cores                                   每个 project 可用的虚拟 CPU 个数 
+		
+例子:
+**nova-manage project quota d04021d5a4144b4c9f579fdc1d1c2a9a --key  cores --value 100**
+		
+		
+设置磁盘相关:
+显示当前:
+usage: cinder quota-show <tenant_id>
+			
+Lists quotas for a tenant.
+			
+Positional arguments:
+  <tenant_id>  ID of tenant for which to list quotas.
+		
+设置:
+usage: cinder quota-update [--volumes <volumes>] [--snapshots <snapshots>]
+   [--gigabytes <gigabytes>]
+   [--volume-type <volume_type_name>]
+   <tenant_id>
+			
+Updates quotas for a tenant.
+			
+Positional arguments:
+  <tenant_id>           ID of tenant for which to set quotas.
+			
+Optional arguments:
+  --volumes <volumes>   The new "volumes" quota value. Default=None.
+  --snapshots <snapshots>
+The new "snapshots" quota value. Default=None.
+  --gigabytes <gigabytes>
+The new "gigabytes" quota value. Default=None.
+  --volume-type <volume_type_name>
+Volume type. Default=None.
+
+例子:
+**cinder quota-update --gigabytes 10000 d04021d5a4144b4c9f579fdc1d1c2a9a** 	
+		
+	
+

+ 7 - 0
docs/Cloud/openstack/quota/openvswitch.markdown

@@ -0,0 +1,7 @@
+# openvswitch
+Created 星期五 14 四月 2017
+
+[+vlan](./openvswitch/vlan.markdown)
++
+
+

+ 146 - 0
docs/Cloud/openstack/quota/openvswitch/vlan.markdown

@@ -0,0 +1,146 @@
+# vlan
+Created 星期五 14 四月 2017
+
+
+### 方案一
+配置环境
+
+该教程假设你的环境是按如下小节配置。
+
+两个物理网络
+
+数据网络:虚拟机数据流量以太网(Ethernet),用来在虚拟机之间传输VLAN标记的流量。你的物理交换机要能够转发VLAN标记的流量并且物理交换机端口应该配置为VLAN中继(VLAN trunks)。(一般情况下这是默认设置。而如何配置你的物理交换机不在本文讨论范围。)
+管理网络:该网络并非必须存在,但却是一个简单的方式给予你的物理机一个远程连接的IP,因为IP地址不能直接赋给eth0(下面会进行更详细的说明)。
+两台物理机
+
+你的实验环境应该有两台主机,我们暂且称为Host1和Host2 。且两个主机都运行了Open vSwitch软件。每个主机都有两张网卡——eth0和eth1,按如下方式配置:
+
+eth0连接到数据网络,上面不分配IP地址。
+eth1连接到管理网络(如果有的话),上面有一个IP地址可以用来连接到该主机进行管理。
+四台虚拟机
+
+每台主机运行两个虚拟机(VM)。VM1和VM2运行在Host1上,VM3和VM4运行在Host2上。 
+每台虚拟机都有一个网络接口(interface),在宿主机上表现为Linux设备(比如tap0)。(注意:对于Xen/XenServer,虚拟机网络接口在宿主机上的名字类似“vif1.0”。其他Linux系统中可能显示为“vnet0”、“vnet1”等。) 
+下面的图描述了这篇配置手册里假设的实验环境: 
+环境配置
+![](./vlan/pasted_image.png)
+配置步骤
+
+在Host1上按如下步骤配置: 
+
+1. 创建一个OVS网桥(bridge): 
+
+ovs-vsctl add-br br0 
+
+2. 将eth0加入网桥(默认情况,所有OVS端口都是VLAN中继的,所以eth0会发送所有VLAN数据): 
+
+ovs-vsctl add-port br0 eth0 
+注意:当你将eth0加入到OVS网桥中,任何分配给eth0的IP地址都将失效。所以在把eth0加入到OVS网桥前,分配给eth0的IP地址应该转移到另一个网络接口上。这就是我们要通过eth1来单独管理网络连接的原因。 
+
+3. 将VM1作为VLAN 100的一个“接入口”。这表示从VM1到OVS的流量会被取消标记(untagged)并被当做VLAN 100的一部分: 
+
+ovs-vsctl add-port br0 tap0 tag=100 
+
+4. 将VM2加入到VLAN 200.
+
+
+在Host2上重复下面步骤: 
+
+1. 配置带eth0的网桥为一个VLAN中继: 
+
+ovs-vsctl add-br br0 ovs-vsctl add-port br0 eth0 
+
+2. 将VM3加入到VLAN 100: 
+
+ovs-vsctl add-port br0 tap0 tag=100 
+
+3. 将VM4加入到VLAN 200: 
+
+ovs-vsctl add-port br0 tap1 tag=200
+
+测试
+
+VM1应该能ping通VM3,因为它们在同一个VLAN中。 
+VM2也能ping通VM4,理由同上。 
+而从VM1/VM3 ping VM2/VM4则不行,因为它们属于不同VLAN。如果你有一个路由器配置为转发这两个VLAN的包,那应该能ping通,但是到达VM3的包的源MAC地址是路由的而不是VM1的。
+
+
+### 方案二
+OVS 配置虚机vlan
+
+测试环境:
+
+网络:vlan100, 192.168.100.0/24 
+vlan101, 192.168.101.0/24 
+宿主系统:CentOS-7.2 64bit 
+宿主IP:192.168.100.33 
+宿主网卡:eth0, 对应交换机端口trunks[100, 101], pvid 100 
+待配置虚机IP:192.168.100.34, 192.168.101.34
+
+操作
+
+1.修改/etc/sysconfig/network-scripts/ifcfg-eth0;
+
+DEVICE="eth0"
+ONBOOT="yes"
+NM_CONTROLLED="no"
+
+2.增加/etc/sysconfig/network-scripts/ifcfg-ovsbr0;
+
+DEVICE="ovsbr0"
+IPADDR="192.168.100.33"
+NETMASK="255.255.255.0"
+ONBOOT="yes"
+BOOTPROTO="static"
+TYPE="Ethernet"
+NM_CONTROLLED="no"
+
+3.重启网络;
+
+service network restart
+4.增加ovsbr0网桥
+
+ovs-vsctl add-br ovsbr0 
+ovs-vsctl add-port ovsbr0 eth0
+5.配置端口eth0
+
+ovs-vsctl set port eth0 trunks=0,100,101
+6.配置虚机 
+虚机有两种配置方案 
++虚机内两个网卡eht0, eth1
+
+<interface type='bridge'>
+<source bridge='ovsbr0'/>
+<virtualport type='openvswitch'/>
+<target dev='vnet0'/>
+<model type='virtio'/>
+</interface>
+<interface type='bridge'>
+<source bridge='ovsbr0'/>
+<virtualport type='openvswitch'/>
+<target dev='vnet1'/>
+<model type='virtio'/>
+</interface>
+
+此时虚机eth0网卡对应vnet0, ip 192.168.100.34; eth1对应vnet1, ip 192.168.101.34;
+
+ovs-vsctl set port vnet0 vlan_mode=access 
+ovs-vsctl set port vnet0 tag=0 
+ovs-vsctl set port vnet1 vlan_mode=access 
+ovs-vsctl set port vnet1 tag=101
+这里将vnet0 tag设置为0,因为在物理交换机端口将pvid设置为100,到达宿主内tag为100的包已经被解掉tag,所以这里设为0。 
++虚机内一个网卡eth0,和一个vlan网卡eth0.101
+
+<interface type='bridge'>
+<source bridge='ovsbr0'/>
+<virtualport type='openvswitch'/>
+<target dev='vnet0'/>
+<model type='virtio'/>
+</interface>
+
+此时虚机eth0网卡对应vnet0, ip 192.168.100.34, 192.168.101.34;
+
+ovs-vsctl set port vnet0 vlan_mode=trunk 
+ovs-vsctl set port vnet0 trunks=0,101
+7.虚机内配置路由即可通路。
+

BIN
docs/Cloud/openstack/quota/openvswitch/vlan/pasted_image.png


+ 314 - 0
docs/DevOps/ansible/config.md

@@ -0,0 +1,314 @@
+Ansible 小手册系列 四(详解配置文件) - 简书
+> 配置文件存在不同的位置,但只有一个可用。在下列列表中,ansible从上往下依次检查,检查到哪个可用就用哪个
+> 
+> -   ANSIBLE_CFG 环境变量,可以定义配置文件的位置
+> -   ansible.cfg 存在于当前工作目录
+> -   ansible.cfg 存在与当前用户家目录
+> -   /etc/ansible/ansible.cfg
+> 
+> ansible 配置文件默认存使用 `/etc/ansible/ansible.cfg`  
+> hosts文件默认存使用 `/etc/ansible/hosts`
+> 
+> ansible.cfg 配置项说明
+> 
+> **\[defaults\]**
+> 
+> 配置
+> 
+> 说明
+> 
+> #inventory = /etc/ansible/hosts
+> 
+> 指定主机清单文件
+> 
+> #library = /usr/share/my_modules/
+> 
+> 指定模块地址
+> 
+> #remote_tmp = $HOME/.ansible/tmp
+> 
+> 指定远程执行的路径
+> 
+> #local_tmp = $HOME/.ansible/tmp
+> 
+> ansible 管理节点得执行路径
+> 
+> #forks = 5
+> 
+> 置默认情况下Ansible最多能有多少个进程同时工作,默认设置最多5个进程并行处理
+> 
+> #poll_interval = 15
+> 
+> 轮询间隔
+> 
+> #sudo_user = root
+> 
+> sudo默认用户
+> 
+> #ask\_sudo\_pass = True
+> 
+> 是否需要用户输入sudo密码
+> 
+> #ask_pass = True
+> 
+> 是否需要用户输入连接密码
+> 
+> #transport = smart
+> 
+> #remote_port = 22
+> 
+> 远程链接的端口
+> 
+> #module_lang = C
+> 
+> 这是默认模块和系统之间通信的计算机语言,默认为’C’语言.
+> 
+> #module\_set\_locale = True
+> 
+> #gathering = implicit
+> 
+> #gather_subset = all
+> 
+> 定义获取fact的子集,默认全部
+> 
+> #roles_path = /etc/ansible/roles
+> 
+> 角色存储路径
+> 
+> #host\_key\_checking = False
+> 
+> 跳过ssh 首次连接提示验证部分,False表示跳过。
+> 
+> #stdout_callback = skippy
+> 
+> #callback_whitelist = timer, mail
+> 
+> #task\_includes\_static = True
+> 
+> #handler\_includes\_static = True
+> 
+> #sudo_exe = sudo
+> 
+> sudo的执行文件名
+> 
+> #sudo_flags = -H -S -n
+> 
+> sudo的参数
+> 
+> #timeout = 10
+> 
+> 连接超时时间
+> 
+> #remote_user = root
+> 
+> 指定默认的远程连接用户
+> 
+> #log_path = /var/log/ansible.log
+> 
+> 指定日志文件
+> 
+> #module_name = command
+> 
+> 指定ansible默认的执行模块
+> 
+> #executable = /bin/sh
+> 
+> 用于执行脚本得解释器
+> 
+> #hash_behaviour = replace
+> 
+> 如果变量重叠,优先级更高的一个是替换优先级低得还是合并在一起,默认为替换
+> 
+> #private\_role\_vars = yes
+> 
+> 默认情况下,角色中的变量将在全局变量范围中可见。 为了防止这种情况,可以启用以下选项,只有tasks的任务和handlers得任务可以看到角色变量。
+> 
+> #jinja2_extensions = jinja2.ext.do,jinja2.ext.i18n
+> 
+> jinja2的扩展应用
+> 
+> #private\_key\_file = /path/to/file
+> 
+> 指定私钥文件路径
+> 
+> #vault\_password\_file = /path/to/vault\_password\_file
+> 
+> 指定vault密码文件路径
+> 
+> #ansible_managed = Ansible managed: {file} modified on %Y-%m-%d %H:%M:%S by {uid} on {host}
+> 
+> 定义一个Jinja2变量,可以插入到Ansible配置模版系统生成的文件中
+> 
+> #display\_skipped\_hosts = True
+> 
+> 如果设置为False,ansible 将不会显示任何跳过任务的状态.默认选项是显示跳过任务的状态
+> 
+> #display\_args\_to_stdout = False
+> 
+> #error\_on\_undefined_vars = False
+> 
+> 如果所引用的变量名称错误的话, 是否让ansible在执行步骤上失败
+> 
+> #system_warnings = True
+> 
+> #deprecation_warnings = True
+> 
+> #command_warnings = False
+> 
+> #action_plugins = /usr/share/ansible/plugins/action
+> 
+> action模块的存放路径
+> 
+> #callback_plugins = /usr/share/ansible/plugins/callback
+> 
+> callback模块的存放路径
+> 
+> #connection_plugins = /usr/share/ansible/plugins/connection
+> 
+> connection模块的存放路径
+> 
+> #lookup_plugins = /usr/share/ansible/plugins/lookup
+> 
+> lookup模块的存放路径
+> 
+> #vars_plugins = /usr/share/ansible/plugins/vars
+> 
+> vars模块的存放路径
+> 
+> #test_plugins = /usr/share/ansible/plugins/test
+> 
+> test模块的存放路径
+> 
+> #strategy_plugins = /usr/share/ansible/plugins/strategy
+> 
+> strategy模块的存放路径
+> 
+> #bin\_ansible\_callbacks = False
+> 
+> #nocows = 1
+> 
+> #cow_selection = default
+> 
+> #cow_selection = random
+> 
+> #cow_whitelist=bud-frogs,bunny,cheese,daemon,default,dragon,elephant-in-snake,elephant,eyes,
+> 
+> #nocolor = 1
+> 
+> 默认ansible会为输出结果加上颜色,用来更好的区分状态信息和失败信息.如果你想关闭这一功能,可以把’nocolor’设置为‘1’:
+> 
+> #fact_caching = memory
+> 
+> fact值默认存储在内存中,可以设置存储在redis中,用于持久化存储
+> 
+> #retry\_files\_enabled = False
+> 
+> 当playbook失败得情况下,一个重试文件将会创建,默认为开启此功能
+> 
+> #retry\_files\_save_path = ~/.ansible-retry
+> 
+> 重试文件的路径,默认为当前目录下.ansible-retry
+> 
+> #squash_actions = apk,apt,dnf,package,pacman,pkgng,yum,zypper
+> 
+> Ansible可以优化在循环时使用列表参数调用模块的操作。 而不是每个with_项调用模块一次,该模块会一次调用所有项目一次。该参数记录哪些action是这样操作得。
+> 
+> #no_log = False
+> 
+> 任务数据的日志记录,默认情况下关闭
+> 
+> #no\_target\_syslog = False
+> 
+> 防止任务的日志记录,但只在目标上,数据仍然记录在主/控制器上
+> 
+> #allow\_world\_readable_tmpfiles = False
+> 
+> #var\_compression\_level = 9
+> 
+> 控制发送到工作进程的变量的压缩级别。 默认值为0,不使用压缩。 此值必须是从0到9的整数。
+> 
+> #module\_compression = 'ZIP\_DEFLATED'
+> 
+> 指定压缩方法,默认使用zlib压缩,可以通过ansible\_module\_compression来为每个主机设置
+> 
+> #max\_diff\_size = 1048576
+> 
+> 控制--diff文件上的截止点(以字节为单位),设置0则为无限制(可能对内存有影响)
+> 
+> **\[privilege_escalation\]**  
+> #become=True  
+> #become_method=sudo  
+> #become_user=root  
+> #become\_ask\_pass=False
+> 
+> **\[paramiko_connection\]**  
+> #record\_host\_keys=False  
+> #pty=False
+> 
+> **\[ssh_connection\]**
+> 
+> 配置
+> 
+> 说明
+> 
+> #ssh_args = -o ControlMaster=auto -o ControlPersist=60s
+> 
+> ssh连接时得参数
+> 
+> #control_path = %(directory)s/ansible-ssh-%%h-%%p-%%r
+> 
+> 保存ControlPath套接字的位置
+> 
+> #pipelining = False
+> 
+> SSH pipelining 是一个加速 Ansible 执行速度的简单方法。ssh pipelining 默认是关闭,之所以默认关闭是为了兼容不同的 sudo 配置,主要是 requiretty 选项。如果不使用 sudo,建议开启。打开此选项可以减少 ansible 执行没有传输时 ssh 在被控机器上执行任务的连接数。不过,如果使用 sudo,必须关闭 requiretty 选项。
+> 
+> #scp\_if\_ssh = True
+> 
+> 该项为True时,如果连接类型是ssh,使ansible使用scp,为False是,ansible使用sftp。默认为sftp
+> 
+> #sftp\_batch\_mode = False
+> 
+> 该项为False时,sftp不会使用批处理模式传输文件。 这可能导致一些类型的文件传输失败而不可捕获,但应该只有在您的sftp版本在批处理模式上有问题时才应禁用
+> 
+> **\[accelerate\]**  
+> 加速配置  
+> #accelerate_port = 5099  
+> #accelerate_timeout = 30  
+> #accelerate\_connect\_timeout = 5.0  
+> #accelerate\_daemon\_timeout = 30  
+> #accelerate\_multi\_key = yes
+> 
+> **\[selinux\]**
+> 
+> 配置
+> 
+> 说明
+> 
+> #special\_context\_filesystems=nfs,vboxsf,fuse,ramfs
+> 
+> 文件系统在处理安全上下文时需要特殊处理,定义复制现有上下文的文件系统
+> 
+> #libvirt\_lxc\_noseclabel = yes
+> 
+> 将此设置为yes,以允许libvirt_lxc连接在没有SELinux的情况下工作。
+> 
+> **\[colors\]**  
+> 定义输出颜色  
+> #highlight = white  
+> #verbose = blue  
+> #warn = bright purple  
+> #error = red  
+> #debug = dark gray  
+> #deprecate = purple  
+> #skip = cyan  
+> #unreachable = red  
+> #ok = green  
+> #changed = yellow  
+> #diff_add = green  
+> #diff_remove = red  
+> #diff_lines = cyan
+> 
+> * * *
+> 
+> 更多文章请看 [Ansible 专题文章总览](https://www.jianshu.com/p/c56a88b103f8)

+ 48 - 0
docs/DevOps/ansible/copy模块.markdown

@@ -0,0 +1,48 @@
+# copy模块
+Created 星期三 21 十月 2015
+
+#### copy模块
+copy模块在ansible里的角色就是把ansible执行机器上的文件拷贝到远程节点上。 
+与fetch模块相反的操作。
+
+#### 常用模块参数
+参数名	是否必须	默认值	选项	说明
+src	no			用于定位ansible执行的机器上的文件,需要绝对路径。如果拷贝的是文件夹,那么文件夹会整体拷贝,如果结尾是”/”,那么只有文件夹内的东西被考过去。一切的感觉很像rsync
+content	no			用来替代src,用于将指定文件的内容,拷贝到远程文件内
+dest	yes			用于定位远程节点上的文件,需要绝对路径。如果src指向的是文件夹,这个参数也必须是指向文件夹
+backup	no	no	yes/no	备份远程节点上的原始文件,在拷贝之前。如果发生什么意外,原始文件还能使用。
+directory_mode	no			这个参数只能用于拷贝文件夹时候,这个设定后,文件夹内新建的文件会被拷贝。而老旧的不会被拷贝
+follow	no	no	yes/no	当拷贝的文件夹内有link存在的时候,那么拷贝过去的也会有link
+force	no	yes	yes/no	默认为yes,会覆盖远程的内容不一样的文件(可能文件名一样)。如果是no,就不会拷贝文件,如果远程有这个文件
+group	no			设定一个群组拥有拷贝到远程节点的文件权限
+mode	no			等同于chmod,参数可以为“u+rwx or u=rw,g=r,o=r”
+owner	no			设定一个用户拥有拷贝到远程节点的文件权限
+
+#### 案例
+# 把/srv/myfiles/foo.conf文件拷贝到远程节点/etc/foo.conf,并且它的拥有者是foo,拥有它的群组是foo,权限是0644
+- copy: src=/srv/myfiles/foo.conf dest=/etc/foo.conf owner=foo group=foo mode=0644
+
+# 跟上面的案例一样,不一样的只是权限的写法
+- copy: src=/srv/myfiles/foo.conf dest=/etc/foo.conf owner=foo group=foo mode="u=rw,g=r,o=r"
+
+# 另外一个权限的写法
+- copy: src=/srv/myfiles/foo.conf dest=/etc/foo.conf owner=foo group=foo mode="u+rw,g-wx,o-rwx"
+
+# 拷贝/mine/ntp.conf到远程节点/etc/ntp.conf,并且备份远程节点的/etc/ntp.conf。
+- copy: src=/mine/ntp.conf dest=/etc/ntp.conf owner=root group=root mode=644 backup=yes
+
+#### 常用参数返回值
+参数名	参数说明	返回值	返回值类型	样例
+src	位于ansible执行机上的位置	changed	string	/home/httpd/.ansible/tmp/ansible-tmp-1423796390.97-147729857856000/source
+backup_file	将原文件备份	changed and if backup=yes	string	/path/to/file.txt.2015-02-12@22:09~
+uid	在执行后,拥有者的ID	success	int	100
+dest	远程节点的目标目录或文件	success	string	/path/to/file.txt
+checksum	拷贝文件后的checksum值	success	string	6e642bb8dd5c2e027bf21dd923337cbb4214f827
+md5sum	拷贝文件后的md5 checksum值	when supported	string	2a5aeecc61dc98c4d780b14b330e3282
+state	执行后的状态	success	string	file
+gid	执行后拥有文件夹、文件的群组ID	success	int	100
+mode	执行后文件的权限	success	string	0644
+owner	执行后文件所有者的名字	success	string	httpd
+group	执行后文件所有群组的名字	success	string	httpd
+size	执行后文件大小	success	int	1220
+

+ 41 - 0
docs/DevOps/ansible/defalut.cfg.markdown

@@ -0,0 +1,41 @@
+# defalut.cfg
+Created 星期四 22 九月 2016
+
+参数解释
+----
+/etc/ansible/ansible.cfg
+
+		[defaults]
+		# some basic default values...
+		hostfile       = /etc/ansible/hosts   \\指定默认hosts配置的位置
+		# library_path = /usr/share/my_modules/
+		remote_tmp     = $HOME/.ansible/tmp
+		pattern        = *
+		forks          = 5
+		poll_interval  = 15
+		sudo_user      = root  \\远程sudo用户
+		#ask_sudo_pass = True  \\每次执行ansible命令是否询问ssh密码
+		#ask_pass      = True  \\每次执行ansible命令时是否询问sudo密码
+		transport      = smart
+		remote_port    = 22
+		module_lang    = C
+		gathering = implicit
+		host_key_checking = False    \\关闭第一次使用ansible连接客户端是输入命令提示
+		log_path    = /var/log/ansible.log \\需要时可以自行添加。chown -R root:root ansible.log
+		system_warnings = False    \\关闭运行ansible时系统的提示信息,一般为提示升级
+		# set plugin path directories here, separate with colons
+		action_plugins     = /usr/share/ansible_plugins/action_plugins
+		callback_plugins   = /usr/share/ansible_plugins/callback_plugins
+		connection_plugins = /usr/share/ansible_plugins/connection_plugins
+		lookup_plugins     = /usr/share/ansible_plugins/lookup_plugins
+		vars_plugins       = /usr/share/ansible_plugins/vars_plugins
+		filter_plugins     = /usr/share/ansible_plugins/filter_plugins
+		fact_caching = memory
+		[accelerate]
+		accelerate_port = 5099
+		accelerate_timeout = 30
+		accelerate_connect_timeout = 5.0
+		# The daemon timeout is measured in minutes. This time is measured
+		# from the last activity to the accelerate daemon.
+		accelerate_daemon_timeout = 30
+

BIN
docs/DevOps/ansible/images/pasted_image.png


BIN
docs/DevOps/ansible/images/pasted_image001.png


BIN
docs/DevOps/ansible/images/pasted_image002.png


BIN
docs/DevOps/ansible/images/pasted_image003.png


BIN
docs/DevOps/ansible/images/pasted_image004.png


BIN
docs/DevOps/ansible/images/pasted_image005.png


BIN
docs/DevOps/ansible/images/pasted_image006.png


+ 56 - 0
docs/DevOps/ansible/index.markdown

@@ -0,0 +1,56 @@
+# ansible
+Created 星期五 25 九月 2015
+
+## 一,安装
+[install](./install.markdown)
+	
+
+
+## 二,常见问题:
+[~/data/works/sum/ansible/ansible_question.txt](file:///home/xiecd/data/works/sum/ansible/ansible_question.txt)
+文档:[~/data/works/sum/ansible/Ansible-notes.pdf](file:///home/xiecd/data/works/sum/ansible/Ansible-notes.pdf)
+
+
+## 三,playbooks Detail
+[~/data/works/sum/ansible/playbooks/playbooks detail.txt](file:///home/xiecd/data/works/sum/ansible/playbooks/playbooks%20detail.txt)
+	
+<https://github.com/ansible/ansible-examples>
+	
+[+playbooks](./ansible_files/playbooks.markdown)
+	
+[+tags用法](./ansible_files/tags用法.markdown)
+[+when](./ansible_files/when.markdown)
+[+roles](./ansible_files/roles.markdown)
+[+defalut.cfg](./ansible_files/defalut.cfg.markdown)
+	
+	
+
+
+## 五,模块详细:
+[+copy模块](./ansible_files/copy模块.markdown)
+[+shell模块](./ansible_files/shell模块.markdown)
+
+
+## 四,常用命令:
+vim [/etc/ansible/hosts](file:///etc/ansible/hosts)  
+	
+	
+ansible 127.0.0.1 -m virt -a "command=list_vms"
+	
+ansible -i hosts all -m template -a "src=test.j2 dest=/root/1.txt " --extra-vars={name="123"}
+	
+			[temp]
+			192.168.10.9 ansible_ssh_user=root ansible_ssh_user=root
+			192.168.10.10 ansible_ssh_user=root ansible_ssh_user=root
+### 批理执行date命令
+	# ansible temp -a "date"  
+### 批量传文件
+		# ansible fh-temp -m copy -a "src=/home/123.zip dest=/root/123.zip"
+### 批量执行脚本
+默认情况下,ansible 使用的 module 是 command,这个模块并不支持 shell 变量和管道等,若想使用
+shell 来执行模块,请使用-m 参数指定 shell 模块
+-m 可指定shell , script, command(default) 
+		# ansible fh-temp -m shell -a " df -h"
+		#./ansible -i /home/thankxie/workspace/scripy/appsrc/hosts xiecd -m script -a "/home/thankxie/workspace/scripy/studysrc/test.sh 101"
+
+

+ 28 - 0
docs/DevOps/ansible/install.markdown

@@ -0,0 +1,28 @@
+# install
+创建日期 星期二 29 九月 2020
+
+基本环境
+====
+
+安装要求:
+-----
+
+### 控制服务器:
+
+1. 需要安装 Python2.6/2.7+ ;建议python3
+2. pip已经安装;
+
+
+### 被管理服务器:
+
+1. 需要安装 Python2.4 以上版本,若低于 Python2.5 需要安装 python-simplejson; 若启用了 selinux,则需要安装 libselinux-python;python最好升级为2.66+ 不然会报错;Error: ansible requires a json module, none found! 
+2. 配置sshd优化和免密钥登录;
+
+
+快速安装
+====
+
+pip
+
+
+

+ 494 - 0
docs/DevOps/ansible/loop.md

@@ -0,0 +1,494 @@
+
+## 条件判断
+
+* * *
+
+### When 语句
+
+在when 后面使用Jinja2 表达式,结果为True则执行任务。
+
+    tasks:
+    - name: "shut down Debian flavored systems"
+        command: /sbin/shutdown -t now
+        when: ansible_os_family == "Debian"
+    
+
+若操作系统是Debian 时就执行关机操作
+
+可以对条件进行分组在比较。
+
+    tasks:
+    - name: "shut down CentOS 6 and Debian 7 systems"
+        command: /sbin/shutdown -t now
+        when: (ansible_distribution == "CentOS" and ansible_distribution_major_version == "6") or
+            (ansible_distribution == "Debian" and ansible_distribution_major_version == "7")
+    
+
+可以使用列表形式来表示条件为and的关系
+
+    tasks:
+    - name: "shut down CentOS 6 systems"
+        command: /sbin/shutdown -t now
+        when:
+        - ansible_distribution == "CentOS"
+        - ansible_distribution_major_version == "6"
+    
+
+**使用jinja2过滤器**
+
+    tasks:
+    - command: /bin/false
+        register: result
+        ignore_errors: True
+    
+    - command: /bin/something
+        when: result|failed
+    
+    - command: /bin/something_else
+        when: result|succeeded
+    
+    - command: /bin/still/something_else
+        when: result|skipped
+    
+
+忽略一个语句的错误,然后决定基于成功或失败有条件地做一些事情。
+
+**字符串转换为数字型再去比较**
+
+    tasks:
+    - shell: echo "only on Red Hat 6, derivatives, and later"
+        when: ansible_os_family == "RedHat" and ansible_lsb.major_release|int = 6
+    
+
+**使用变量进行判断**
+
+    vars:
+    epic: true
+    tasks:
+        - shell: echo "This certainly is epic!"
+        when: epic
+    tasks:
+        - shell: echo "This certainly isn't epic!"
+        when: not epic
+    
+
+**判断变量是否定义**
+
+    tasks:
+        - shell: echo "I've got '{{ foo }}' and am not afraid to use it!"
+        when: foo is defined
+    
+        - fail: msg="Bailing out. this play requires 'bar'"
+        when: bar is undefined
+    
+
+**与循环一起使用**
+
+    tasks:
+        - command: echo {{ item }}
+        with_items: [ 0, 2, 4, 6, 8, 10 ]
+        when: item  5
+    
+
+**依次遍历列表,当列表里得数字大于5时执行任务**
+
+    - command: echo {{ item }}
+    with_items: "{{ mylist|default([]) }}"
+    when: item  5
+    - command: echo {{ item.key }}
+    with_dict: "{{ mydict|default({}) }}"
+    when: item.value  5
+    
+
+当变量不存在时,直接跳过
+
+**使用自定义的facts值做判断**
+
+    tasks:
+        - name: gather site specific fact data
+        action: site_facts
+        - command: /usr/bin/thingy
+        when: my_custom_fact_just_retrieved_from_the_remote_system == '1234'
+    
+
+**角色包含使用when**
+
+    - include: tasks/sometasks.yml
+    when: "'reticulating splines' in output"
+    - hosts: webservers
+    roles:
+        - { role: debian_stock_config, when: ansible_os_family == 'Debian' }
+    
+
+**基于变量选择文件和模板**
+
+    - name: template a file
+    template: src={{ item }} dest=/etc/myapp/foo.conf
+    with_first_found:
+        - files:
+        - {{ ansible_distribution }}.conf
+        - default.conf
+        paths:
+        - search_location_one/somedir/
+        - /opt/other_location/somedir/
+    
+
+**使用注册变量判断**
+
+    - name: test play
+    hosts: all
+    
+    tasks:
+    
+        - shell: cat /etc/motd
+            register: motd_contents
+    
+        - shell: echo "motd contains the word hi"
+            when: motd_contents.stdout.find('hi') != -1
+    
+
+### failed_when
+
+**满足条件时,使任务失败**
+
+    tasks:
+        - command: echo faild.
+        register: command_result
+        failed_when: "'faild' in command_result.stdout"
+    - debug: msg="echo test"
+    
+
+还可以写成这样
+
+    tasks:
+        - command: echo faild.
+        register: command_result
+        ignore_errors: True
+    
+        - name: fail the echo
+        fail: msg="the command failed"
+        when: "'faild' in command_result.stdout"
+        - debug: msg="echo test"
+    
+
+### changed_when
+
+更改任务的状态。
+
+    - name: Install dependencies via Composer.
+    command: "/usr/local/bin/composer global require phpunit/phpunit --prefer-dist"
+    register: composer
+    changed_when: "'Nothing to install or update' not in composer.stdout"
+    
+
+当使用PHP Composer作为安装项目依赖项的命令时,知道什么时候是有用的Composer安装了一些东西,或什么都没有改变。
+
+## 循环
+
+* * *
+
+**标准循环**  
+添加多个用户
+
+    - name: add several users
+    user: name={{ item }} state=present groups=wheel
+    with_items:
+        - testuser1
+        - testuser2
+    
+
+添加多个用户,并将用户加入不同的组内。
+
+    - name: add several users
+    user: name={{ item.name }} state=present groups={{ item.groups }}
+    with_items:
+        - { name: 'testuser1', groups: 'wheel' }
+        - { name: 'testuser2', groups: 'root' }
+    
+
+**嵌套循环**
+
+分别给用户授予3个数据库的所有权限
+
+    - name: give users access to multiple databases
+    mysql_user: name={{ item[0] }} priv={{ item[1] }}.*:ALL append_privs=yes password=foo
+    with_nested:
+        - [ 'alice', 'bob' ]
+        - [ 'clientdb', 'employeedb', 'providerdb' ]
+    
+
+**遍历字典**
+
+输出用户的姓名和电话
+
+    tasks:
+    - name: Print phone records
+        debug: msg="User {{ item.key }} is {{ item.value.name }} ({{ item.value.telephone }})"
+        with_dict: {'alice':{'name':'Alice Appleworth', 'telephone':'123-456-789'},'bob':{'name':'Bob Bananarama', 'telephone':'987-654-3210'} }
+    
+
+**并行遍历列表**
+
+    tasks:
+    - debug: "msg={{ item.0 }} and {{ item.1 }}"
+        with_together:
+        - [ 'a', 'b', 'c', 'd','e' ]
+        - [ 1, 2, 3, 4 ]
+    
+
+如果列表数目不匹配,用None补全
+
+**遍历列表和索引**
+
+    - name: indexed loop demo
+        debug: "msg='at array position {{ item.0 }} there is a value {{ item.1 }}'"
+        with_indexed_items: [1,2,3,4]
+    
+
+item.0 为索引,item.1为值
+
+**遍历文件列表的内容**
+
+    ---
+    - hosts: all
+    tasks:
+        - debug: "msg={{ item }}"
+        with_file:
+            - first_example_file
+            - second_example_file
+    
+
+**遍历目录文件**  
+with_fileglob匹配单个目录中的所有文件,非递归匹配模式。
+
+    ---
+    - hosts: all
+    tasks:
+        - file: dest=/etc/fooapp state=directory
+        - copy: src={{ item }} dest=/etc/fooapp/ owner=root mode=600
+        with_fileglob:
+            - /playbooks/files/fooapp/*
+    
+
+当在role中使用with_fileglob的相对路径时,Ansible解析相对于roles/<rolename/files目录的路径。
+
+**遍历ini文件**
+
+    lookup.ini
+    [section1]
+    value1=section1/value1
+    value2=section1/value2
+    
+    [section2]
+    value1=section2/value1
+    value2=section2/value2
+    
+
+    - debug: msg="{{ item }}"
+    with_ini: value[1-2] section=section1 file=lookup.ini re=true
+    
+
+获取section1 里的value1和value2的值
+
+**重试循环 until**
+
+    - action: shell /usr/bin/foo
+    register: result
+    until: result.stdout.find("all systems go") != -1
+    retries: 5
+    delay: 10
+    
+
+"重试次数retries" 的默认值为3,"delay"为5。
+
+**查找第一个匹配文件**
+
+    tasks:
+    - debug: "msg={{ item }}"
+        with_first_found:
+        - "/tmp/a"
+        - "/tmp/b"
+        - "/tmp/default.conf"
+    
+
+依次寻找列表中的文件,找到就返回。如果列表中的文件都找不到,任务会报错。
+
+**随机选择with\_random\_choice**
+
+随机选择列表中得一个值
+
+    - debug: msg={{ item }}
+    with_random_choice:
+        - "go through the door"
+        - "drink from the goblet"
+        - "press the red button"
+        - "do nothing"
+    
+
+**循环程序的结果**
+
+    tasks:
+    - debug: "msg={{ item }}"
+        with_lines: ps aux 
+    
+
+**循环子元素**
+
+定义好变量
+
+    #varfile
+    ---
+    users:
+    - name: alice
+        authorized:
+        - /tmp/alice/onekey.pub
+        - /tmp/alice/twokey.pub
+        mysql:
+            password: mysql-password
+            hosts:
+            - "%"
+            - "127.0.0.1"
+            - "::1"
+            - "localhost"
+            privs:
+            - "*.*:SELECT"
+            - "DB1.*:ALL"
+    - name: bob
+        authorized:
+        - /tmp/bob/id_rsa.pub
+        mysql:
+            password: other-mysql-password
+            hosts:
+            - "db1"
+            privs:
+            - "*.*:SELECT"
+            - "DB2.*:ALL"
+    
+
+    ---
+    - hosts: web
+    vars_files: varfile
+    tasks:
+    
+    - user: name={{ item.name }} state=present generate_ssh_key=yes
+        with_items: "{{ users }}"
+    
+    - authorized_key: "user={{ item.0.name }} key='{{ lookup('file', item.1) }}'"
+        with_subelements:
+        - "{{ users }}"
+        - authorized
+    
+    - name: Setup MySQL users
+        mysql_user: name={{ item.0.name }} password={{ item.0.mysql.password }} host={{ item.1 }} priv={{ item.0.mysql.privs | join('/') }}
+        with_subelements:
+        - "{{ users }}"
+        - mysql.hosts
+    
+
+{{ lookup('file', item.1) }} 是查看item.1文件的内容  
+with_subelements 遍历哈希列表,然后遍历列表中的给定(嵌套)的键。
+
+**在序列中循环with_sequence**
+
+with_sequence以递增的数字顺序生成项序列。 您可以指定开始,结束和可选步骤值。  
+参数应在key = value对中指定。 'format'是一个printf风格字符串。
+
+数字值可以以十进制,十六进制(0x3f8)或八进制(0600)指定。 不支持负数。
+
+    ---
+    - hosts: all
+    
+    tasks:
+    
+        # 创建组
+        - group: name=evens state=present
+        - group: name=odds state=present
+    
+        # 创建格式为testuser%02x 的0-32 序列的用户
+        - user: name={{ item }} state=present groups=evens
+        with_sequence: start=0 end=32 format=testuser%02x
+    
+        # 创建4-16之间得偶数命名的文件
+        - file: dest=/var/stuff/{{ item }} state=directory
+        with_sequence: start=4 end=16 stride=2
+    
+        # 简单实用序列的方法:创建4 个用户组分表是组group1 group2 group3 group4
+        - group: name=group{{ item }} state=present
+        with_sequence: count=4
+    
+
+**随机选择with\_random\_choice**  
+随机选择列表中得一个值
+
+    - debug: msg={{ item }}
+    with_random_choice:
+        - "go through the door"
+        - "drink from the goblet"
+        - "press the red button"
+        - "do nothing"
+    
+
+**合并列表**
+
+    # 安装所有列表中的软件
+    - name: flattened loop demo
+    yum: name={{ item }} state=installed
+    with_flattened:
+        - [ 'foo-package', 'bar-package' ]
+        - [ ['one-package', 'two-package' ]]
+        - [ ['red-package'], ['blue-package']]
+    
+
+**注册变量使用循环**
+
+    - shell: echo "{{ item }}"
+    with_items:
+        - one
+        - two
+    register: echo
+    
+    - name: Fail if return code is not 0
+    fail:
+        msg: "The command ({{ item.cmd }}) did not have a 0 return code"
+    when: item.rc != 0
+    with_items: "{{ echo.results }}"
+    
+
+**循环主机清单**
+
+    # 输出所有主机清单里的主机
+    - debug: msg={{ item }}
+    with_items: "{{ groups['all'] }}"
+    # 输出所有执行的主机
+    - debug: msg={{ item }}
+    with_items: play_hosts
+    
+    #输出所有主机清单里的主机
+    - debug: msg={{ item }}
+    with_inventory_hostnames: all
+    
+    # 输出主机清单中不在www中的所有主机
+    - debug: msg={{ item }}
+    with_inventory_hostnames: all:!www
+    
+
+**改变循环的变量项**
+
+    # main.yml
+    - include: inner.yml
+    with_items:
+        - 1
+        - 2
+        - 3
+    loop_control:
+        loop_var: outer_item
+    # inner.yml
+    - debug: msg="outer item={{ outer_item }} inner item={{ item }}"
+    with_items:
+        - a
+        - b
+        - c
+    
+ 
+* * *
+ 

+ 16 - 0
docs/DevOps/ansible/playbooks.markdown

@@ -0,0 +1,16 @@
+# playbooks
+Created 星期四 07 一月 2016
+
+ps:编辑test.yml
+	- hosts: "{{ hosts }}"
+	  remote_user: root
+	  tasks:
+	    - name: echo ok
+	      shell: echo "this is ok" >> /root/1.txt
+
+运行:
+	ansible-playbook test.yml --extra-vars 'hosts'='vm'
+	
+	python dom_playbooks.py pip.yml hosts_json.py '{"hosts":"vm"}'
+
+

+ 28 - 0
docs/DevOps/ansible/roles.markdown

@@ -0,0 +1,28 @@
+# roles
+Created 星期三 13 一月 2016
+
+role下有很多结构,ansible会自动按照文件结构进行加载解析。具体目录结构如下:
+
+.
+├── defaults
+├── files
+├── handlers
+├── meta
+├── tasks
+├── templates
+└── vars
+如果roles/x/tasks/main.yml存在,则自动将里面的tasks添加到play中。
+
+如果roles/x/handlers/main.yml存在,则自动将里面的handlers添加到play中。
+
+如果roles/x/vars/main.yml存在, 则自动将其中的variables添加到play中。
+
+如果roles/x/meta/main.yml存在,则添加role的依赖关系roles中。
+
+任何copy任务、script任务都可以引用roles/x/files中的文件,无论是使用绝对或相对路径都可以。
+
+任何template任务都可以引用roles/x/templates中的文件,无论绝对或相对路径。
+
+任何include任务都可以引用roles/x/tasks/中的文件,无论相对或绝对路径
+
+

+ 40 - 0
docs/DevOps/ansible/shell模块.markdown

@@ -0,0 +1,40 @@
+# shell模块
+Created 星期三 21 十月 2015
+
+
+元字符;
+环境:
+在B服务器/root/中,创建aa目录,在aa目录下再创建a1和a2目录,每个目录下面创建1.log文件,结构如下:
+[root@drfdai2 ~]# tree /root/aa
+/root/aa
+├── a1
+│   └── 1.log
+└── a2
+└── 1.log
+用ansible服务端主机(A服务器)去机找/root/aa/a1/1.log,执行如下:
+root@drfdai:~# ansible 192.168.0.41 -m shell  -a " ls /root/aa/a1/1.log"
+192.168.0.41 | success | rc=0 >>
+/root/aa/a1/1.log
+如果要在B服务器同时查找下a1和a2下面的1.log,正常来说,我们可以结合元字符,如在shell命令行中,如下执行:
+[root@drfdai2 ~]# ls -l /root/aa/{a1,a2}/1.log
+-rw-r--r-- 1 root root 0 12月 16 15:22 /root/aa/a1/1.log
+-rw-r--r-- 1 root root 0 12月 16 15:22 /root/aa/a2/1.log
+在shell命令行中执行,是没有问题的,那在A服务器用ansbile执行呢?如下:
+root@drfdai:~# ansible 192.168.0.41 -m shell  -a "  ls /root/aa/{a1,a2}/1.log"   
+192.168.0.41 | FAILED | rc=2 >>
+ls: 无法访问/root/aa/{a1,a2}/1.log: 没有那个文件或目录
+显然是执行失败了,提示没有/root/aa/{a1,a2}/1.log这个文件目录。这里,应该是ansible的shell模块,并不会解释元字符,要了解shell的元字符知识,可查看此博客:<http://www.cnblogs.com/chengmo/archive/2010/10/17/1853344.html%EF%BC%8C%E6%88%96%E8%87%AA%E5%B7%B1%E7%99%BE%E5%BA%A6%E8%BF%99%E6%96%B9%E9%9D%A2%E7%9A%84%E7%9F%A5%E8%AF%86%E7%82%B9>。
+ 
+要解决这个问题,其实,只要用以下的方法就OK了:
+root@drfdai:~# ansible 192.168.0.41 -m shell  -a "/bin/bash -c 'ls /root/aa/{a1,a2}/1.log'"
+192.168.0.41 | success | rc=0 >>
+/root/aa/a1/1.log
+/root/aa/a2/1.log
+如上用了/bin/bash -c '命令' 来处理
+ 
+当然,也可以用另外一个模块来解决:ansible raw模块
+执行过程如下:
+root@drfdai:~# ansible 192.168.0.41 -m raw  -a "  ls /root/aa/{a1,a2}/1.log"                  
+192.168.0.41 | success | rc=0 >>
+/root/aa/a1/1.log  /root/aa/a2/1.log
+

+ 9 - 0
docs/DevOps/ansible/start.md

@@ -0,0 +1,9 @@
+# 快速开始
+
+## 生成hosts
+
+```
+for i in {11..30}; do echo node$i ansible_ssh_host=10.34.6.$i ansible_ssh_user=root ansible_ssh_pass=111111 ipmi_ip=10.34.2.$(($i+190)) >> hosts; done
+```
+
+## 提示密码

File diff suppressed because it is too large
+ 86 - 0
docs/DevOps/ansible/tags用法.markdown


+ 33 - 0
docs/DevOps/ansible/when.markdown

@@ -0,0 +1,33 @@
+# when
+Created 星期一 04 一月 2016
+
+ansible_lsb.major_release
+
+ echo  "sss">>/root/1.txt
+ansible_kernel
+
+ansible df -m setup
+
+
+字段名 参考值 含义
+ansible_architecture    x86_64  受控节点系统框架
+ansible_distribution    CentOS  受控节点的操作系统发行版
+ansible_distribution_version    6.3 受控节点发行版本的版本号
+ansible_domain  kisops.org  受控节点的主域名
+ansible_fqdn    site01.kisops.org   受控节点的完整机器名
+ansible_interfaces  [“lo”,”eth0”]   列出受控节点所有的网卡
+ansible_kernel  2.6.32-431.5.1.el6.x86_64   受控节点的内核版本号
+ansible_memtotal_mb 30099   受控节点总内存大小(兆)
+ansible_processor_count 24  受控节点的CPU核心
+ansible_virualization_role  guest   受控节点的身份:host为宿主机,guest为虚拟机
+ansible_virtualization_type kvm 受控节点的虚拟化类型
+
+
+  when: "'![](./when/mariadb.wsrep.cluster_type)' == 'aa' and inventory_hostname == '![](./when/mariadb.wsrep.cluster_ips.split(',')[0])'"
+
+  when: inventory_hostname == "![](./when/mariadb.wsrep.cluster_ips.split(',')[0])"
+  
+
+
+
+

+ 0 - 0
docs/DevOps/index.md


File diff suppressed because it is too large
+ 87 - 0
docs/Linux/bond-model.md


+ 40 - 0
docs/Linux/centos/CentOS.md

@@ -0,0 +1,40 @@
+# CentOS安装
+创建日期 星期日 11 十月 2020
+
+
+初始化
+---
+
+#### 修改源
+
+
+	curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-8.repo
+	yum makecache
+
+
+#### 必备包安装
+包括:  ifconfig;命令补全;
+
+	yum install -y net-tools bash-completion wget vim 
+
+
+#### 优化操作
+
+ 关闭 NetworkManager 
+	
+	systemctl disable NetworkManager
+	
+ 关闭selinux
+
+	sed -i "s/enforcing/disabled/g" /etc/selinux/config
+	
+
+#### 虚拟化安装(kvm) [物理机可选]
+
+	yum install libvirt qemu-kvm -y
+	systemctl enable libvirtd
+
+
+#### 容器安装(docker)
+
+	yum install docker-ce -y

+ 74 - 0
docs/Linux/centos/bond.md

@@ -0,0 +1,74 @@
+# 绑定
+
+## 配置
+
+bond配置    
+
+```
+cat /etc/sysconfig/network-scripts/ifcfg-bond1
+# Generated by playbook_optimize
+DEVICE=bond1
+BOOTPROTO=static
+ONBOOT=yes
+IPADDR=10.3.35.13
+NETMASK=255.255.255.0
+GATEWAY=10.3.35.254
+TYPE=Bond
+BONDING_OPTS="mode=0 miimon=100"
+```
+eth0 配置   
+```
+cat /etc/sysconfig/network-scripts/ifcfg-eth0
+# Generated by playbook_optimize
+DEVICE=eth0
+HWADDR=ec:38:8f:79:12:cd
+ONBOOT=yes
+TYPE=Ethernet
+BOOTPROTO=static
+SLAVE=yes
+MASTER=bond1
+
+```
+
+eth1 配置   
+```
+cat /etc/sysconfig/network-scripts/ifcfg-eth1
+# Generated by playbook_optimize
+DEVICE=eth1
+HWADDR=ec:38:8f:79:12:ce
+ONBOOT=yes
+TYPE=Ethernet
+BOOTPROTO=static
+SLAVE=yes
+MASTER=bond1
+
+```
+
+## 常用命令
+### 查看状态
+```
+cat /proc/net/bonding/bond1
+```
+### 绑定切换
+
+```
+ifenslave bond1 eth0 eth1 
+```
+## 批量配置
+
+
+    git clond 
+
+配置 hosts
+```
+[all]
+node01 ...
+```
+配置 bond.yaml
+```
+bond_mode: 1
+bond_name: bond0
+bond_menber:
+    - eth0
+    - eth1
+```

+ 19 - 0
docs/Linux/centos/index.md

@@ -0,0 +1,19 @@
+# Centos
+
+## 安装与配置
+
+### 安装
+
+最新版本centos8.4   
+
+* 物理机安装 - ISO下载地址: 
+    * https://mirrors.aliyun.com/centos/8.4.2105/isos/aarch64/CentOS-8.4.2105-aarch64-boot.iso  
+  
+* 虚拟化/云镜像 下载地址 
+
+### 配置手册
+
+- [CentOS8 基础配置](CentOS.md)
+- [CentOS8 优化相关](optimizing.md)
+- [CentOS bond绑定相关](bond.md)  
+

+ 63 - 0
docs/Linux/centos/networks.markdown

@@ -0,0 +1,63 @@
+# networks
+Created 星期五 21 四月 2017
+
+CentOS
+======
+
+## 临时网卡设置
+
+	ifconfig eth0 192.168.10.1/24
+	route add default gw 192.168.10.254
+	route add 188.88.1.0/24 gw 188.88.1.1
+
+
+## 固定IP网卡设置模板
+	DEVICE=eth0
+	#DHCP or static
+	BOOTPROTO=static
+	HWADDR=84:8f:69:dd:57:6f
+	ONBOOT=yes
+	NETMASK=255.255.255.0
+	IPADDR=192.168.10.1
+	GATEWAY=192.168.10.254
+	TYPE=Ethernet
+
+#### 配置说明
+	#设置名称
+	DEVICE=eth0
+	#获取IP方式,值为:DHCP 和static
+	BOOTPROTO=none
+	#mac址址
+	HWADDR=84:8f:69:dd:57:6f
+	#是否激活
+	ONBOOT=yes
+	#子网掩码
+	NETMASK=255.255.255.248
+	#IP
+	IPADDR=192.168.10.1
+	#网关
+	GATEWAY=192.168.10.254
+	TYPE=Ethernet
+
+## 网卡名变更
+	iplink set eth2 name eth4
+
+关于更换网卡,MAC地址相关,device eth0 does not seem to be present, delaying initialization
+1>删除ifcfg-eth0中的MAC地址
+2>删除这个文件重启/etc/udev/rules.d/70-persistent-net.rules 删除后重启机器
+
+
+## 网卡重启
+
+	ifconfig eth0 down/up 
+
+
+#### 修改DNS
+
+	vim /etc/resolv.conf
+	
+	search localdomain
+	nameserver 202.103.24.68
+
+
+

+ 0 - 0
docs/Linux/centos/optimizing.md


+ 122 - 0
docs/Linux/command/ab.md

@@ -0,0 +1,122 @@
+ab
+===
+
+Apache服务器的性能测试工具
+
+## 补充说明
+
+**ab命令** 是一个测试你 Apache http 服务器的工具,你可以通过这个工具,指定一个单位时间内向 apache 发出的请求数量来看看你的 Apache 和机器配合的性能如何。
+
+### 语法
+
+```shell
+ab [ -A auth-username:password ] [ -c concurrency ] [ -C cookie-name=value
+] [ -d ] [ -e csv-file ] [ -g gnuplot-file ] [ -h ] [ -H custom-header ] [
+-i  ]  [  -k  ]  [  -n  requests  ] [ -p POST-file ] [ -P proxy-auth-user‐
+name:password ] [ -q ] [ -s ] [ -S ] [ -t timelimit ] [ -T content-type  ]
+[  -v verbosity] [ -V ] [ -w ] [ -x <table>-attributes ] [ -X proxy[:port]
+]  [  -y  <tr>-attributes  ]  [  -z   <td>-attributes   ]   [http://]host‐
+name[:port]/path
+```
+
+### 选项
+
+```shell
+-A auth-username:password
+      #  支持基本的验证证书,用户名和密码之间使用"冒号"                    :
+      # 分隔开,ab将以明文方式传送过去.不管服务器是不是需要
+      # ,也就是说你的服务器需要支持401认证.
+
+-c concurrency
+      # 同时向服务器端发送的请求数目,默认状态下是一次 只执行一个http请求.
+
+-C cookie-name=value
+      # Add a Cookie: line to the request. The argument is typically in the
+      # form of a name=value pair. This field is repeatable.
+
+-d    #  Do not display  the  "percentage  served  within  XX  [ms]  table".
+      # (legacy support).
+
+-e csv-file
+      # Write  a  Comma  separated value (CSV) file which contains for each
+      # percentage (from 1% to 100%) the time (in milli seconds) it took to
+      # serve  that percentage of the requests. This is usually more useful
+      # than the 'gnuplot' file; as the results are already 'binned'.
+
+-g gnuplot-file
+      # Write all measured values out as a 'gnuplot' or TSV  (Tab  separate
+      # values)  file.  This file can easily be imported into packages like
+      # Gnuplot, IDL, Mathematica, Igor or even Excell. The labels  are  on
+      # the first line of the file.
+-h    # 显示使用说明
+-H custom-header
+      # 向请求包追加附加的标题字串.此参数应该是有效的标题         行(header
+      # line)形式,通常使用冒号":"来分隔有效配对 (valid  pair)例如  'Accept-
+      # Encoding: zip/zop;8 bit';
+
+-i    # 使用一个 http 头(HEAD) 来替换 GET方法.不可以掺入POST 方法
+
+-k    #  允许http      KeepAlive      ;也就是说执行多个请求在一个      http
+      # 会话当中,默认是不允许的也就是no KeepAlive啦;)
+
+-n requests
+      # 执行一次测试会话的时候所发出的请求数目,默认是执行一个单一的请求
+      # 当然了这样的测试结果也就没什么意义了
+
+-p POST-file
+      # 测试程序也就是ab,将向Apache server发送带有HTTP POST 的请求.
+
+-P proxy-auth-username:password
+      # 当需要通过代理测试一台 HTTP 服务器的时候而你的代理
+      # 又需要用户名密码验证,这时你可以使用这个选项,同样
+      # 用户名与密码之间使用冒号":"分隔开,ab将之以明文的方式
+      # 发送出去,当然,前提是你的代理是处于407认证状态的
+
+-q    #  When processing more than 150 requests, ab outputs a progress count
+      # on  stderr  every  10% or 100 requests or so. The -q flag will sup‐
+      # press these messages.
+
+-s    #  When compiled in (ab -h will show you) use the SSL protected  https
+      # rather  than  the  http  protocol. This feature is experimental and
+      # very rudimentary. You probably do not want to use it.
+
+-S    #  Do not display the median and standard deviation values,  nor  dis‐
+      # play  the  warning/error  messages  when the average and median are
+      # more than one or two times the standard deviation  apart.  And  de‐
+      # fault to the min/avg/max values. (legacy support).
+
+-t timelimit
+      #  设置测试的时间的长短,使用这个选项ab将自动设置
+      # 测试请求会话数目为50000,然后以你设置的时间为
+      # 固定周期.默认状态下是没有时限的,也就是直到完成
+      # 你所设置的请求数目为止.
+
+-T content-type
+      # 内容类型标头,使用在POST数据的时候.
+
+-v verbosity
+      # 设置冗余级别,4级打印出每个请求标头的详细信息,
+      # 3级打印出回应代码(例如,404,200),2级打印出警告 信息和指示消息
+
+-V    # 显示版本号并且退出
+-w    # 打印输出结果到HTML表中. 默认的表是两列n行白底黑框
+
+-x <table>-attributes
+      # 使用字串来描述表的属性,该属性字串应该插入到<table 这里 >
+
+-X proxy[:port]
+      # Use a proxy server for the requests.
+
+-y <tr>-attributes
+      # 用于生成html表格每行的属性名 (<tr>)
+
+-z <td>-attributes
+      # 用于生成html表格每列的属性名 (<td>)
+```
+
+### 参数
+
+主机:被测试主机。
+
+
+<!-- Linux命令行搜索引擎:https://jaywcjlove.github.io/linux-command/ -->

+ 29 - 0
docs/Linux/command/accept.md

@@ -0,0 +1,29 @@
+accept
+===
+
+指示打印系统接受发往指定目标打印机的打印任务
+
+## 补充说明
+
+**accept命令** 属于CUPS套件,用于指示打印系统接受发往指定目标打印机的打印任务。
+
+###  语法
+
+```
+accept(选项)(参数)
+```
+
+###  选项
+
+```
+-E:当连接到服务器时强制加密;
+-U:指定连接服务器时使用的用户名;
+-h:指定连接服务器名和端口号。
+```
+
+###  参数
+
+目标:指定目标打印机。
+
+
+<!-- Linux命令行搜索引擎:https://jaywcjlove.github.io/linux-command/ -->

+ 104 - 0
docs/Linux/command/ack.md

@@ -0,0 +1,104 @@
+ack
+===
+
+比grep好用的文本搜索工具
+
+## 安装
+
+```shell
+# ubuntu下要安装ack-grep,因为在debian系中,ack这个名字被其他的软件占用了。
+sudo apt-get install ack-grep
+# alpine Linux-apk软件包管理器 安装 ack
+apk install ack
+```
+
+## 参数
+
+这些参数在linux上的适用频率是相当高的,尤其是你用vim做为IDE的话
+
+```shell
+-c(统计)/ -i(忽略大小)/ -h(不显示名称)/
+-l(只显文件名)/ -n(加行号)/ -v(显示不匹配)
+```
+
+## 特点
+
+ack官网列出了这工具的5大卖点:
+
+1. 速度非常快,因为它只搜索有意义的东西。
+2. 更友好的搜索,忽略那些不是你源码的东西。
+3. 为源代码搜索而设计,用更少的击键完成任务。
+4. 非常轻便,移植性好。
+5. 免费且开源
+
+## 实例  
+
+在记忆的时候大体上可以分为这几个部分:
+
+> Searching 代码搜索  
+> Search output 搜索结果处理  
+> File presentation 文件展示  
+> File finding 文件查找  
+> File inclusion/exclusion 文件过滤  
+
+grep常用操作
+
+```shell
+grep -r 'hello_world' # 简单用法
+grep '^hello_world' . # 简单正则
+ls -l | grep .py # 管道用法
+```
+
+### Searching
+
+简单的文本搜索,默认是递归的。
+
+```
+ack-grep hello
+ack-grep -i hello
+ack-grep -v hello
+ack-grep -w hello
+ack-grep -Q 'hello*'
+```
+
+### Search File
+
+对搜索结果进行处理,比如只显示一个文件的一个匹配项,或者xxx
+
+```shell
+ack-grep --line=1       # 输出所有文件第二行
+ack-grep -l 'hello'     # 包含的文件名
+ack-grep -L 'print'     # 非包含文件名
+```
+
+### File presentation
+
+输出的结果是以什么方式展示呢,这个部分有几个参数可以练习下
+
+```shell
+ack-grep hello --pager='less -R'    # 以less形式展示
+ack-grep hello --noheading      # 不在头上显示文件
+ack-grep hello --nocolor        # 不对匹配字符着色
+```
+
+### File finding
+没错,它可以查找文件,以省去你要不断的结合find和grep的麻烦,虽然在linux的思想是一个工具做好一件事。
+
+```shell
+ack-grep -f hello.py     # 查找全匹配文件
+ack-grep -g hello.py$    # 查找正则匹配文件
+ack-grep -g hello  --sort-files     # 查找然后排序
+```
+
+### File Inclusion/Exclusion
+
+文件过滤,个人觉得这是一个很不错的功能。如果你曾经在搜索项目源码是不小心命中日志中的某个关键字的话,你会觉得这个有用。
+
+```shell
+ack-grep --python hello       # 查找所有python文件
+ack-grep -G hello.py$ hello   # 查找匹配正则的文件
+```
+
+## 参考资料
+
+- [ack官网](https://beyondgrep.com/)

+ 134 - 0
docs/Linux/command/alias.md

@@ -0,0 +1,134 @@
+alias
+===
+
+定义或显示别名。
+
+## 概要
+
+```shell
+alias [-p] [name[=value] ...]
+```
+
+## 主要用途
+
+- 简化较长的命令。
+- 定义一个或多个别名。
+- 修改一个或多个已定义别名的值。
+- 显示一个或多个已定义别名。
+- 显示全部已定义的别名。
+
+## 选项
+
+```shell
+-p:显示全部已定义的别名。
+```
+
+## 参数
+
+name(可选):指定要(定义、修改、显示)的别名。
+
+value(可选):别名的值。
+
+### 返回值
+
+alias返回true除非您要显示的别名未定义。
+
+## 例子
+
+```shell
+# 显示全部已定义的别名
+alias
+alias -p
+
+# 显示已定义的别名(假设当前环境存在以下别名)
+alias ls
+alias ls grep
+
+# 定义或修改别名的值
+alias ls='ls --color=auto'
+alias ls='ls --color=never' grep='grep --color=never'
+```
+
+## 知识点
+
+直接在shell里设定的命令别名,在终端关闭或者系统重新启动后都会失效,如何才能永久有效呢?
+
+使用编辑器打开`~/.bashrc`,在文件中加入别名设置,如:alias rm='rm -i',保存后执行`source ~/.bashrc`,这样就可以永久保存命令的别名了。
+
+因为修改的是当前用户目录下的`~/.bashrc`文件,所以这样的方式只对当前用户有用。如果要对所有用户都有效,修改`/etc/bashrc`文件就可以了。
+
+> 请注意,以下内容可能与您实际使用的系统有出入:
+>
+> 在CentOS7下,这个文件是`/etc/bash.bashrc`。此外在CentOS7下,细看`~/.bashrc`文件,会发现有这样一段代码:
+>
+> ```shell
+> if [ -f ~/.bash_aliases ]; then
+>   . ~/.bash_aliases
+> fi
+> ```
+>
+> 这个代码的意思就是如果存在那么就加载`.bash_aliases`文件,所以也可以在用户根目录下新建该文件用于单独存放命令别名设置。
+
+
+## 错误用法
+
+- 要显示的别名未定义。
+
+- 当您定义(修改)别名的值的时候,由于值的字符串有空格但您没有用**单引号扩起**,那么会导致严重的问题:
+
+```shell
+# 为方便演示,删除全部别名
+unalias -a
+# 没有用单引号扩起
+alias rm=rm -rf
+# 执行命令后报错 bash: alias: -rf: not found
+# 这时使用alias查看rm的别名时返回 alias rm='rm'
+```
+
+```shell
+# 更具有迷惑性的例子
+# 为方便演示,删除全部别名
+unalias -a
+# 仍然没有用单引号括起
+alias ls=ls --color=never
+# 执行命令后看起来没有报错
+
+# 使用alias查看全部别名会发现运行结果如下:
+# alias --color=never
+# alias ls='ls'
+# alias处理时将它们看成了两组
+```
+
+## Q&A
+
+Q:如果我要显示一到多个别名,但不知道其中是否有未定义的该怎么办?
+
+A:正常执行就是了,alias不会因为有一个未定义的别名就结束对剩余参数的执行。
+
+Q:如果我这么定义`alias cd='ls' ls='cd'`,会有什么后果?
+
+A:运行cd依然会切换目录,运行ls依然会列出文件夹的内容;不要这样定义。
+
+
+### 注意
+
+1. **执行脚本时请注意:**
+
+> 使用`source`命令执行的bash脚本如果执行了`alias`或`unalias`命令,那么有可能会对终端环境的别名设置产生影响;终端环境的别名设置也可能改变运行结果;
+>
+> 通过`sh`方式调用的bash脚本或直接运行当前用户有执行权限的脚本不受终端环境的别名影响。
+
+2. 删除别名,请查看`unalias`命令。
+
+2. 建议您不要对`mv cp rm`等命令的别名设置危险的`-f`选项,比如`alias rm='rm -f'`。
+
+3. 需要注意别名是否和其他命令有冲突的情况。
+
+4. 该命令是bash内建命令,相关的帮助信息请查看`help`命令。
+
+### 其他参考链接
+
+[Linux命令详解:\[8\]alias创建自己的命令](https://jingyan.baidu.com/article/ac6a9a5e6738422b653eac01.html)
+
+
+<!-- Linux命令行搜索引擎:https://jaywcjlove.github.io/linux-command/ -->

+ 28 - 0
docs/Linux/command/apachectl.md

@@ -0,0 +1,28 @@
+apachectl
+===
+
+Apache服务器前端控制工具
+
+## 补充说明
+
+**apachectl命令** 是Apache的Web服务器前端控制工具,用以启动、关闭和重新启动Web服务器进程。
+
+###  语法
+
+```
+apachectl(参数)
+```
+
+###  参数
+
+* configtest:检查设置文件中的语法是否正确;
+* fullstatus:显示服务器完整的状态信息;
+* graceful:重新启动Apache服务器,但不会中断原有的连接;
+* help:显示帮助信息;
+* restart:重新启动Apache服务器;
+* start:启动Apache服务器;
+* status:显示服务器摘要的状态信息;
+* stop:停止Apache服务器。
+
+
+<!-- Linux命令行搜索引擎:https://jaywcjlove.github.io/linux-command/ -->

+ 131 - 0
docs/Linux/command/apk.md

@@ -0,0 +1,131 @@
+apk
+===
+
+Alpine Linux 下的包管理工具
+
+## 使用实例
+
+```shell
+apk install xxx
+apk search xxx # 支持正则
+apk info xxx # 查看包的详细信息
+apk show # list local package
+# 卸载并删除 包
+apk del openssh openntp vim
+```
+
+### 升级
+
+upgrade命令升级系统已安装的所以软件包(一般包括内核),当然也可指定仅升级部分软件包(通过-u或–upgrade选择指定)。
+
+```shell
+apk update # 更新最新本地镜像源
+apk upgrade # 升级软件
+apk add --upgrade busybox # 指定升级部分软件包
+```
+
+### 搜索
+
+```shell
+apk search # 查找所以可用软件包
+apk search -v # 查找所以可用软件包及其描述内容
+apk search -v 'acf*' # 通过软件包名称查找软件包
+apk search -v -d 'docker' # 通过描述文件查找特定的软件包
+```
+
+### 查看包信息
+
+info命令用于显示软件包的信息。
+
+```shell
+apk info # 列出所有已安装的软件包
+apk info -a zlib # 显示完整的软件包信息
+apk info --who-owns /sbin/lbu # 显示指定文件属于的包
+```
+
+## 笔记
+
+还是蛮喜欢 alpine 的,简单纯粹
+
+```shell
+apk add iproute2 # ss vs netstat
+ss -ptl
+apk add drill # drill vs nslookup&dig
+
+crond # 开启 cron 服务
+crontab -l -e
+
+apk add xxx
+apk search -v xxx
+apk info -a xxx
+apk info
+echo -e "http://mirrors.aliyun.com/alpine/v3.6/main\nhttp://mirrors.aliyun.com/alpine/v3.6/community" > /etc/apk/repositories
+apk update
+
+# storage
+ibu # alpine local backup
+
+# network
+echo "shortname" > /etc/hostname
+hostname -F /etc/hostname
+/etc/hosts
+/etc/resolv.conf # conig DNS
+modprobe ipv6 # enable ipv6
+echo "ipv6" >> /etc/modules
+iface # config interface
+apk add iptables ip6tables iptables-doc
+/etc/init.d/networking restart # activate change
+apke add iputils # IPv6 traceroute
+traceroute6 ipv6.google.com
+awall # alpine wall
+# setup a openvpn server
+
+# post-install
+/etc/apk/repositories
+apk add cherokee --update-cache --repository http://dl-3.alpinelinux.org/alpine/edge/testing/ --allow-untrusted
+apk search -v --description 'NTP' # show description and search from description
+apk info -a zlib
+apk info -vv|sort
+apk info -r -R # require / depency
+apk version -v -l '<' # show available updates
+apk upgrade -U -a
+apk add -u xxx # update xxx
+
+/etc/runlevels # runlevel
+apk add openrc # use openrc for init system
+rc-update add xxx # set to start on
+rc-service xxx start # equal -> /etc/init.d/xxx start
+rc-status
+
+adduser xxx
+passwd xxx
+
+apk add ansible # server
+ssh-keygen
+/etc/ansible/hosts
+apk add python # node
+ssh-copy-id
+
+apk add man man-pages mdocml-apropos less less-doc
+export PAGER=less
+/etc/rc.conf # /etc/rc.conf -> funny character
+apk add bash bash-doc bash-completion # bash
+apk add util-linux pciutils usbutils coreutils binutils findutils grep # grep / awk
+apk add build-base gcc abuild binutils binutils-doc gcc-doc # compile
+apk add cmake cmake-doc extra-cmake-modules extra-cmake-modules-doc
+apk add ccache ccache-doc
+
+apk add docker # docker
+rc-update add docker boot
+rc-service docker start
+apk add py-pip
+pip install docker-compose
+ln -s /usr/bin/docker-compose /usr/bin/doc
+
+# application
+apk add openssh # ssh
+rc-update add sshd
+/etc/init.d/sshd start
+/etc/sshd_config
+apk add dropbear # another openssh implementation
+```

+ 74 - 0
docs/Linux/command/apropos.md

@@ -0,0 +1,74 @@
+apropos
+===
+
+在 whatis 数据库中查找字符串
+
+## 补充说明
+
+**apropos命令** 在一些特定的包含系统命令的简短描述的数据库文件里查找关键字,然后把结果送到标准输出。 
+
+如果你不知道完成某个特定任务所需要命令的名称,可以使用一个关键字通过Linux apropos实用程序来搜索它。该实用程序可以搜索关键字并且显示所有包含匹配项的man页面的简短描述。另外,使用man实用程序和-k(关键字)选项,可以得到和用Linux apropos实用程序相同的结果(实际上是相同的命令)。
+
+###  语法
+
+```shell
+apropos [-dalhvV] -e|-[w|-r] [-s section] [-m system[,...]] [-M path] [-L locale] -C [file] keyword ...
+```
+
+###  选项
+
+```shell
+-d, --debug:输出调试信息。
+-v, --verbose:输出详细的警告信息。
+-r, -- regex:将每个keyword作为正则表达式解释。这是默认行为。每个keyword将匹配手册页和描述。
+-w, --wildcard:将每个keyword作为shell样式的通配符解释。
+-e, --exact:每个keyword将精确匹配手册页名字和描述。
+-a, --and:只显示匹配所有keyword的手册页和描述。默认显示匹配任何keyword的项。
+-l, --long:不根据终端宽度缩减输出。
+-s section, --section section:只查找指定的手册section。
+-m system[,...], --systems=system[,...]:用于查找其它操作系统的手册页。
+-M path, --manpath=path:指定从其它以冒号分隔的手册页层次查找。默认使用$MANPATH环境变量。这个选项覆盖$MANPATH的内容。
+-L locale, --locale=locale:apropos调用C函数setlocale来得到当前本地化信息,包括$LC_MESSAGE和$LANG。使用该选项提供一个locale字符串来临时更改本地化信息。
+-C file, --config-file=file:使用这个用户配置文件而不是默认的~/.manpath。
+-h, --help:打印帮助信息并退出。
+-V, --version:打印版本信息并退出。
+```
+
+###  返回值
+
+返回0表示成功,1表示用法、语法或配置文件错误,2表示操作错误,16表示没有找到匹配的内容。
+
+###  实例
+
+```shell
+[root@localhost ~]# man -k who
+at.allow [at]        (5)  - determine who can submit jobs via at or batch
+at.deny [at]         (5)  - determine who can submit jobs via at or batch
+jwhois               (1)  - client for the whois service
+jwhois              (rpm) - Internet whois/nicname client.
+Net::LDAP::Extension::whoami (3pm)  - LDAP Who am I? Operation
+w                    (1)  - Show who is logged on and what they are doing
+who                  (1p)  - display who is on the system
+who                  (1)  - show who is logged on
+whoami               (1)  - print effective userid
+
+[root@localhost ~]# apropos who
+at.allow [at]        (5)  - determine who can submit jobs via at or batch
+at.deny [at]         (5)  - determine who can submit jobs via at or batch
+jwhois               (1)  - client for the whois service
+jwhois              (rpm) - Internet whois/nicname client.
+Net::LDAP::Extension::WhoAmI (3pm)  - LDAP Who am I? Operation
+w                    (1)  - Show who is logged on and what they are doing
+who                  (1p)  - display who is on the system
+who                  (1)  - show who is logged on
+whoami               (1)  - print effective userid
+```
+
+查找手册页名字和描述中包含emacs和vi的手册页:
+
+```shell
+apropos -a emacs vi
+```
+
+
+<!-- Linux命令行搜索引擎:https://jaywcjlove.github.io/linux-command/ -->

+ 102 - 0
docs/Linux/command/apt-get.md

@@ -0,0 +1,102 @@
+apt-get
+===
+
+Debian Linux发行版中的APT软件包管理工具
+
+## 补充说明
+
+**apt-get命令** 是Debian Linux发行版中的APT软件包管理工具。所有基于Debian的发行都使用这个包管理系统。deb包可以把一个应用的文件包在一起,大体就如同Windows上的安装文件。
+
+###  语法
+
+```shell
+apt-get [OPTION] PACKAGE
+```
+
+###  选项
+
+```shell
+apt-get install 安装新包
+apt-get remove 卸载已安装的包(保留配置文件)
+apt-get purge 卸载已安装的包(删除配置文件)
+apt-get update 更新软件包列表
+apt-get upgrade 更新所有已安装的包
+apt-get autoremove 卸载已不需要的包依赖
+apt-get dist-upgrade 自动处理依赖包升级
+apt-get autoclean 将已经删除了的软件包的.deb安装文件从硬盘中删除掉
+apt-get clean 删除软件包的安装包
+
+-c:指定配置文件。
+```
+
+###  参数
+
+* 管理指令:对APT软件包的管理操作;
+* 软件包:指定要操纵的软件包。
+
+###  实例
+
+使用apt-get命令的第一步就是引入必需的软件库,Debian的软件库也就是所有Debian软件包的集合,它们存在互联网上的一些公共站点上。把它们的地址加入,apt-get就能搜索到我们想要的软件。/etc/apt/sources.list是存放这些地址列表的配置文件,其格式如下:
+
+```shell
+deb web或[ftp地址] [发行版名字] main/contrib/non-[free]
+```
+
+我们常用的Ubuntu就是一个基于Debian的发行,我们使用apt-get命令获取这个列表