altstack搭建haproxy代理的nginx服务
关于saltstack的搭建,请参见我的博客。
测试salt正常:
[root@server1 package]# salt '*' cmd.run 'free -m'
server2.example.com:
total used free shared buffers cached
Mem: 996 185 811 0 9 74
-/+ buffers/cache: 101 895
Swap: 991 0 991
server3.example.com:
total used free shared buffers cached
Mem: 490 371 119 0 12 92
-/+ buffers/cache: 265 224
Swap: 991 0 991
haproxy是一个开源的高性能反向代理,支持四层和七层的负载均衡,多种负载均衡算法和健康检查。
keepalived是一个高可用集群,通过vrrp协议实现,可以通过keepalived管理haproxy,当haproxy出现故障时,通过高可用机制使其继续提供服务。
nginx作为后端
使用saltstack一键部署
所用主机为rhel6.5
salt-master :server1.example.com :172.25.33.1
salt-minion: server2.example.com:172.25.33.2 haproxy keepalived
salt-minion: server3.example.com:172.25.33.3 haproxy keepalived
salt-minion: server4.example.com:172.25.33.4 nginx
salt-minion: server5.example.com:172.25.33.5 nginx
[root@server1 conf]# salt-key -L
Accepted Keys:
server2.example.com
server3.example.com
server4.example.com
server5.example.com
Denied Keys:
Unaccepted Keys:
Rejected Keys:
**saltstack的组件Pillar**
Pillar是salt非常重要的组件,他用于给特定的minion定义任何你需要的数据,这些数据可以被salt的其他组件使用,Pillar在解析完成后,是一个嵌套的dict结构,最上层的key是minionID ,其value是该minion所拥有的Pillar数据,每个value也都是一个键值对。
Pillar的数据是与特定的minion关联的,每个Minion只能看到自己的数据,所以Pillar用于传递敏感数据
saltstack布局:
# tree salt
salt
|-- haproxy
| |-- conf
| | `-- haproxy.cfg
| |-- init.d
| | `-- haproxy
| |-- init.sls
| |-- package
| | `-- haproxy-1.4.24.tar.gz
| `-- sbin
| `-- haproxy
|-- keepalived-master
| |-- conf
| | |-- check_haproxy.sh
| | |-- keepalived
| | `-- keepalived.conf
| |-- init.d
| | `-- keepalived
| |-- init.sls
| |-- package
| | `-- keepalived-1.2.24.tar.gz
| `-- sbin
| `-- keepalived
|-- keepalived-slave
| |-- conf
| | |-- check_haproxy.sh
| | |-- keepalived
| | `-- keepalived.conf
| |-- init.d
| | `-- keepalived
| |-- init.sls
| |-- package
| | `-- keepalived-1.2.24.tar.gz
| `-- sbin
| `-- keepalived
|-- memcache-node1
| |-- init.sls
| `-- package
| |-- context.xml
| |-- libevent-1.4.13-4.el6.x86_64.rpm
| `-- memcached-1.4.22-4.el6.art.x86_64.rpm
|-- memcache-node2
| |-- init.sls
| `-- package
| |-- context.xml
| |-- libevent-1.4.13-4.el6.x86_64.rpm
| `-- memcached-1.4.22-4.el6.art.x86_64.rpm
|-- mysql-master
| |-- conf
| | |-- my.cnf
| | `-- mysqld
| |-- init.sls
| |-- mysql_login.sh
| `-- package
|-- mysql-slave
| |-- conf
| | `-- my.cnf
| |-- init.sls
| `-- package
|-- nginx
| |-- conf
| | `-- nginx.conf
| |-- init.sls
| |-- package
| | `-- nginx-1.10.1.tar.gz
| `-- sbin
| `-- nginx
|-- php
| |-- init.sls
| `-- package
| |-- libmcrypt-2.5.8-9.el6.x86_64.rpm
| |-- libmcrypt-devel-2.5.8-9.el6.x86_64.rpm
| |-- php-5.6.19.tar.bz2
| |-- php-fpm
| |-- php-fpm.conf
| |-- php-fpm.conf.default
| |-- php.ini
| `-- php.ini-production
|-- README
|-- tomcat
| |-- init.sls
| `-- package
| |-- apache-tomcat-7.0.8.tar.gz
| |-- jdk-8u45-linux-x64.tar.gz
| |-- profile
| `-- test.jsp
|-- top.sls
`-- user
`-- init.sls
34 directories, 54 files
**saltstack常见的模块:**
cmd cron file mount ntp pkg service user group
**cmd 模块:**
name: 要执行的命令,该命令会在salt-minion的路径和权限下执行
onlyif:用于检查命令,仅当onlyif选项指向的命令返回值为True时才执行name后命令
unless: 用于检查命令,仅当unless 选项指向的命令返回为False时才执行name指向的命令
cwd: 执行命令时的当前工作目录,默认时/root
user/group:指定用户身份运行命令
shell: 用于执行命令的shell,默认时shell grain
run:运行name后的命令
nginx_source:
file.managed:
- name: /tmp/nginx-1.4.5.tar.gz
- unless: test -f /tmp/nginx-1.4.5.tar.gz ##若minion端不存在/tmp/nginx-1.4.5.tar.gz这个文件,才会执行这个file模块
- source: salt://nginx/files/nginx-1.4.5.tar.gz
tar_nginx:
cmd.run:
- cwd: /usr/local/src ##当前工作目录
- name: tar zxvf nginx-1.4.5.tar.gz
- unless: test -d /usr/local/src/nginx-1.4.5
- require:
- file: nginx_source
**cron模块:**
minute:分
hour:时
daymonth:日
month:月
dayweek:周
user:用户名
present:创建计划任务
absent:删除计划任务
name:计划任务内容
cat cron.sls
mysql_cron:
cron:
- present
- name: cd /tmp/scripts;./mysql_backup.sh
- user: root
- minute: 0
- hour: 1
#- daymonth:
#- month:
#- dayweek:
#- minute: "*/5"
mysql_cron:
cron:
- absent
- name: cd /tmp/scripts;./mysql_backup.sh ##只要保证name后命令不变,能匹配到
- user: root
- minute: 0
- hour: 2
#- daymonth:
#- month:
#- dayweek:
#- minute: "*/5"
**file模块:**
/tmp/salt/:
file:
- directory #目录不存在,则创建目录
- name: /tmp/salt/
- user: nobody
- group: nobody
- file_mode: 644 #与recurse递归函数一起用
- dir_mode: 755 #文件权限644,目录权限755
- makedirs: True
- recurse: #递归目录权限,包括用户和权限
- user #若本来此目录就存在,且此目录下有很多文件,则recurse函数会把此目录和目录下的所有文件的权限都修改(nobody 644 755)
- group
- mode #文件644,目录755,就是上面的file_mode和dir_mode
#- ignore_files #忽略文件
#- ignore_dirs
/tmp/salt/file:
file:
- managed #创建文件
- name: /tmp/salt/file
- source: salt://web/files/httpd.conf
- user: nobody
- group: nobody #若此文件本来就存在,则会修改此文件的权限(nobody 644)
- mode: 644
#- backup: minion
#- template: jinja #调用pillar变量和grains变量
- require:
- file: /tmp/salt/
**file.managed:**
常规文件可以使用file.managed函数,这个状态函数从salt-master下载文件到目标地址
Manage a given file, this function allows for a file to be downloaded from the salt master and potentially run through a templating system.
*- name: 要管理文件的位置。可以有多个*:
==- name: /mnt/haproxy-1.4.24.tar.gz
- names:
- /mnt/memcached-1.4.22-4.el6.art.x86_64.rpm
- /mnt/libevent-1.4.13-4.el6.x86_64.rpm==
*- source: 资源位置:*
The source file to download to the minion, this source file can be hosted on either the salt master server (salt://), the salt minion local file system (/), or on an HTTP or FTP server (http(s)://, ftp://).即可以是从主上下载,也可以是从自己的,同时可以是网络资源。
If the file is hosted on a HTTP or FTP server then the source_hash argument is also required.需要资源加密
==- source: salt://haproxy/package/haproxy-1.4.24.tar.gz
file.managed:
- source:
- salt://file_that_does_not_exist
- salt://file_that_exists
tomdroid-src-0.7.3.tar.gz:
file.managed:
- name: /tmp/tomdroid-src-0.7.3.tar.gz
- source: https://launchpad.net/tomdroid/beta/0.7.3/+download/tomdroid-src-0.7.3.tar.gz
- source_hash: https://launchpad.net/tomdroid/beta/0.7.3/+download/tomdroid-src-0.7.3.hash
The source_hash can be specified as a simple checksum, like so
file.managed:
- name: /tmp/tomdroid-src-0.7.3.tar.gz
- source: https://launchpad.net/tomdroid/beta/0.7.3/+download/tomdroid-src-0.7.3.tar.gz
- source_hash: 79eef25f9b0b2c642c62b7f737d4f53f
或:- source_hash: md5=79eef25f9b0b2c642c62b7f737d4f53f==
user,group,mode挺简单,就不赘述了
**template**
If this setting is applied, the named templating engine will be used to render the downloaded file
如果使用了template,那么会使用模版命名的引擎来渲染下载文件。
支持的模版:
cheetah
genshi
jinja
mako
py
wempy
(不太懂)
**service**
Services are defined as system daemons typically started with system init or rc scripts
service只能定义以init.d启动的或rc.d启动的服务。
*service.running*
- name
The name of the init or rc script used to manage the service使用init或rc脚本来管理的服务名称/etc/rc.d/rc
- enable
Set the service to be enabled at boot time
- init_delay 等待多长时间后启动
**directory**
This function can create and enforce the permissions on a directory
/srv/stuff/substuf:
file.directory:
- user: fred
- group: users
- mode: 755
- makedirs: True
区分目录权限和文件权限:
- file_mode: 744
- dir_mode: 755
**pkg模块:**
mypkgs:
pkg.installed:
- pkgs: #安装多个软件包,用pkgs函数,一行一个
- gcc
- cmake
- make
#- name: httpd #安装的软件包名,与pkgs一起用时,此函数将被忽略
##installed:安装软件包
##latest:将软件更新到最新
##removed:卸载软件包
##pkgs:安装多个软件包时,一次全部安装(推荐)
##names:安装多个软件包时,一次安装一个,需安装多次
**service模块:**
httpd:
service:
- running #使服务处于运行状态
- enable: True #设置开机自动启动
- reload: True #watch函数下监控的/etc/httpd/conf/httpd.conf文件发生变化,则会重新加载reload;若reload函数不存在或reload值为False,则会重新启动restart
- watch:
- file: /etc/httpd/conf/httpd.conf
- require:
- pkg: httpd
##dead:使服务处于stop状态
**user模块:**
user1:
user:
- present
#- name: user1
#- home: /home/user1
#- shell: /bin/bash
- uid: 600
- gid: 600
- system: True #设置为系统用户
- groups: #设置用户的所属组
- nobody #把user1用户加入到nobody组中,且仅属于nobody组;如果用户原本在jeff组中,执行后用户只在nobody组中,不再属于jeff组了
#- group1
##absent:删除用户
##force:强制删除用户(即便用户正在登陆)
**group模块:**
absent:删除用户组
name:与absent一起用,则是删除的用户组名
present:管理用户组,不存在则创建;存在则管理其属性
name:与present一起用,则是被管理的用户组名
##下面的属性全都是与present一起用的##
gid:组ID分配给命名组;如果留空,那么下一个可用的组ID将被分配
system:命名组是否是一个系统组,这本质上是groupadd“-r”选项
addusers:添加更多的用户列表作为组成员
delusers:确保这些用户从组成员中删除
members:用新成员的名单替换现有组成员。
##注:选项'members'和'adduser/delusers'是相互排斥的,不能一起使用
cheese:
group.present: #用户组不存在,则创建;若存在,则管理,包括将用户添加到此组中或将用户从组中移除
- gid: 7648
- system: True
- addusers:
- user1 #将user1添加到组中
- users2
- delusers:
- foo
cheese:
group.present:
- gid: 7648
- system: True
- members: #只有这4个用户属于这个组
- foo
- bar
- user1
- user2
**lvm模块:**
/dev/sda:
lvm:
- pv_present #创建pv
#-name: /dev/sda
my_vg:
lvm.vg_present: #创建vg
- devices: /dev/sda #指定pv
lvroot:
lvm.lv_present:
- vgname: my_vg #指定vg
- name: lvroot
- size: 10G
#- stripes: 5
#- stripesize: 8K
**mount模块:**
/mnt/sdb: #标识,没有name函数则表示挂载点
mount.mounted:
- device: /dev/sdb1 #挂载的设备名
#- name: /mnt/sdb #挂载点
- fstype: ext4
- mkmnt: True #挂载点不存在则自动创建,最好将其设置为True
- opts:
- defaults
/srv/bigdata:
mount:
- mounted:
- device: UUID=066e0200-2867-4ebe-b9e6-f30026ca2314
- fstype: xfs
- opts: nobootwait,noatime,nodiratime,nobarrier,logbufs=8
#- dump: 0 #默认是0
#- pass_num: 2 #默认是0
#- persist: True #是不是将其写入/etc/fstab文件里,默认是True,写入
- mkmnt: True
##dump: The dump value to be passed into the fstab, Default is 0
##pass_num: The pass value to be passed into the fstab, Default is 0
本博客部分转载自:http://732233048.blog.51cto.com/9323668/1677843