Ansible安装配置

Ansible安装部署

简介

Ansible是一种集成IT系统的配置管理, 应用部署, 执行特定任务的开源平台. 它基于Python语言实现, 部署只需在主控端部署Ansible环境, 被控端无需安装代理工具, 只需打开SSH, 让主控端通过SSH秘钥认证对其进行所有的管理监控操作. 相对于SaltStack, 它除了利用SSH安全传输, 无需在客户端进行任何配置, 而且它有一个很庞大的用户群体以及丰富的API, 相对适合部署到数量比较大且对系统软件安装要求比较严格的集群中.
更多配置参考: https://github.com/ansible
官方文档: http://docs.ansible.com/ansible

环境

安装环境:
System: Centos 6.7 x64
Master: master.example.com
Minion: client01.example.com
Minion: client02.example.com

配置

环境部署

  1. 关闭iptables和SELINUX
1
2
3
4
# service iptables stop
# setenforce 0
# vi /etc/sysconfig/selinux
SELINUX=disabled
  1. Master端安装EPEL第三方yum源
1
# rpm -Uvh http://ftp.linux.ncsu.edu/pub/epel/6/i386/epel-release-6-8.noarch.rpm
  1. 安装Ansible
    a. yum
1
# yum install ansible -y

b.pip

1
pip install ansible

  1. 添加环境变量以便vi能正常显示中文注释.
1
2
3
4
5
6
# vi /etc/profile
添加:
export LC_ALL=en_US.UTF-8
export LANG=en_US.UTF-8
export LANGUAGE=en_US.UTF-8
# source /etc/profile

初始配置

  1. 修改主机及组配置
1
2
3
4
5
6
7
8
9
10
11
# cd /etc/ansible
# cp hosts hosts.bak
# cat /dev/null > hosts
# vi /etc/ansible/hosts
[webservers]
client01.example.com
client02.example.com
[nginx01]
client01.example.com
[nginx02]
client02.example.com
  1. 配置SSH秘钥认证
1
2
# yum install ssh* -y
# ssh-keygen -t rsa

同步公钥文件id_rsa.pub到目标主机

1
2
# ssh-copy-id -i /root/.ssh/id_rsa.pub root@client01.example.com
# ssh-copy-id -i /root/.ssh/id_rsa.pub root@client02.example.com

校验SSH免密码配置是否成功.

1
# ssh root@client02.example.com

如直接进入则配置完成.

  1. 定义主机与组
    所有定义的主机与组规则都在/etc/Ansible/hosts下.
    常见的写法:
1
192.168.1.21:2135 定义一个IP为192.168.1.21, SSH端口为2135的主机.
1
2
3
4
5
6
jumper ansible_ssh_port=22 ansible_ssh_host=192.168.1.50 定义一个别名为jumper, SSH端口为22, IP为192.168.1.50的主机. 
组成员主机名称范例:
[webservers]
www[001:006].example.com
[dbservers]
db-[a:f].example.com
  1. 定义主机变量
    主机可以指定变量, 后面可以供Playbooks调用
1
2
3
4
5
6
7
8
9
10
11
[atlanta]
host1 http_port=80 maxRequestsPerChild=808
host2 http_port=8080 maxRequestsPerChild=909
5.定义组变量
[atlanta]
host1
host2

[atlanta:vars]
ntp_server=ntp.atlanta.example.com
proxy=proxy.atlanta.example.com
  1. 匹配目标
    重启webservers组所有SSH服务.
1
# ansible webservers -m service -a "name=sshd state=restarted"

Ansible常用模块及API

  1. 远程命令模块
    command: 执行远程主机SHELL命令:
1
# ansible webservers -m command -a "free -m"

script: 远程执行MASTER本地SHELL脚本.(类似scp+shell)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
# echo "df -h" > ~/test.sh
# ansible webservers -m script -a "~/test.sh"
​```

2. copy模块
实现主控端向目标主机拷贝文件, 类似scp功能.
该实例实现~/test.sh文件至webservers组目标主机/tmp下, 并更新文件owner和group

​```
# ansible webservers -m copy -a "src=~/test.sh dest=/tmp/ owner=root group=root mode=0755"
# ansible webservers -m copy -a "src=~/test.sh dest=/tmp/ owner=root group=root mode=0755"
​```

3. stat模块
获取远程文件状态信息, 包括atime, ctime, mtime, md5, uid, gid等信息.

​```
# ansible webservers -m stat -a "path=/etc/sysctl.conf"
​```

4. get_url模块
实现在远程主机下载指定URL到本地.

​```
# ansible webservers -m get_url -a "url=http://www.showerlee.com dest=/tmp/index.html mode=0400 force=yes"
​```

5. yum模块
Linux包管理平台操作, 常见都会有yum和apt, 此处会调用yum管理模式

​```
# ansible servers -m yum -a "name=curl state=latest"
​```

6. cron模块
远程主机crontab配置

​```
# ansible webservers -m cron -a "name='check dir' hour='5,2' job='ls -alh > /dev/null'"
​```

7. service模块
远程主机系统服务管理

​```
# ansible webservers -m service -a "name=crond state=stopped"
# ansible webservers -m service -a "name=crond state=restarted"
# ansible webservers -m service -a "name=crond state=reloaded"
​```

8. user服务模块
远程主机系统用户管理

​```
添加用户:
# ansible webservers -m user -a "name=johnd comment='John Doe'"
删除用户:
# ansible webservers -m user -a "name=johnd state=absent remove=yes"
​```

## playbook介绍
playbook是一个不同于使用Ansible命令行执行方式的模式, 其功能是将大量命令行配置集成到一起形成一个可定制的多主机配置管理部署工具.
它通过YAML格式定义, 可以实现向多台主机的分发应用部署.
以下给大家详细介绍一个针对nginx嵌套复用结构的
playbook部署实例:

1. 构建目录结构

​```
# cd /etc/ansible/
# mkdir group_vars
# mkdir roles
​```

2. 定义host

​```
# vi /etc/ansible/hosts
[webservers]
client01.example.com
client02.example.com
[nginx01]
client01.example.com
[nginx02]
client02.example.com
​```

3. 定义变量

​```
# vi /etc/ansible/group_vars/nginx01
worker_processes: 4
num_cpus: 4
max_open_file: 65506
root: /data
remote_user: root
# vi /etc/ansible/group_vars/nginx02
worker_processes: 2
num_cpus: 2
max_open_file: 35506
root: /www
remote_user: root
​```
Tips:这里在group_vars下定义的文件名必须对应hosts文件下的group标签, 通过这里定义的不同参数从而部署不同类型的主机配置.

4. 创建roles入口文件

​```
# vi /etc/ansible/site.yml
- hosts: webservers
roles:
- base_env
- hosts: nginx01
roles:
- nginx01
- hosts: nginx02
roles:
- nginx02
​```
Tips: 这里的roles:下的字符串需对应roles目录下的目录名.

5. 定义全局role base_env
创建目录结构

​```
# mkdir -p /etc/ansible/roles/base_env/tasks
# vi /etc/ansible/roles/base_env/tasks/main.yml
# 将EPEL的yum源配置文件传送到客户端
- name: Create the contains common plays that will run on all nodes
copy: src=epel.repo dest=/etc/yum.repos.d/epel.repo
- name: Create the GPG key for EPEL
copy: src=RPM-GPG-KEY-EPEL-6 dest=/etc/pki/rpm-gpg

# 关闭SELINUX
- name: test to see if selling is running
command: getenforce
register: sestatus
changed_when: false

# 删除iptables默认规则并保存
- name: remove the default iptables rules
command: iptables -F
- name: save iptables rules
command: service iptables save
将对应需要拷贝到远程的文件复制到base_env/files目录下
# mkdir -p /etc/ansible/roles/base_env/files
# cp /etc/yum.repos.d/epel.repo /etc/ansible/roles/base_env/files
# cp /etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-6 /etc/ansible/roles/base_env/files
​```

6. 定义nginx01和ngnix02 role
创建目录结构

​```
# mkdir -p /etc/ansible/roles/nginx{01,02}
# mkdir -p /etc/ansible/roles/nginx01/tasks
# mkdir -p /etc/ansible/roles/nginx02/tasks
# vi /etc/ansible/roles/nginx01/tasks/main.yml
# 安装nginx最新版本
- name: ensure nginx is at the latest version
yum: pkg=nginx state=latest

# 将nginx配置文件传送到远程目录
- name: write the nginx config file
template: src=nginx.conf dest=/etc/nginx/nginx.conf
notify: restart nginx # 重启nginx

# 创建nginx根目录
- name: Create Web Root
file: dest={{ root }} mode=775 state=directory owner=nginx group=nginx
notify: reload nginx
- name: ensure nginx is running
service: name=nginx state=restarted
# cp /home/ansible/roles/nginx01/tasks/main.yml /home/ansible/roles/nginx02/tasks/main.yml
​```

7. 定义files

​```
# mkdir -p /etc/ansible/roles/nginx01/templates
# mkdir -p /etc/ansible/roles/nginx02/templates
# vi /etc/ansible/roles/nginx01/templates/nginx.conf
# For more information on configuration, see:

user nginx;
worker_processes {{ worker_processes }};
{% if num_cpus == 2 %}
worker_cpu_affinity 01 10;
{% elif num_cpus == 4 %}
worker_cpu_affinity 1000 0100 0010 0001;
{% elif num_cpus >= 8 %}
worker_cpu_affinity 00000001 00000010 00000100 00001000 00010000 00100000 01000000 10000000;
{% else %}
worker_cpu_affinity 1000 0100 0010 0001;
{% endif %}
worker_rlimit_nofile {{ max_open_file }};

error_log /var/log/nginx/error.log;
#error_log /var/log/nginx/error.log notice;
#error_log /var/log/nginx/error.log info;

pid /var/run/nginx.pid;

events {
worker_connections {{ max_open_file }};
}


http {
include /etc/nginx/mime.types;
default_type application/octet-stream;

log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';

access_log /var/log/nginx/access.log main;

sendfile on;
#tcp_nopush on;

#keepalive_timeout 0;
keepalive_timeout 65;

#gzip on;

# Load config files from the /etc/nginx/conf.d directory
# The default server is in conf.d/default.conf
#include /etc/nginx/conf.d/*.conf;
server {
listen 80 default_server;
server_name _;

#charset koi8-r;

#access_log logs/host.access.log main;

location / {
root {{ root }};
index index.html index.htm;
}

error_page 404 /404.html;
location = /404.html {
root /usr/share/nginx/html;
}

# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}

}

}
​```
Tip: worker_processes, num_cpus, max_open_file, root等参数会调用group_vars目录下配置文件中相应的变量值

​```
# cp /etc/ansible/roles/nginx01/templates/nginx.conf /etc/ansible/roles/nginx02/templates/nginx.conf
​```

8. 执行playbook

​```
# ansible-playbook -i /etc/ansible/hosts /etc/ansible/site.yml -f 10
​```
Tips: -f 为启动10个并行进程执行playbook, -i 定义inventory host文件, site.yml 为入口文件

最终部署目录结构如下
​```
# tree /etc/ansible/
/etc/ansible/
├── ansible.cfg
├── group_vars
│ ├── nginx01
│ └── nginx02
├── hosts
├── hosts.bak
├── roles
│ ├── base_env
│ │ ├── files
│ │ │ ├── epel.repo
│ │ │ └── RPM-GPG-KEY-EPEL-6
│ │ └── tasks
│ │ └── main.yml
│ ├── nginx01
│ │ ├── tasks
│ │ │ └── main.yml
│ │ └── templates
│ │ └── nginx.conf
│ └── nginx02
│ ├── tasks
│ │ └── main.yml
│ └── templates
│ └── nginx.conf
└── site.yml

11 directories, 13 files
​```
1
2
3
4
5
yum install -y epel-release
yum install -y python-pip sshpass

pip install --upgrade pip
pip install ansible

ansible –version

1
ansible 2.4.2.0

注:pip方式安装不会在/etc/ansible目录下生成默认的相关配置文件

ansible控制的主机
vim /etc/ansible/hosts

ansible配置
vim /etc/ansible/ansible.cfg

playbook

ansible playbook

1
2
3
4
5
6
7
8
9
10
11
12
13
vim ssh-addkey.yml 

# ssh-addkey.yml
---
- hosts: s1
gather_facts: no

tasks:

- name: install ssh key
authorized_key: user=root
key="{{ lookup('file', '/root/.ssh/id_rsa.pub') }}"
state=present

运行playbook

ansible-playbook -i hosts ssh-addkey.yml

Jenkins安装部署

Jenkins

Docker Jenkins

1
docker pull jenkins/jenkins:2.235.5-lts-centos7
1
2
#jenkins启动用户id 1000
chown -R 1000:1000 ~/docker/jenkins
1
docker run -d --name jenkins -p 8080:8080 -p 50000:50000 -e "LANG=en_US.UTF-8" -e "JAVA_OPTS=-Duser.timezone=Asia/Shanghai -Dfile.encoding=UTF-8 -Dsun.jnu.encoding=UTF-8" -v ~/docker/jenkins:/var/jenkins_home  jenkins/jenkins:2.235.5-lts-centos7

设置默认用户名 https://github.com/foxylion/docker-jenkins/blob/master/docker-images/master/default-user.groovy

Nginx 反向代理

https://wiki.jenkins-ci.org/display/JENKINS/Jenkins+behind+an+NGinX+reverse+proxy

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
upstream jenkins {
server 127.0.0.1:8080 fail_timeout=0;
}

server {
listen 80;
server_name jenkins.domain.tld;
return 301 https://$host$request_uri;
}

server {
listen 443 ssl;
server_name jenkins.domain.tld;

ssl_certificate /etc/nginx/ssl/server.crt;
ssl_certificate_key /etc/nginx/ssl/server.key;

location / {
proxy_set_header Host $host:$server_port;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_redirect http:// https://;
proxy_pass http://jenkins;
# Required for new HTTP-based CLI
proxy_http_version 1.1;
proxy_request_buffering off;
proxy_buffering off; # Required for HTTP-based CLI to work over SSL
# workaround for https://issues.jenkins-ci.org/browse/JENKINS-45651
add_header 'X-SSH-Endpoint' 'jenkins.domain.tld:50022' always;
}
}

插件

Jenkins插件源使用国内镜像中心的最新方法_DevOps持续集成的博客-CSDN博客_jenkins 插件源

https://hub.docker.com/r/jenkinszh/jenkins-zh/dockerfile

Folders

Git

Email Extension

Credentials Binding

SSH Build Agents

Localization: Chinese (Simplified)

节点

ssh-agent

https://github.com/jenkinsci/ssh-slaves-plugin/blob/master/doc/CONFIGURE.md

ssh-slave 镜像和 ssh-agent 镜像 dockerfile内容一致。底层镜像 adoptopenjdk/openjdk8:jdk8u262-b10-alpine

https://hub.docker.com/r/jenkins/ssh-agent/dockerfile

https://hub.docker.com/r/jenkins/ssh-slave/dockerfile

1
docker pull jenkins/ssh-agent:3.0.0

生成 key

1
ssh-keygen -f pemkey -m PEM -t ed25519

运行

1
docker run -d --name jenkins-ssh-agent jenkins/ssh-agent:3.0.0 "ssh 公钥"

问题

执行 shell 后不删除 jenkins 启动的子 shell

shell 添加 BUILD_ID=DONTKILLME

参考

docker运行jenkins

Create a HTTP proxy for jenkins using NGINX.

docker容器的时区问题和中文问题

Jenkins

Installing Jenkins with Docker

Tomcat安装配置

Tomcat安装配置

安装Tomcat

1
2
3
4
5
6
7
8
9
10
#解压缩tomcat
tar xf apache-tomcat-8.5.23.tar.gz -C /usr/local/
#软链接
ln -s /usr/local/apache-tomcat-8.5.23 /usr/local/tomcat
#添加系统变量
echo 'export TOMCAT_HOME=/usr/local/tomcat'>>/etc/profile
#立即生效系统变量
source /etc/profile
#更改tomcat的权限
chown -R root:root /usr/local/apache-tomcat-8.5.23

启动Tomcat

1
2
3
4
5
6
7
8
#启动程序
tomcat/bin/startup.sh
#关闭程序
tomcat/bin/shutdown.sh
#查看网络
netstat -tunlp|grep java
#查看进程
ps -ef|grep [j]ava

访问网站
网址:http://IP:8080/

Tomcat日志

1
2
3
4
5
6
#进入日志目录
cd tomcat/logs/
#tomcat实时运行日志
tail -f catalina.out
#访问日志
tail -f 域名_access_log.日期.txt

Tomcat配置文件

1
2
3
4
5
6
cd tomcat/conf

#主配置文件
server.xml
#Tomcat管理用户配置文件
tomcat-users.xml

站点目录

1
cd tomcat/webapps/ROOT

Tomcat简介

Tomcat是Apache软件基金会(Apache Software Foundation)的Jakarta 项目中的一个核心项目,由Apache、Sun和其他一些公司及个人共同开发而成。

Tomcat服务器是一个免费的开放源代码的Web应用服务器,属于轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试JSP程序的首选。

Tomcat和Nginx、Apache(httpd)、lighttpd等Web服务器一样,具有处理HTML页面的功能,另外它还是一个Servlet和JSP容器,独立的Servlet容器是Tomcat的默认模式。不过,Tomcat处理静态HTML的能力不如Nginx/Apache服务器。

目前Tomcat最新版本为9.0。Java容器应用还有resin、weblogic等。

Tomcat目录介绍

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
cd /application/tomcat/

tree -L 1
.
├── bin #→用以启动、关闭Tomcat或者其它功能的脚本(.bat文件和.sh文件)
├── conf #→用以配置Tomcat的XML及DTD文件
├── lib #→存放web应用能访问的JAR包
├── LICENSE
├── logs #→Catalina和其它Web应用程序的日志文件
├── NOTICE
├── RELEASE-NOTES
├── RUNNING.txt
├── temp #→临时文件
├── webapps #→Web应用程序根目录
└── work #→用以产生有JSP编译出的Servlet的.java和.class文件
7 directories, 4 files

cd webapps/

ll

total 20
drwxr-xr-x 14 root root 4096 Oct 5 12:09 docs #→tomcat帮助文档
drwxr-xr-x 6 root root 4096 Oct 5 12:09 examples #→web应用实例
drwxr-xr-x 5 root root 4096 Oct 5 12:09 host-manager #→管理
drwxr-xr-x 5 root root 4096 Oct 5 12:09 manager #→管理
drwxr-xr-x 3 root root 4096 Oct 5 12:09 ROOT #→默认网站根目录

Tomcat管理

测试功能,生产环境不要用。

Tomcat管理功能用于对Tomcat自身以及部署在Tomcat上的应用进行管理的web应用。在默认情况下是处于禁用状态的。如果需要开启这个功能,就需要配置管理用户,即配置前面说过的tomcat-users.xml。

1
2
3
4
5
6
7
8
[root@tomcat ~]# vim /application/tomcat/conf/tomcat-users.xml
…………
<role rolename="manager-gui"/>
<role rolename="admin-gui"/>
<user username="tomcat" password="tomcat" roles="manager-gui,admin-gui"/>
</tomcat-users> #→在此行前加入上面三行
[root@tomcat ~]# /application/tomcat/bin/shutdown.sh
[root@tomcat ~]# /application/tomcat/bin/startup.sh

Tomcat主配置文件server.xml详解

  • 顶级组件:位于整个配置的顶层,如server。
  • 容器类组件:可以包含其它组件的组件,如service、engine、host、context。
  • 连接器组件:连接用户请求至tomcat,如connector。
  • 被嵌套类组件:位于一个容器当中,不能包含其他组件,如Valve、logger。

组件详解


engine:核心容器组件,catalina引擎,负责通过connector接收用户请求,并处理请求,将请求转至对应的虚拟主机host。
host:类似于httpd中的虚拟主机,一般而言支持基于FQDN的虚拟主机。
context:定义一个应用程序,是一个最内层的容器类组件(不能再嵌套)。配置context的主要目的指定对应对的webapp的根目录,类似于httpd的alias,其还能为webapp指定额外的属性,如部署方式等。
connector:接收用户请求,类似于httpd的listen配置监听端口的。
service(服务):将connector关联至engine,因此一个service内部可以有多个connector,但只能有一个引擎engine。service内部有两个connector,一个engine。因此,一般情况下一个server内部只有一个service,一个service内部只有一个engine,但一个service内部可以有多个connector。
server:表示一个运行于JVM中的tomcat实例。
Valve:阀门,拦截请求并在将其转至对应的webapp前进行某种处理操作,可以用于任何容器中,比如记录日志(access log valve)、基于IP做访问控制(remote address filter valve)。
logger:日志记录器,用于记录组件内部的状态信息,可以用于除context外的任何容器中。
realm:可以用于任意容器类的组件中,关联一个用户认证库,实现认证和授权。可以关联的认证库有两种:UserDatabaseRealm、MemoryRealm和JDBCRealm。
UserDatabaseRealm:使用JNDI自定义的用户认证库。
MemoryRealm:认证信息定义在tomcat-users.xml中。
JDBCRealm:认证信息定义在数据库中,并通过JDBC连接至数据库中查找认证用户。


配置文件注释

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
<?xml version='1.0' encoding='utf-8'?>
<!--
<Server>元素代表整个容器,是Tomcat实例的顶层元素.由org.apache.catalina.Server接口来定义.它包含一个<Service>元素.并且它不能做为任何元素的子元素.
port指定Tomcat监听shutdown命令端口.终止服务器运行时,必须在Tomcat服务器所在的机器上发出shutdown命令.该属性是必须的.
shutdown指定终止Tomcat服务器运行时,发给Tomcat服务器的shutdown监听端口的字符串.该属性必须设置
-->
<Server port="8005" shutdown="SHUTDOWN">
<Listener className="org.apache.catalina.startup.VersionLoggerListener" />
<Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on" />
<Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" />
<Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" />
<Listener className="org.apache.catalina.core.ThreadLocalLeakPreventionListener" />
<GlobalNamingResources>
<Resource name="UserDatabase" auth="Container"
type="org.apache.catalina.UserDatabase"
description="User database that can be updated and saved"
factory="org.apache.catalina.users.MemoryUserDatabaseFactory"
pathname="conf/tomcat-users.xml" />
</GlobalNamingResources>
<!--service服务组件-->
<Service name="Catalina">
<!--
connector:接收用户请求,类似于httpd的listen配置监听端口.
port指定服务器端要创建的端口号,并在这个端口监听来自客户端的请求。
address:指定连接器监听的地址,默认为所有地址(即0.0.0.0)
protocol连接器使用的协议,支持HTTP和AJP。AJP(Apache Jserv Protocol)专用于tomcat与apache建立通信的, 在httpd反向代理用户请求至tomcat时使用(可见Nginx反向代理时不可用AJP协议)。
minProcessors服务器启动时创建的处理请求的线程数
maxProcessors最大可以创建的处理请求的线程数
enableLookups如果为true,则可以通过调用request.getRemoteHost()进行DNS查询来得到远程客户端的实际主机名,若为false则不进行DNS查询,而是返回其ip地址
redirectPort指定服务器正在处理http请求时收到了一个SSL传输请求后重定向的端口号
acceptCount指定当所有可以使用的处理请求的线程数都被使用时,可以放到处理队列中的请求数,超过这个数的请求将不予处理
connectionTimeout指定超时的时间数(以毫秒为单位)
-->
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />
<!--engine,核心容器组件,catalina引擎,负责通过connector接收用户请求,并处理请求,将请求转至对应的虚拟主机host
defaultHost指定缺省的处理请求的主机名,它至少与其中的一个host元素的name属性值是一样的
-->
<Engine name="Catalina" defaultHost="localhost">
<!--Realm表示存放用户名,密码及role的数据库-->
<Realm className="org.apache.catalina.realm.LockOutRealm">
<Realm className="org.apache.catalina.realm.UserDatabaseRealm"
resourceName="UserDatabase"/>
</Realm>
<!--
host表示一个虚拟主机
name指定主机名
appBase应用程序基本目录,即存放应用程序的目录.一般为appBase="webapps" ,相对于CATALINA_HOME而言的,也可以写绝对路径。
unpackWARs如果为true,则tomcat会自动将WAR文件解压,否则不解压,直接从WAR文件中运行应用程序
autoDeploy:在tomcat启动时,是否自动部署。
xmlValidation:是否启动xml的校验功能,一般xmlValidation="false"。
xmlNamespaceAware:检测名称空间,一般xmlNamespaceAware="false"。
-->
<Host name="localhost" appBase="webapps"
unpackWARs="true" autoDeploy="true">
<!--
Context表示一个web应用程序,通常为WAR文件
docBase应用程序的路径或者是WAR文件存放的路径,也可以使用相对路径,起始路径为此Context所属Host中appBase定义的路径。
path表示此web应用程序的url的前缀,这样请求的url为http://localhost:8080/path/****
reloadable这个属性非常重要,如果为true,则tomcat会自动检测应用程序的/WEB-INF/lib 和/WEB-INF/classes目录的变化,自动装载新的应用程序,可以在不重启tomcat的情况下改变应用程序
-->
<Context path="" docBase="" debug=""/>
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
prefix="localhost_access_log" suffix=".txt"
pattern="%h %l %u %t &quot;%r&quot; %s %b" />
</Host>
</Engine>
</Service>
</Server>

#WEB站点部署

上线的代码有两种方式,第一种方式是直接将程序目录放在webapps目录下面,这种方式大家已经明白了,就不多说了。第二种方式是使用开发工具将程序打包成war包,然后上传到webapps目录下面。下面让我们见识一下这种方式。

  • 使用war包部署web站点
1
2
3
4
5
[root@tomcat webapps]# pwd
/application/tomcat/webapps
[root@tomcat webapps]# rz #→上传memtest.war,此文件也在上面的百度网盘里
[root@tomcat webapps]# ls
docs examples host-manager manager memtest memtest.war ROOT

浏览器访问:http://10.0.0.3:8080/memtest/meminfo.jsp

方法一

将meminfo.jsp或其他程序放在tomcat/webapps/ROOT目录下即可。因为默认网站根目录为tomcat/webapps/ROOT

方法二

1
2
3
4
5
6
[root@tomcat ~]# vim /application/tomcat/conf/server.xml
<Host name="localhost" appBase="webapps"
unpackWARs="true" autoDeploy="true">
<Context path="" docBase="/application/tomcat/webapps/memtest" debug="0" reloadable="false" crossContext="true"/>
[root@tomcat ~]# /application/tomcat/bin/shutdown.sh
[root@tomcat ~]# /application/tomcat/bin/startup.sh

Tomcat多实例及集群架构

  • Tomcat多实例
  1. 复制Tomcat目录

    1
    2
    3
    [root@tomcat ~]# cd /application/
    [root@tomcat application]# cp -a apache-tomcat-8.0.27 tomcat8_1
    [root@tomcat application]# cp -a apache-tomcat-8.0.27 tomcat8_2
  2. 修改配置文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
[root@tomcat application]# mkdir -p /data/www/www/ROOT
[root@tomcat application]# cp /application/tomcat/webapps/memtest/meminfo.jsp /data/www/www/ROOT/
[root@tomcat ~]# sed -i '22s#8005#8011#;69s#8080#8081#;123s#appBase=".*"# appBase="/data/www/www"#' /application/tomcat8_1/conf/server.xml
[root@tomcat ~]# sed -i '22s#8005#8012#;69s#8080#8082#;123s#appBase=".*"# appBase="/data/www/www"#' /application/tomcat8_2/conf/server.xml
[root@tomcat ~]# diff /application/tomcat/conf/server.xml /application/tomcat8_1/conf/server.xml
22c22
< <Server port="8005" shutdown="SHUTDOWN">
---
> <Server port="8011" shutdown="SHUTDOWN">
69c69
< <Connector port="8080" protocol="HTTP/1.1"
---
> <Connector port="8081" protocol="HTTP/1.1"
123c123
< <Host name="localhost" appBase="/application/tomcat/webapps/memtest"
---
> <Host name="localhost" appBase="/data/www/www"
[root@tomcat ~]# diff /application/tomcat/conf/server.xml /application/tomcat8_2/conf/server.xml
22c22
< <Server port="8005" shutdown="SHUTDOWN">
---
> <Server port="8012" shutdown="SHUTDOWN">
69c69
< <Connector port="8080" protocol="HTTP/1.1"
---
> <Connector port="8082" protocol="HTTP/1.1"
123c123
< <Host name="localhost" appBase="/application/tomcat/webapps/memtest"
---
> <Host name="localhost" appBase="/data/www/www"
  1. 启动多实例
1
2
for i in {1..2};do /application/tomcat8_$i/bin/startup.sh;done
netstat -tunlp|grep java

浏览器可以分别访问http://10.0.0.3:8081/meminfo.jsphttp://10.0.0.3:8082/meminfo.jsp

Tomcat集群

使用nginx+Tomcat反向代理集群

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
[root@tomcat ~]# vim /application/nginx/conf/nginx.conf
upstream web_pools {
server 127.0.0.1:8081;
server 127.0.0.1:8082;
}
server {
listen 80;
server_name localhost;
location / {
root html;
index index.jsp index.html index.htm;
proxy_pass http://web_pools;
}
}
[root@tomcat ~]# /application/nginx/sbin/nginx -t
[root@tomcat ~]# /application/nginx/sbin/nginx

浏览器可以访问http://10.0.0.3/meminfo.jsp

Tomcat监控

Tomcat安全优化和性能优化

安全优化

降权启动
telnet管理端口保护
ajp连接端口保护
禁用管理端

性能优化

屏蔽dns查询enableLookups=”false”

1
2
3
<Connector  port="8081" protocol="HTTP/1.1"
connectionTimeout="6000" enableLookups="false" acceptCount="800"
redirectPort="8443" />

jvm调优

Tomcat最吃内存,只要内存足够,这只猫就跑的很快。
如果系统资源有限,那就需要进行调优,提高资源使用率。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
优化catalina.sh配置文件。在catalina.sh配置文件中添加以下代码:
JAVA_OPTS="-Djava.awt.headless=true -Dfile.encoding=UTF-8 -server -Xms1024m -Xmx1024m -XX:NewSize=512m -XX:MaxNewSize=512m -XX:PermSize=512m -XX:MaxPermSize=512m"
server:一定要作为第一个参数,在多个CPU时性能佳
-Xms:初始堆内存Heap大小,使用的最小内存,cpu性能高时此值应设的大一些
-Xmx:初始堆内存heap最大值,使用的最大内存
上面两个值是分配JVM的最小和最大内存,取决于硬件物理内存的大小,建议均设为物理内存的一半。
-XX:PermSize:设定内存的永久保存区域
-XX:MaxPermSize:设定最大内存的永久保存区域
-XX:MaxNewSize:
-Xss 15120 这使得JBoss每增加一个线程(thread)就会立即消耗15M内存,而最佳值应该是128K,默认值好像是512k.
+XX:AggressiveHeap 会使得 Xms没有意义。这个参数让jvm忽略Xmx参数,疯狂地吃完一个G物理内存,再吃尽一个G的swap。
-Xss:每个线程的Stack大小
-verbose:gc 现实垃圾收集信息
-Xloggc:gc.log 指定垃圾收集日志文件
-Xmn:young generation的heap大小,一般设置为Xmx的3、4分之一
-XX:+UseParNewGC :缩短minor收集的时间
-XX:+UseConcMarkSweepGC :缩短major收集的时间

问题

Parallels Desktop 运行的CentOS 7.4.1708

jdk1.8.151
tomcat 8.5.23

重启tomcat 就打不开了。不知道什么原因。然后用vmware fusion就可以立刻重启。怀疑时paralles的网络有问题。但技术不行暂时找不到问题

JDK 配置

CentOS 6.7
CentOS 7.4.1708

1
2
3
4
5
6
#解压缩jdk
tar xf jdk-*-linux-x64.tar.gz -C /usr/local/
#软连接
ln -s /usr/local/jdk1.8* /usr/local/jdk
#更改jdk的权限
chown -R root:root /usr/local/jdk1.8*/
  • 添加系统变量
1
2
3
4
5
6
#添加java home系统变量
sed -i.ori '$a export JAVA_HOME=/usr/local/jdk\nexport PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATH\nexport CLASSPATH=.$CLASSPATH:$JAVA_HOME/lib:$JAVA_HOME/jre/lib:$JAVA_HOME/lib/tools.jar' /etc/profile
#立即生效系统变量
source /etc/profile
#查看java版本
java -version

macOS

1
2
3
4
5
6
# JAVA_HOME start
export JAVA_HOME="$(/usr/libexec/java_home -v 1.8.0_144)"
export PATH=$JAVA_HOME/bin:$PATH
export CLASSPATH=$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/dt.jar:.
export CLASS_PATH=$JAVA_HOME/lib
# JAVA_HOME end

Amazon Kindle

Kindle 8th Generation - 2016 release.

图书管理

1
brew cask install calibre

支持的书籍格式

  • mobi,阅读时会生成 sdr 格式的数据。推荐使用的格式。
  • pdf,阅读时会生成 sdr 格式的数据。
  • txt,阅读时会生成 sdr 格式的数据。

不支持的书籍格式

  • epub 会生成 sdr,但是不能阅读。

书籍格式

EPUB

EPUB在脚本,公式,矢量图形的支持方面强过MOBI。

现阶段EPUB的优势体现在图文混排,图片嵌入字体等,未来可预测的优势是EPUB对于声音,影像等多媒体内容互动的支持上。

EPUB是开放标准,所以在开发工具上EPUB也会有更大的选择。

MOBI

参考

电子书有哪些常见格式?以及该怎样阅读它

Calibre 使用教程之转换电子书格式

COBBLER无人值守安装

COBBLER无人值守安装

Cobbler介绍

Cobbler是一个Linux服务器安装的服务,可以通过网络启动(PXE)的方式来快速安装、重装物理服务器和虚拟机,同时还可以管理DHCP,DNS等。

Cobbler可以使用命令行方式管理,也提供了基于Web的界面管理工具(cobbler-web),还提供了API接口,可以方便二次开发使用。

Cobbler是较早前的kickstart的升级版,优点是比较容易配置,还自带web界面比较易于管理。

Cobbler内置了一个轻量级配置管理系统,但它也支持和其它配置管理系统集成,如Puppet,暂时不支持SaltStack。

Cobbler集成的服务

  • PXE服务支持
  • DHCP服务管理
  • DNS服务管理(可选bind,dnsmasq)
  • 电源管理
  • Kickstart服务支持
  • YUM仓库管理
  • TFTP(PXE启动时需要)
  • Apache(提供kickstart的安装源,并提供定制化的kickstart配置)

Cobbler安装配置

系统环境准备

1
2
3
4
5
6
7
8
9
10
11
12
13
14
[root@linux-node1 ~]# cat /etc/redhat-release
CentOS release 6.7 (Final)
[root@linux-node1 ~]# uname -r
2.6.32-573.el6.x86_64
[root@linux-node1 ~]# getenforce
Disabled
[root@linux-node1 ~]# /etc/init.d/iptables status
iptables: Firewall is not running.
[root@linux-node1 ~]# ifconfig eth0|awk -F "[ :]+" 'NR==2 {print $4}'
10.0.0.7
[root@linux-node1 ~]# hostname
linux-node1.example.com
# 配置阿里云的epel源
[root@linux-node1 ~]# wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-6.rep

安装Cobbler

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
[root@linux-node1 ~]# yum -y install cobbler cobbler-web dhcp tftp-server pykickstart httpd
[root@linux-node1 ~]# rpm -ql cobbler # 查看安装的文件,下面列出部分。
/etc/cobbler # 配置文件目录
/etc/cobbler/settings # cobbler主配置文件,这个文件是YAML格式,Cobbler是python写的程序。
/etc/cobbler/dhcp.template # DHCP服务的配置模板
/etc/cobbler/tftpd.template # tftp服务的配置模板
/etc/cobbler/rsync.template # rsync服务的配置模板
/etc/cobbler/iso # iso模板配置文件目录
/etc/cobbler/pxe # pxe模板文件目录
/etc/cobbler/power # 电源的配置文件目录
/etc/cobbler/users.conf # Web服务授权配置文件
/etc/cobbler/users.digest # 用于web访问的用户名密码配置文件
/etc/cobbler/dnsmasq.template # DNS服务的配置模板
/etc/cobbler/modules.conf # Cobbler模块配置文件
/var/lib/cobbler # Cobbler数据目录
/var/lib/cobbler/config # 配置文件
/var/lib/cobbler/kickstarts # 默认存放kickstart文件
/var/lib/cobbler/loaders # 存放的各种引导程序
/var/www/cobbler # 系统安装镜像目录
/var/www/cobbler/ks_mirror # 导入的系统镜像列表
/var/www/cobbler/images # 导入的系统镜像启动文件
/var/www/cobbler/repo_mirror # yum源存储目录
/var/log/cobbler # 日志目录
/var/log/cobbler/install.log # 客户端系统安装日志
/var/log/cobbler/cobbler.log # cobbler日志

配置Cobbler

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
[root@linux-node1 ~]# /etc/init.d/httpd restart
停止 httpd: [失败]
正在启动 httpd: [确定]
[root@linux-node1 ~]# /etc/init.d/cobblerd start
Starting cobbler daemon: [确定]
[root@linux-node1 ~]# cobbler check # 检查Cobbler的配置,如果看不到下面的结果,再次执行/etc/init.d/cobblerd restart
The following are potential configuration items that you may want to fix:
1 : The 'server' field in /etc/cobbler/settings must be set to something other than localhost, or kickstarting features will not work. This should be a resolvable hostname or IP for the boot server as reachable by all machines that will use it.
2 : For PXE to be functional, the 'next_server' field in /etc/cobbler/settings must be set to something other than 127.0.0.1, and should match the IP of the boot server on the PXE network.
3 : some network boot-loaders are missing from /var/lib/cobbler/loaders, you may run 'cobbler get-loaders' to download them, or, if you only want to handle x86/x86_64 netbooting, you may ensure that you have installed a *recent* version of the syslinux package installed and can ignore this message entirely. Files in this directory, should you want to support all architectures, should include pxelinux.0, menu.c32, elilo.efi, and yaboot. The 'cobbler get-loaders' command is the easiest way to resolve these requirements.
4 : change 'disable' to 'no' in /etc/xinetd.d/rsync
5 : debmirror package is not installed, it will be required to manage debian deployments and repositories
6 : The default password used by the sample templates for newly installed machines (default_password_crypted in /etc/cobbler/settings) is still set to 'cobbler' and should be changed, try: "openssl passwd -1 -salt 'random-phrase-here' 'your-password-here'" to generate new one
7 : fencing tools were not found, and are required to use the (optional) power management features. install cman or fence-agents to use them
Restart cobblerd and then run 'cobbler sync' to apply changes.
# 看着上面的结果,一个一个解决。
# 第1、2、6个问题,顺便修改其他功能
[root@linux-node1 ~]# cp /etc/cobbler/settings{,.ori} # 备份
# server,Cobbler服务器的IP。
sed -i 's/server: 127.0.0.1/server: 10.0.0.7/' /etc/cobbler/settings
# next_server,如果用Cobbler管理DHCP,修改本项,作用不解释,看kickstart。
sed -i 's/next_server: 127.0.0.1/next_server: 10.0.0.7/' /etc/cobbler/settings
# 用Cobbler管理DHCP
sed -i 's/manage_dhcp: 0/manage_dhcp: 1/' /etc/cobbler/settings
# 防止循环装系统,适用于服务器第一启动项是PXE启动。
sed -i 's/pxe_just_once: 0/pxe_just_once: 1/' /etc/cobbler/settings
# 设置新装系统的默认root密码123456。下面的命令来源于提示6。random-phrase-here为干扰码,可以自行设定。
[root@linux-node1 ~]# openssl passwd -1 -salt 'oldboy' '123456'
$1$oldboy$Npg9Pt9k98Mlg0ZeqHAuN1
[root@linux-node1 ~]# vim /etc/cobbler/settings
default_password_crypted: "$1$oldboy$Npg9Pt9k98Mlg0ZeqHAuN1"
# 第3个问题
[root@linux-node1 ~]# cobbler get-loaders # 会自动从官网下载
[root@linux-node1 ~]# cd /var/lib/cobbler/loaders/ # 下载的内容
[root@linux-node1 loaders]# ls
COPYING.elilo COPYING.yaboot grub-x86_64.efi menu.c32 README
COPYING.syslinux elilo-ia64.efi grub-x86.efi pxelinux.0 yaboot
# 第4个问题
[root@linux-node1 ~]# vim /etc/xinetd.d/rsync
disable = no
[root@linux-node1 ~]# /etc/init.d/xinetd restart
停止 xinetd: [确定]
正在启动 xinetd: [确定]
[root@linux-node1 ~]# /etc/init.d/cobblerd restart
Stopping cobbler daemon: [确定]
Starting cobbler daemon: [确定]
[root@linux-node1 ~]# cobbler check
The following are potential configuration items that you may want to fix:
1 : debmirror package is not installed, it will be required to manage debian deployments and repositories # 和debian系统相关,不需要
2 : fencing tools were not found, and are required to use the (optional) power management features. install cman or fence-agents to use them # fence设备相关,不需要
Restart cobblerd and then run 'cobbler sync' to apply changes.

配置DHCP

1
2
3
4
5
6
7
8
9
10
# 修改cobbler的dhcp模版,不要直接修改dhcp本身的配置文件,因为cobbler会覆盖。
[root@linux-node1 ~]# vim /etc/cobbler/dhcp.template
# 仅列出修改过的字段
……
subnet 10.0.0.0 netmask 255.255.255.0 {
option routers 10.0.0.2;
option domain-name-servers 10.0.0.2;
option subnet-mask 255.255.255.0;
range dynamic-bootp 10.0.0.100 10.0.0.200;
……

同步cobbler配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52

# 同步最新cobbler配置,它会根据配置自动修改dhcp等服务。
[root@linux-node1 ~]# cobbler sync # 同步所有配置,可以仔细看一下sync做了什么。
task started: 2015-12-03_204822_sync
task started (id=Sync, time=Thu Dec 3 20:48:22 2015)
running pre-sync triggers
cleaning trees
removing: /var/lib/tftpboot/pxelinux.cfg/default
removing: /var/lib/tftpboot/grub/images
copying bootloaders
trying hardlink /var/lib/cobbler/loaders/pxelinux.0 -> /var/lib/tftpboot/pxelinux.0
copying: /var/lib/cobbler/loaders/pxelinux.0 -> /var/lib/tftpboot/pxelinux.0
trying hardlink /var/lib/cobbler/loaders/menu.c32 -> /var/lib/tftpboot/menu.c32
trying hardlink /var/lib/cobbler/loaders/yaboot -> /var/lib/tftpboot/yaboot
trying hardlink /usr/share/syslinux/memdisk -> /var/lib/tftpboot/memdisk
trying hardlink /var/lib/cobbler/loaders/grub-x86.efi -> /var/lib/tftpboot/grub/grub-x86.efi
trying hardlink /var/lib/cobbler/loaders/grub-x86_64.efi -> /var/lib/tftpboot/grub/grub-x86_64.efi
copying distros to tftpboot
copying images
generating PXE configuration files
generating PXE menu structure
rendering DHCP files
generating /etc/dhcp/dhcpd.conf
rendering TFTPD files
generating /etc/xinetd.d/tftp
cleaning link caches
running post-sync triggers
running python triggers from /var/lib/cobbler/triggers/sync/post/*
running python trigger cobbler.modules.sync_post_restart_services
running: dhcpd -t -q
received on stdout:
received on stderr:
running: service dhcpd restart
received on stdout: 关闭 dhcpd:[确定]
正在启动 dhcpd:[确定]
received on stderr:
running shell triggers from /var/lib/cobbler/triggers/sync/post/*
running python triggers from /var/lib/cobbler/triggers/change/*
running python trigger cobbler.modules.scm_track
running shell triggers from /var/lib/cobbler/triggers/change/*
*** TASK COMPLETE ***
# 再看一下dhcp的配置文件。
[root@linux-node1 ~]# less /etc/dhcp/dhcpd.conf
# ******************************************************************
# Cobbler managed dhcpd.conf file
# generated from cobbler dhcp.conf template (Thu Dec 3 12:48:23 2015)
# Do NOT make changes to /etc/dhcpd.conf. Instead, make your changes
# in /etc/cobbler/dhcp.template, as /etc/dhcpd.conf will be
# overwritten.
# ******************************************************************
ddns-update-style interim;
…………

开机启动

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
# 启动相关服务并设置开机启动(可选) 与第二种方法二选一
chkconfig httpd on
chkconfig xinetd on
chkconfig cobblerd on
chkconfig dhcpd on
/etc/init.d/httpd restart
/etc/init.d/xinetd restart
/etc/init.d/cobblerd restart
/etc/init.d/dhcpd restart
# 编写Cobbler相关服务启动脚本(可选)
cat >>/etc/init.d/cobbler<<EOF
#!/bin/bash
# chkconfig: 345 80 90
# description:cobbler
case \$1 in
start)
/etc/init.d/httpd start
/etc/init.d/xinetd start
/etc/init.d/dhcpd start
/etc/init.d/cobblerd start
;;
stop)
/etc/init.d/httpd stop
/etc/init.d/xinetd stop
/etc/init.d/dhcpd stop
/etc/init.d/cobblerd stop
;;
restart)
/etc/init.d/httpd restart
/etc/init.d/xinetd restart
/etc/init.d/dhcpd restart
/etc/init.d/cobblerd restart
;;
status)
/etc/init.d/httpd status
/etc/init.d/xinetd status
/etc/init.d/dhcpd status
/etc/init.d/cobblerd status
;;
sync)
cobbler sync
;;
*)
echo "Input error,please in put 'start|stop|restart|status|sync'!"
exit 2
;;
esac
EOF
# chmod +x /etc/init.d/cobbler
# chkconfig cobbler on

Cobbler的命令行管理

查看命令帮助

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
[root@linux-node1 ~]# cobbler
usage
=====
cobbler <distro|profile|system|repo|image|mgmtclass|package|file> ...
[add|edit|copy|getks*|list|remove|rename|report] [options|--help]
cobbler <aclsetup|buildiso|import|list|replicate|report|reposync|sync|validateks|version|signature|get-loaders|hardlink> [options|--help]
[root@linux-node1 ~]# cobbler import --help # 导入镜像
Usage: cobbler [options]
Options:
-h, --help show this help message and exit
--arch=ARCH OS architecture being imported
--breed=BREED the breed being imported
--os-version=OS_VERSION
the version being imported
--path=PATH local path or rsync location
--name=NAME name, ex 'RHEL-5'
--available-as=AVAILABLE_AS
tree is here, don't mirror
--kickstart=KICKSTART_FILE
assign this kickstart file
--rsync-flags=RSYNC_FLAGS
pass additional flags to rsync
cobbler check 核对当前设置是否有问题
cobbler list 列出所有的cobbler元素
cobbler report 列出元素的详细信息
cobbler sync 同步配置到数据目录,更改配置最好都要执行下
cobbler reposync 同步yum仓库
cobbler distro 查看导入的发行版系统信息
cobbler system 查看添加的系统信息
cobbler profile 查看配置信息

导入镜像

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
[root@linux-node1 ~]# mount /dev/cdrom /mnt/  # 挂载CentOS7的系统镜像。
# 导入系统镜像
[root@linux-node1 ~]# cobbler import --path=/mnt/ --name=CentOS-7.1-x86_64 --arch=x86_64
# --path 镜像路径
# --name 为安装源定义一个名字
# --arch 指定安装源是32位、64位、ia64, 目前支持的选项有: x86│x86_64│ia64
# 安装源的唯一标示就是根据name参数来定义,本例导入成功后,安装源的唯一标示就是:CentOS-7.1-x86_64,如果重复,系统会提示导入失败。
[root@linux-node1 ~]# cobbler distro list # 查看镜像列表
CentOS-7.1-x86_64
# 镜像存放目录,cobbler会将镜像中的所有安装文件拷贝到本地一份,放在/var/www/cobbler/ks_mirror下的CentOS-7.1-x86_64目录下。因此/var/www/cobbler目录必须具有足够容纳安装文件的空间。
[root@linux-node1 ~]# cd /var/www/cobbler/ks_mirror/
[root@linux-node1 ks_mirror]# ls
CentOS-7.1-x86_64 config
[root@linux-node1 ks_mirror]# ls CentOS-7.1-x86_64/
CentOS_BuildTag GPL LiveOS RPM-GPG-KEY-CentOS-7
EFI images Packages RPM-GPG-KEY-CentOS-Testing-7
EULA isolinux repodata TRANS.TBL

指定ks.cfg文件及调整内核参数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
# Cobbler的ks.cfg文件存放位置
[root@linux-node1 ks_mirror]# cd /var/lib/cobbler/kickstarts/
[root@linux-node1 kickstarts]# ls # 自带很多
default.ks install_profiles sample_autoyast.xml sample_esxi4.ks sample_old.seed
esxi4-ks.cfg legacy.ks sample_end.ks(默认使用的ks文件) sample_esxi5.ks sample.seed
esxi5-ks.cfg pxerescue.ks sample_esx4.ks sample.ks
[root@linux-node1 kickstarts]# rz # 上传准备好的ks文件
rz waiting to receive.
Starting zmodem transfer. Press Ctrl+C to cancel.
Transferring Cobbler-CentOS-7.1-x86_64.cfg...
100% 1 KB 1 KB/sec 00:00:01 0 Errors
[root@linux-node1 kickstarts]# mv Cobbler-CentOS-7.1-x86_64.cfg CentOS-7.1-x86_64.cfg
# 在第一次导入系统镜像后,Cobbler会给镜像指定一个默认的kickstart自动安装文件在/var/lib/cobbler/kickstarts下的sample_end.ks。
[root@linux-node1 ~]# cobbler list
distros:
CentOS-7.1-x86_64
profiles:
CentOS-7.1-x86_64
systems:
repos:
images:
mgmtclasses:
packages:
files:
# 查看安装镜像文件信息
[root@linux-node1 ~]# cobbler distro report --name=CentOS-7.1-x86_64
Name : CentOS-7.1-x86_64
Architecture : x86_64
TFTP Boot Files : {}
Breed : redhat
Comment :
Fetchable Files : {}
Initrd : /var/www/cobbler/ks_mirror/CentOS-7.1-x86_64/images/pxeboot/initrd.img
Kernel : /var/www/cobbler/ks_mirror/CentOS-7.1-x86_64/images/pxeboot/vmlinuz
Kernel Options : {}
Kernel Options (Post Install) : {}
Kickstart Metadata : {'tree': 'http://@@http_server@@/cblr/links/CentOS-7.1-x86_64'}
Management Classes : []
OS Version : rhel7
Owners : ['admin']
Red Hat Management Key : <<inherit>>
Red Hat Management Server : <<inherit>>
Template Files : {}
# 查看所有的profile设置
[root@linux-node1 ~]# cobbler profile report
# 查看指定的profile设置
[root@linux-node1 ~]# cobbler profile report --name=CentOS-7.1-x86_64
Name : CentOS-7.1-x86_64
TFTP Boot Files : {}
Comment :
DHCP Tag : default
Distribution : CentOS-7.1-x86_64
Enable gPXE? : 0
Enable PXE Menu? : 1
Fetchable Files : {}
Kernel Options : {}
Kernel Options (Post Install) : {}
Kickstart : /var/lib/cobbler/kickstarts/sample_end.ks -->默认ks文件
Kickstart Metadata : {}
Management Classes : []
Management Parameters : <<inherit>>
Name Servers : []
Name Servers Search Path : []
Owners : ['admin']
Parent Profile :
Internal proxy :
Red Hat Management Key : <<inherit>>
Red Hat Management Server : <<inherit>>
Repos : []
Server Override : <<inherit>>
Template Files : {}
Virt Auto Boot : 1
Virt Bridge : xenbr0
Virt CPUs : 1
Virt Disk Driver Type : raw
Virt File Size(GB) : 5
Virt Path :
Virt RAM (MB) : 512
Virt Type : kvm
# 编辑profile,修改关联的ks文件
[root@linux-node1 ~]# cobbler profile edit --name=CentOS-7.1-x86_64 --kickstart=/var/lib/cobbler/kickstarts/CentOS-7.1-x86_64.cfg
# 修改安装系统的内核参数,在CentOS7系统有一个地方变了,就是网卡名变成eno16777736这种形式,但是为了运维标准化,我们需要将它变成我们常用的eth0,因此使用下面的参数。但要注意是CentOS7才需要下面的步骤,CentOS6不需要。
[root@linux-node1 ~]# cobbler profile edit --name=CentOS-7.1-x86_64 --kopts='net.ifnames=0 biosdevname=0'
[root@linux-node1 ~]# cobbler profile report CentOS-7.1-x86_64
Name : CentOS-7.1-x86_64
TFTP Boot Files : {}
Comment :
DHCP Tag : default
Distribution : CentOS-7.1-x86_64
Enable gPXE? : 0
Enable PXE Menu? : 1
Fetchable Files : {}
Kernel Options : {'biosdevname': '0', 'net.ifnames': '0'}
Kernel Options (Post Install) : {}
Kickstart : /var/lib/cobbler/kickstarts/CentOS-7.1-x86_64.cfg
Kickstart Metadata : {}
Management Classes : []
Management Parameters : <<inherit>>
Name Servers : []
Name Servers Search Path : []
Owners : ['admin']
Parent Profile :
Internal proxy :
Red Hat Management Key : <<inherit>>
Red Hat Management Server : <<inherit>>
Repos : []
Server Override : <<inherit>>
Template Files : {}
Virt Auto Boot : 1
Virt Bridge : xenbr0
Virt CPUs : 1
Virt Disk Driver Type : raw
Virt File Size(GB) : 5
Virt Path :
Virt RAM (MB) : 512
Virt Type : kvm
# 每次修改完都要同步一次
[root@linux-node1 ~]# cobbler sync

安装系统

可以很愉快的告诉你到这里就可以安装系统了!
有没有发现不美观的地方?
网址不是我的!改!

1
2
3
4
#修改Cobbler提示
[root@linux-node1 ~]# vim /etc/cobbler/pxe/pxedefault.template
MENU TITLE Cobbler | http://www.zyops.com
[root@linux-node1 ~]# cobbler sync # 修改配置都要同步

ks.cfg文件简析

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
文件大部分参数含义见kickstart文章,此处只讲一些不同的地方。同时可以参考模板文件。
[root@linux-node1 kickstarts]# cat CentOS-7.1-x86_64.cfg
# Cobbler for Kickstart Configurator for CentOS 7.1 by yao zhang
install
url --url=$tree # 这些$开头的变量都是调用配置文件里的值。
text
lang en_US.UTF-8
keyboard us
zerombr
bootloader --location=mbr --driveorder=sda --append="crashkernel=auto rhgb quiet"
# Network information
$SNIPPET('network_config')
timezone --utc Asia/Shanghai
authconfig --enableshadow --passalgo=sha512
rootpw --iscrypted $default_password_crypted
clearpart --all --initlabel
part /boot --fstype xfs --size 1024 # CentOS7系统磁盘默认格式xfs
part swap --size 1024
part / --fstype xfs --size 1 --grow
firstboot --disable
selinux --disabled
firewall --disabled
logging --level=info
reboot
%pre
$SNIPPET('log_ks_pre')
$SNIPPET('kickstart_start')
$SNIPPET('pre_install_network_config')
# Enable installation monitoring
$SNIPPET('pre_anamon')
%end
%packages
@base
@compat-libraries
@debugging
@development
tree
nmap
sysstat
lrzsz
dos2unix
telnet
iptraf
ncurses-devel
openssl-devel
zlib-devel
OpenIPMI-tools
screen
%end
%post
systemctl disable postfix.service
%end

定制化安装

可能从学习kickstart开始就有人想怎样能够指定某台服务器使用指定ks文件,kickstart实现这功能可能比较复杂,但是Cobbler就很简单了。

区分一台服务器的最简单的方法就是物理MAC地址。
物理服务器的MAC地址在服务器上的标签上写了。

1
2
3
4
5
6
cobbler system add --name=oldboy --mac=00:0C:29:7F:2F:A1 --profile=CentOS-7.1-x86_64 --ip-address=10.0.0.111 --subnet=255.255.255.0 --gateway=10.0.0.2 --interface=eth0 --static=1 --hostname=oldboy.example.com --name-servers="114.114.114.114 8.8.8.8"
# --name 自定义,但不能重复
# 查看定义的列表
[root@linux-node1 ~]# cobbler system list
oldboy
[root@linux-node1 ~]# cobbler sync

再次开机安装就不再询问选择了,直接安装。

Cobbler的Web管理界面的安装与配置

已经安装cobbler-web软件。

访问网址:http://10.0.0.7/cobbler_web和https://10.0.0.7/cobbler_web

默认用户名:cobbler
默认密码 :cobbler

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
/etc/cobbler/users.conf       # Web服务授权配置文件
/etc/cobbler/users.digest # 用于web访问的用户名密码配置文件
[root@linux-node1 ~]# cat /etc/cobbler/users.digest
cobbler:Cobbler:a2d6bae81669d707b72c0bd9806e01f3
# 设置Cobbler web用户登陆密码
# 在Cobbler组添加cobbler用户,提示输入2遍密码确认
[root@linux-node1 ~]# htdigest /etc/cobbler/users.digest "Cobbler" cobbler
Changing password for user cobbler in realm Cobbler
New password: 123456
Re-type new password:123456
[root@linux-node1 ~]# cobbler sync
[root@linux-node1 ~]# /etc/init.d/httpd restart
停止 httpd: [确定]
正在启动 httpd: [确定]
[root@linux-node1 ~]# /etc/init.d/cobblerd restart
Stopping cobbler daemon: [确定]
Starting cobbler daemon: [确定]

soimort/you-get

rg3/youtube-dl

python爬虫项目集合

Awesome-crawler-cn

Python-crawler

woaidu_crawler

crawler_html2pdf

sam408130/crawler

Python系列文章

用于抓取百度百科中的百科名片及列表部分信息

python多线程爬虫爬取电影天堂资源

LinkedIn-Crawler

SparrowG/LinkedIn-Crawler

NyCrawler

Yandere-crawler

infoqCrawler

下厨房爬虫

zhihu-crawler

Scrapy-Redis

神箭手 云爬虫 爬取规则示例

ovwane/python_crawler

README.md
Crawler
收集网络上大神们写的爬虫代码。

spider

chenqing/spider

imchenkun/ick-spider

Otakuwizard/spider

Germey/Weibo

Scrapy

SpiderKeeper

scrapy/scrapyd

Germey/Gerapy

sam408130/scrapy

Wooden-Robot/scrapy-tutorial

LiuXingMing/Scrapy_Redis_Bloomfilter

scrapy-redis代码研究

#代理
ProxyCrawler

awolfly9/IPProxyTool

Nyloner/ProxyPool

Germey/ProxyPool

Germey/CookiesPool

love3forever/proxyHunter

pujinxiao/IPProxyPool

qiyeboy/IPProxyPool

Germey/AutoProxy

#1

istresearch/scrapy-cluster

wangqifan/ZhiHu

otakurice/weibonlp

geekcompany/DeerResume

otakurice/notravellist

Nyloner/NyPython

otakurice/lagoujob

#简单爬虫
xiaozhiqi2016/spider_basic

Germey/TaobaoProduct

Germey/Cnki

Germey/TaobaoMM

Wooden-Robot/Pythonspider

bigstupidx/Pythonspider

StephinChou/Pythonspider

Germey/MeiKong

#爬虫资料汇总
KDF5000/SpiderRef

Ehco1996/Python-crawler

luyishisi/Nyspider

Nyloner/Nyspider

#单个网站爬虫
fankcoder/spider-comments

wwj718/jobSpider

zaxlct/baike-spider

hk029/LagouSpider

Jack-Cherish/python-spider

wanglu119/distributed-spider

pujinxiao/Lagou_spider

Wooden-Robot/spider-practice

sam408130/base_spider

LJ147/githubSpider

awesome-spider

LiuXingMing/SinaSpider

pujinxiao/sina_spider

xiaozhiqi2016/spider_advanced

LiuXingMing/LinkedinSpider

pujinxiao/zhihu_spider

KDF5000/RuolinSpider

hk029/NovelSpider

pujinxiao/jobbole_spider

Germey/TouTiao

Germey/Zhihu

Germey/Weixin

Germey/MaoYan

hk029/DoubanMovieSpider

hk029/BaiduTiebaSpider

Germey/TaobaoComments

Germey/iaskspider

tpeng/weibosearch

piglei/nowater

l-passer/Passer-zhihu

rg3/youtube-dl

gnemoug/sina_reptile

sam408130/parse-baidu-baike

piglei/tieba_poster

darkhandz/BaiduLoginWithTiebaSignin

ovwane/jdlingyu

pujinxiao/weixin

pujinxiao/crops_pider

pujinxiao/TaoBao

pujinxiao/wechat_sogou_crawl

jaryee/wechat_sogou_crawl

pujinxiao/qiantuwang

fankcoder/findtrip

echopy/QQSpider

thuxugang/QQSpider

echopy/Maizi

echopy/Baidu_Registration

ovwane/jdlingyu

dongweiming/weapp-zhihulive

LiuXingMing/Tmall1212

LiuXingMing/QQSpider

Germey/TaobaoUser

BruceDone/cnbeta

hk029/Pickup

hk029/doubanbook

DormyMo/scrappy

webdriver

asonhan007/webdriver_guide

#PySpider 爬虫

Germey/PySpiders

rmax/scrapy-redis

LJ147/ImageSpyder

#验证码
知乎
iyaopinner/zheye

muchrooms/zheye

Germey/Python3

LJ147/github-trending

pujinxiao/zhilian

LiuXingMing/WeiboSliderCode

Germey/crack-geetest

dzhongyi/crack-geetest

DormyMo/ProxyCrawler

#登录
xchaoinfo/fuck-login

pujinxiao/douban_login

LiuXingMing/WeiboSliderCode

UA

hellysmile/fake-useragent

#爬虫知乎专栏

从零开始写Python爬虫

Python之美-董伟明
python分布式爬虫打造搜索引擎——–scrapy实现
pujinxiao/project_pjx

七夜安全爬虫 490个项目

#数据分析

wwj718/Zhihu_bigdata

yoghurtjia/Zhihu_bigdata

针对常见的BAT公司中的大数据面试和笔试问题,列出解决思路,并使用python来实现

yoghurtjia/sortquery 有10个文件,每个文件1G,每个文件的每行存放的都是用户的query(请自己随机产生),每个文件的query都可能重复。要求你按照query的频度排序。

关于淘宝“爆款”数据爬取与分析
adbmal/sortquery

KDF5000/RqFetchData

#爬虫监控
pc10201/markets_monitor

#学习记录
yoghurtjia/github-pages

zzbkszd/github-pages

炼数成金爬虫 学习笔记

炼数成金-目录

2012.11.23
Python 2.7.3
Nginx 1.1.5

01.解释性脚本语言初探.avi 46:42
02.1.Python开发环境windows.avi 21:30
02.2.Python开发环境linux.avi 21:40
02.3.Python开发环境wingide.avi 25:30
03.python使用基础.avi 1:53:25
04.python内置容器_.avi
05.并行开发.mp4
06.python正则表达式.avi
07.socket编程基础.avi
08.爬虫.mp4
09.django初探.wmv
10.django.avi
11.twisted.avi
12.Twisted综合应用.avi

03 Python使用基础

1)基本概念
2)运算符与表达式
3)逻辑控制结构
4)函数
5)面向对象编程
6)异常处理
7)模块与包
8)输入、输出、文件和目录操作

1)基本概念

  1. 常量
    常量无名
    不需要修饰

1.2)数
整数
长整数
浮点数
复数
1.3)字符串
单引号 ‘abc’
双引号 “abc”
三引号 ‘’’abc’’’

r前缀 不会转义内容
a =r”ss\n sd” 不会换行

dir()函数 可以查看类型所有的方法
a = “S”*5 SSSSS复制S5次
eval()字符串表达式转换成
1.4)变量
首字符为字母或下划线
其他字母、数字、下划线
区分大小写
1.5)数据类型
数值
字符串
线性容器

  • 字符串也是一种线性容器
  • list
  • tuple
    Hash容器
  • dict
  • set
    None
    逻辑类型(True,False)
    1.6)逻辑行与物理行
    物理行是在遍历器中所看见的,逻辑行是python能够识别的。
    一个物理行使用多个逻辑行用分号;
    多个物理行使用一个逻辑行用反斜杠\
    1.7)缩进
    缩进在Python中是重要的,缩进使用4个空格,表示不要用制表符。

2)运算符与表达式

  1. 运算符
  2. 运算符的优先级
  3. 表达式
  4. repr()

2.1)运算符

1
2
3
4
5
6
7
8
9
10
11
12
13
& 按位与 5 & 3 得到 1
| 按位或 5 | 3 得到 7
^ 按位异或 5 ^ 3 得到 6
~ 按位翻转 ~5 得到 -6
< 小于
> 大于 
<= 小于等于
>= 大于等于
== 等于
!= 不等于
not 不是
and 并且
or 或着
1
2
3
4
5
位移 << >>
a = 10000
a<<10

a>>10

2.2)运算符的优先级

1
讲的不明所以

2.3)表达式
字符串表达式
数值表达式
逻辑表达式
函数式表达式
eval()和repr()

2.4)repr()

3)逻辑控制结构

4)函数
4.1)简单函数
4.2)带形参函数
4.3)变量作用域
4.4)默认参数值
4.5)关键参数
4.6)文档字符串
4.7)lambda
4.8)闭包

5)面向对象编程
5.1)面向对象编程
5.2)类的定义
5.3)类的实例化
5.4)类的封装
5.5)专用类方法
5.6)类属性介绍
5.7)私有函数

5.1)面向对象编程
封装(Encapsulation)
继承(Inheritance)
多态(polymorphism)

5.2)类的定义
5.3)类的实例化
5.4)类的封装
5.5)专用类方法
5.6)类属性介绍
5.7)私有函数

6)异常处理
什么叫防御式编程
try
except
finally

7)模块与包

1
2
3
4
5
6
7
__init__.py
文件、模块与包
编码问题
#!
导入
import
from import

8)输入、输出、文件和目录操作

1
2
3
4
5
6
7
open
write
read
readlines
seek
os.listdir
os.walk

尝试一下。

尝试着做一下。

挑战下自己。做一下。

04 Python内置容器

1)列表-list
定义 []
访问
切片操作
嵌套
内置函数

2)元组-tuple
定义 ()
类似list的访问方式
不可变对象
类型转换
隐式tuple调用
数据交换
拆封与解封

3)字典-dict
定义{}
字典的声明
简单使用
keys()和values()
排序问题及解决
e = sorted(a,key=lambda t:t[0])

4)集合-set
定义方式set()
set–唯一集合
演示合并功能
类型转换

5)map,reduce,filter
map

1
2
3
a=[1,2,3,4,5,6]
map(lambda x:x*2,a)
map(lambda x:x^2,a)

reduce

归并,收敛操作

1
2
a=[1,2,3,4,5,6]
reduce(lambda x,y:x+y,a)

filter

1
2
3
a=[1,2,3,4,5,6]
filter(lambda x:x%2 + 1,a)
filter(lambda x:not x%2 + 1,a)

笛卡尔方法论
拆分
排序
分别处理每一个问题
归并

6)生成器与迭代器
yield

1
2
3
4
5
6
7
8
def fab(m):
a,b=1,1
while a<m:
yield a
a,b=b,a+b

b=fab(6)
b.next()

05 并行开发

1)并行的世界
2)多进程开发
3)多线程开发

1)并行的世界
串行与并行
阻塞与非阻塞任务
共享与冲突
多线程与多进程的区别和特点

2)多进程开发
Linux、unix平台专属
fork
wait
waitpid
pipe和singal
守护进程

fork

1
2
3
4
5
6
7
8
9
10
11
import os

def myfork():
pid = os.fork()
if pid==0:
print("this is child %d %d" %(pid,os.getpid()))
else:
print("this is parent %d" %pid)

if __name__ == "__main__"
myfork()

3)多线程开发
Thread
Threading
共享变量与临界资源
锁机制

07 socket编程基础

tcpdump
netstat

TCP/IP协议卷一

select
poll
同select类似,没有文件描述符的限制
epoll
内核直接支持,基于事件就绪,注册和callback

09 django初探

1:05:38 电商网站需求分析

,