SaltStack一键部署lnmp中小企业架构(一)—系统初始化
1.项目准备
1.1 系统信息
[root@linux-node1 ~]# cat /etc/redhat-release CentOS Linux release 7.2.1511 (Core) [root@linux-node1 ~]# uname -r 3.10.0-327.18.2.el7.x86_64 [root@linux-node1 ~]# ifconfig eth0|awk -F "[ :]+" 'NR==2{print $3}' 192.168.56.11 [root@linux-node1 ~]# hostname linux-node1.example.com #node2主机名为linux-node2.example.com,IP为192.168.56.12,其余配置相同
1.2 功能模块管理
设置单独的目录:haproxy 、nginx 、php 、mysql 、memcached (尽可能的全面、独立)
1.3 业务模块分类
根据业务类型划分:如Web服务 、论坛BBS(使用include)
1.4 Salt环境配置
开发 ==> 测试(功能测试环境、性能测试环境、自动化测试环境) ==> 预生产 ==> 生产
1.base 基础环境
[root@linux-node1 ~]# vi /etc/salt/master #修改file_roots,创建base和prod目录,保存重启master 448 # The file server works on environments passed to the master, each environment 449 # can have multiple root directories, the subdirectories in the multiple file 450 # roots cannot match, otherwise the downloaded files will not be able to be 451 # reliably ensured. A base environment is required to house the top file. 452 # Example: 453 # file_roots: 454 # base: 455 # - /srv/salt/ 456 # dev: 457 # - /srv/salt/dev/services 458 # - /srv/salt/dev/states 459 # prod: 460 # - /srv/salt/prod/services 461 # - /srv/salt/prod/states 462 # 463 file_roots: 464 base: 465 - /srv/salt/base #base基础环境目录 466 prod: 467 - /srv/salt/prod #prod生产环境目录 619 ########################################## 620 # Salt Pillars allow for the building of global data that can be made selectively 621 # available to different minions based on minion grain filtering. The Salt 622 # Pillar is laid out in the same fashion as the file server, with environments, 623 # a top file and sls files. However, pillar data does not need to be in the 624 # highstate format, and is generally just key/value pairs. 625 pillar_roots: 626 base: 627 - /srv/pillar/base #pillar目录设置 628 prod: 629 - /srv/pillar/prod ============================================== [root@linux-node1 /]# mkdir -p /srv/salt/{base,prod} /srv/pillar/{base,prod} [root@linux-node1 /]# tree srv srv ├── pillar │ ├── base │ └── prod └── salt ├── base └── prod [root@linux-node1 /]# cd /srv/salt/base [root@linux-node1 /srv/salt/base]# mkdir init [root@linux-node1 /srv/salt/base]# ll drwxr-xr-x 2 root root 6 Jul 27 21:32 init
init目录--环境初始化
1.dns配置
[root@linux-node1 /srv/salt/base/init]# cat dns.sls /etc/resolv.conf: file.managed: - source: salt://init/files/resolv.conf #salt://根据配置相当于/srv/salt/base目录 - user: root - group: root - mode: 644 [root@linux-node1 /srv/salt/base/init]# mkdir files [root@linux-node1 /srv/salt/base/init]# cd files [root@linux-node1 /srv/salt/base/init/files]# cat resolv.conf #把系统dns配置文件拷贝到files目录下 # Generated by NetworkManager nameserver 192.168.56.2 # No nameservers found; try putting DNS servers into your # ifcfg files in /etc/sysconfig/network-scripts like so: # # DNS1=xxx.xxx.xxx.xxx # DNS2=xxx.xxx.xxx.xxx # DOMAIN=lab.foo.com bar.foo.com
2.histroy记录时间
[root@linux-node1 /srv/salt/base/init]# cat history.sls /etc/profile: file.append: #文件追加,在/etc/porfile文件末尾追加一行 - text: - export HISTTIMEFORMAT="%F %T `whoami` " #追加内容
3.记录命令操作
[root@linux-node1 /srv/salt/base/init]# cat audit.sls /etc/bashrc: file.append: - text: - export PROMPT_COMMAND='{ msg=$(history 1 | { read x y; echo $y; });logger "[euid=$(whoami)]":$(who am i):[`pwd`]"$msg"; }'
4.内核参数优化
[root@linux-node1 /srv/salt/base/init]# cat sysctl.sls net.ipv4.ip_local_port_range: #设置本地可用的端口范围,作为客户端发起连接时使用 sysctl.present: #使用了sysctl里的一个模块 - value: 10000 65000 #随机分配端口范围 fs.file-max: sysctl.present: - value: 2000000 #文件打开数限制,Linux中一切皆文件 net.ipv4.ip_forward: #打开IP转发 sysctl.present: - value: 1 vm.swappiness: #交换分区使用权重值,让系统尽量不使用 sysctl.present: - value: 0 [root@linux-node1 /srv/salt/base/init]# cat /proc/sys/fs/file-max 183487 [root@linux-node1 /srv/salt/base/init]# cat /proc/sys/vm/swappiness 30 #其余调优参数可以自行添加即可
5.安装yum仓库
[root@linux-node1 /srv/salt/base/init]# cat epel.sls yum_repo_release: pkg.installed: - sources: #指定一个地址,pkg安装模块会从配置的url安装服务 - epel-release: http://mirrors.aliyun.com/epel/epel-release-latest-7.noarch.rpm
6.安装zabbix-agent
[root@linux-node1 /srv/salt/base/init]# cat zabbix-agent.sls zabbix-agent: pkg.installed: - name: zabbix-agent file.managed: - name: /etc/zabbix/zabbix_agentd.conf #配置文件管理 - source: salt://init/files/zabbix_agentd.conf #zabbix-agent配置文件放置路径 - template: jinja #jinja模版 - backup: minion #配置文件发生变动master会本地保存一份(在/var/cache/salt/minion/file_backup/etc/zabbix目录下),便于回滚 - defaults: Zabbix_Server: {{ pillar['Zabbix_Server'] }} #pillar配置Zabbix_Server的key值 Hostname: {{ grains['fqdn'] }} #主动模式配置 - require: - pkg: zabbix-agent #依赖安装包 service.running: - enable: True #开机自动运行 - watch: - pkg: zabbix-agent #监控包和文件,发生改变则重启 - file: zabbix-agent zabbix_agentd.conf.d: file.directory: - name: /etc/zabbix/zabbix_agentd.d - watch_in: #被zabbix-agent依赖 - service: zabbix-agent - require: - pkg: zabbix-agent - file: zabbix-agent [root@linux-node1 /srv/salt/base/init/files]# cd files [root@linux-node1 /srv/salt/base/init/files]# vi zabbix_agentd.conf Server={{ Zabbix_Server }} #配置pillar的key值 [root@linux-node1 /srv/pillar/base]# cd /srv/pillar/base/ #创建pillar文件 [root@linux-node1 /srv/pillar/base]# mkdir zabbix && cd zabbix && vi agent.sls [root@linux-node1 /srv/pillar/base/zabbix]# cat agent.sls Zabbix_Server: 192.168.56.11 #要与zabbix-agent.sls中定义的值要一致 [root@linux-node1 /srv/pillar/base]# cat top.sls #pillar文件需定义top file指定执行 base: '*': zabbix.agent [root@linux-node1 /srv/pillar/base]# salt '*' pillar.items #检测Pillar取值 linux-node1.example.com: ---------- Zabbix_Server: 192.168.56.11 linux-node2.example.com: ---------- Zabbix_Server: 192.168.56.11 [root@linux-node1 /srv/pillar/base]# salt '*' state.sls init.zabbix-agent #执行安装zabbix-agent linux-node2.example.com: ---------- ID: zabbix-agent Function: pkg.installed Result: True Comment: Package zabbix-agent is already installed Started: 22:57:37.600906 Duration: 612.173 ms Changes: ---------- ID: zabbix-agent Function: file.managed Name: /etc/zabbix/zabbix_agentd.conf Result: True Comment: File /etc/zabbix/zabbix_agentd.conf updated Started: 22:57:38.214747 Duration: 270.8 ms Changes: ---------- diff: --- +++ @@ -92,7 +92,7 @@ # Default: # Server= -Server=127.0.0.1 +Server=192.168.56.11 ### Option: ListenPort # Agent will listen on this port for connections from the server. @@ -141,10 +141,10 @@ # Value is acquired from HostnameItem if undefined. # # Mandatory: no -# Default: +# Default: aksjdffjaksdjfkajsdkfjaksjdfkajsdkfjakdjsf # Hostname= -Hostname=Zabbix server + ### Option: HostnameItem # Item used for generating Hostname if it is undefined. Ignored if Hostname is defined. @@ -262,7 +262,7 @@ # Default: # Include= -Include=/etc/zabbix/zabbix_agentd.d/ +Include=/etc/zabbix/zabbix_agentd.d/*.conf # Include=/usr/local/etc/zabbix_agentd.userparams.conf # Include=/usr/local/etc/zabbix_agentd.conf.d/ ---------- ID: zabbix_agentd.conf.d Function: file.directory Name: /etc/zabbix/zabbix_agentd.d Result: True Comment: Directory /etc/zabbix/zabbix_agentd.d is in the correct state Started: 22:57:38.486361 Duration: 0.562 ms Changes: ---------- ID: zabbix-agent Function: service.running Result: True Comment: Service zabbix-agent has been enabled, and is running Started: 22:57:38.487067 Duration: 164.502 ms Changes: ---------- zabbix-agent: True Summary for linux-node2.example.com ------------ Succeeded: 4 (changed=2) Failed: 0 ------------ Total states run: 4 linux-node1.example.com: ---------- ID: zabbix-agent Function: pkg.installed Result: True Comment: Package zabbix-agent is already installed Started: 22:57:38.043836 Duration: 842.412 ms Changes: ---------- ID: zabbix-agent Function: file.managed Name: /etc/zabbix/zabbix_agentd.conf Result: True Comment: File /etc/zabbix/zabbix_agentd.conf is in the correct state Started: 22:57:38.887756 Duration: 198.125 ms Changes: ---------- ID: zabbix_agentd.conf.d Function: file.directory Name: /etc/zabbix/zabbix_agentd.d Result: True Comment: Directory /etc/zabbix/zabbix_agentd.d is in the correct state Started: 22:57:39.086684 Duration: 0.523 ms Changes: ---------- ID: zabbix-agent Function: service.running Result: True Comment: The service zabbix-agent is already running Started: 22:57:39.087356 Duration: 36.602 ms Changes: Summary for linux-node1.example.com ------------ Succeeded: 4 Failed: 0 ------------ Total states run: 4
◇ 集中管理
#创建一个init.sls文件include所有初始化文件,便于高级状态执行 [root@linux-node1 /srv/salt/base/init]# cat init.sls include: - init.dns - init.history - init.audit - init.sysctl - init.epel - init.zabbix-agent [root@linux-node1 /srv/salt/base/init]# salt '*' state.sls init.init #执行单个状态 linux-node2.example.com: ---------- ID: /etc/resolv.conf Function: file.managed Result: True Comment: File /etc/resolv.conf updated Started: 23:08:41.788523 Duration: 153.037 ms Changes: ---------- diff: #文件变动对比 --- +++ @@ -1,3 +1,9 @@ # Generated by NetworkManager -search example.com nameserver 192.168.56.2 + +# No nameservers found; try putting DNS servers into your +# ifcfg files in /etc/sysconfig/network-scripts like so: +# +# DNS1=xxx.xxx.xxx.xxx +# DNS2=xxx.xxx.xxx.xxx +# DOMAIN=lab.foo.com bar.foo.com ---------- ID: /etc/profile Function: file.append Result: True Comment: Appended 1 lines Started: 23:08:41.941678 Duration: 2.037 ms Changes: ---------- diff: --- +++ @@ -75,3 +75,4 @@ unset i unset -f pathmunge alias grep='grep --color' +export HISTTIMEFORMAT="%F %T `whoami` " #追加 ---------- ID: /etc/bashrc Function: file.append Result: True Comment: Appended 1 lines Started: 23:08:41.943854 Duration: 2.416 ms Changes: ---------- diff: --- +++ @@ -91,3 +91,4 @@ fi # vim:ts=4:sw=4 alias vi='vim' +export PROMPT_COMMAND='{ msg=$(history 1 | { read x y; echo $y; });logger "[euid=$(whoami)]":$(who am i):[`pwd`]"$msg"; }' ---------- ID: net.ipv4.ip_local_port_range Function: sysctl.present Result: True Comment: Updated sysctl value net.ipv4.ip_local_port_range = 10000 65000 Started: 23:08:41.965020 Duration: 113.257 ms Changes: #内核参数修改 ---------- net.ipv4.ip_local_port_range: 10000 65000 ---------- ID: fs.file-max Function: sysctl.present Result: True Comment: Updated sysctl value fs.file-max = 2000000 Started: 23:08:42.078430 Duration: 26.091 ms Changes: ---------- fs.file-max: 2000000 ---------- ID: net.ipv4.ip_forward Function: sysctl.present Result: True Comment: Updated sysctl value net.ipv4.ip_forward = 1 Started: 23:08:42.104677 Duration: 22.862 ms Changes: ---------- net.ipv4.ip_forward: 1 ---------- ID: vm.swappiness Function: sysctl.present Result: True Comment: Updated sysctl value vm.swappiness = 0 Started: 23:08:42.127679 Duration: 21.958 ms Changes: ---------- vm.swappiness: 0 ---------- ID: yum_repo_release Function: pkg.installed Result: True Comment: The following packages were installed/updated: epel-release Started: 23:08:42.518064 Duration: 2740.0 ms Changes: ---------- epel-release: #epel源修改 ---------- new: 7-7 old: 7-6 ---------- ID: zabbix-agent Function: pkg.installed Result: True Comment: Package zabbix-agent is already installed Started: 23:08:45.264093 Duration: 0.443 ms Changes: ---------- ID: zabbix-agent Function: file.managed Name: /etc/zabbix/zabbix_agentd.conf Result: True Comment: File /etc/zabbix/zabbix_agentd.conf is in the correct state Started: 23:08:45.265502 Duration: 188.186 ms Changes: ---------- ID: zabbix_agentd.conf.d Function: file.directory Name: /etc/zabbix/zabbix_agentd.d Result: True Comment: Directory /etc/zabbix/zabbix_agentd.d is in the correct state Started: 23:08:45.574132 Duration: 0.64 ms Changes: ---------- ID: zabbix-agent Function: service.running Result: True Comment: The service zabbix-agent is already running Started: 23:08:45.575028 Duration: 25.187 ms Changes: Summary for linux-node2.example.com ------------- Succeeded: 12 (changed=8) Failed: 0 ------------- Total states run: 12 linux-node1.example.com: ---------- ID: /etc/resolv.conf Function: file.managed Result: True Comment: File /etc/resolv.conf updated Started: 23:08:42.209383 Duration: 153.387 ms Changes: ---------- diff: --- +++ @@ -1,3 +1,9 @@ # Generated by NetworkManager -search example.com nameserver 192.168.56.2 + +# No nameservers found; try putting DNS servers into your +# ifcfg files in /etc/sysconfig/network-scripts like so: +# +# DNS1=xxx.xxx.xxx.xxx +# DNS2=xxx.xxx.xxx.xxx +# DOMAIN=lab.foo.com bar.foo.com ---------- ID: /etc/profile Function: file.append Result: True Comment: Appended 1 lines Started: 23:08:42.362882 Duration: 2.037 ms Changes: ---------- diff: --- +++ @@ -75,3 +75,4 @@ unset i unset -f pathmunge alias vi='vim' +export HISTTIMEFORMAT="%F %T `whoami` " ---------- ID: /etc/bashrc Function: file.append Result: True Comment: Appended 1 lines Started: 23:08:42.365024 Duration: 2.462 ms Changes: ---------- diff: --- +++ @@ -91,3 +91,4 @@ fi # vim:ts=4:sw=4 alias vi='vim' +export PROMPT_COMMAND='{ msg=$(history 1 | { read x y; echo $y; });logger "[euid=$(whoami)]":$(who am i):[`pwd`]"$msg"; }' ---------- ID: net.ipv4.ip_local_port_range Function: sysctl.present Result: True Comment: Updated sysctl value net.ipv4.ip_local_port_range = 10000 65000 Started: 23:08:42.452382 Duration: 150.928 ms Changes: ---------- net.ipv4.ip_local_port_range: 10000 65000 ---------- ID: fs.file-max Function: sysctl.present Result: True Comment: Updated sysctl value fs.file-max = 2000000 Started: 23:08:42.603470 Duration: 26.452 ms Changes: ---------- fs.file-max: 2000000 ---------- ID: net.ipv4.ip_forward Function: sysctl.present Result: True Comment: Updated sysctl value net.ipv4.ip_forward = 1 Started: 23:08:42.630065 Duration: 24.617 ms Changes: ---------- net.ipv4.ip_forward: 1 ---------- ID: vm.swappiness Function: sysctl.present Result: True Comment: Updated sysctl value vm.swappiness = 0 Started: 23:08:42.654823 Duration: 22.987 ms Changes: ---------- vm.swappiness: 0 ---------- ID: yum_repo_release Function: pkg.installed Result: True Comment: The following packages were installed/updated: epel-release Started: 23:08:43.077997 Duration: 6365.646 ms Changes: ---------- epel-release: ---------- new: 7-7 old: 7-6 ---------- ID: zabbix-agent Function: pkg.installed Result: True Comment: Package zabbix-agent is already installed Started: 23:08:49.450456 Duration: 0.483 ms Changes: ---------- ID: zabbix-agent Function: file.managed Name: /etc/zabbix/zabbix_agentd.conf Result: True Comment: File /etc/zabbix/zabbix_agentd.conf is in the correct state Started: 23:08:49.451920 Duration: 345.85 ms Changes: ---------- ID: zabbix_agentd.conf.d Function: file.directory Name: /etc/zabbix/zabbix_agentd.d Result: True Comment: Directory /etc/zabbix/zabbix_agentd.d is in the correct state Started: 23:08:50.306027 Duration: 0.931 ms Changes: ---------- ID: zabbix-agent Function: service.running Result: True Comment: The service zabbix-agent is already running Started: 23:08:50.307251 Duration: 25.234 ms Changes: Summary for linux-node1.example.com ------------- Succeeded: 12 (changed=8) Failed: 0 ------------- Total states run: 12
◇ 高级状态执行
#执行高级状态,从top file文件开始读,给Minion指定的状态全部执行 [root@linux-node1 /srv/salt/base/init]# cat top.sls base: '*': - init.init [root@linux-node1 /srv/salt/base]# tree #目录结构 . ├── init │ ├── audit.sls │ ├── dns.sls │ ├── epel.sls │ ├── files │ │ ├── resolv.conf │ │ └── zabbix_agentd.conf │ ├── history.sls │ ├── init.sls │ ├── sysctl.sls │ └── zabbix-agent.sls └── top.sls [root@linux-node1 /srv/salt/base]# salt '*' state.highstate test=True #高级状态执行检测,从top file中读执行文件模块
2.prod 生产环境