一.Saltstack简介
SaltStack是一个服务器基础架构集中化管理平台,具备配置管理、远程执行、监控等功能,基于Python语言实现,结合轻量级消息队列
(ZeroMQ)与Python第三方模块构建。通过部署SaltStack,我们可以在成千上万台服务器上做到批量执行命令,根据不同业务进行配置
集中化管理、分发文件、采集服务器数据、操作系统基础及软件包管理等,SaltStack是运维人员提高工作效率、规范业务配置与操作利器。
SaltStack 具有以下特性,更好的实现系统批量管理
部署简单、管理方便;
支持大部分的操作系统,如 Unix/Linux/Windows 环境;架构上使用C/S管理模式,易于扩展;
配置简单、功能覆盖广;
主控端(Master)与被控端(Minion)基于证书认证,确保安全可靠的通信;
支持 API 及自定义 Python 模块,轻松实现功能扩展;
SaltStack架构
SaltStack 采用 C/S 的架构,SaltStack 客户端(Minion)在启动时,会自动生成一套密钥,包含私钥和公钥。
之后将公钥发送SaltStack服务器端(Master),服务器端验证并接受公钥,以此来建立可靠且加密的通信连接。同时通过消息ZeroMQ
在客户端与服务端之间建立消息发布连接。
二.实验配置
实验环境rhel6.5
server6:172.25.0.122 (salt-master)
server7:172.25.0.123 (salt-minion)
1.配置yum源
此物理机中准备了saltstack包放入rhel6,修改server6/7的yum源;
列出软件包:
2.安装及文件修改
1)salt-master
[root@server6 ~]# yum install salt-master -y
[root@server6 ~]# /etc/init.d/salt-master start
2)salt-minion
[root@server7 ~]# yum install salt-minion -y
[root@server7 ~]# cd /etc/salt/
[root@server7 salt]# vim minion
[root@server7 salt]# /etc/init.d/salt-minion start
sat-key的帮助信息:
Usage: salt-key [options]
Salt key 用于管理认证key
Options:
--version 显示版本号后退出
--versions-report 显示程序的所有依赖包版本号,并退出
-h, --help 帮助信息
-c CONFIG_DIR, --config-dir=CONFIG_DIR
指定配置目录,默认 :/etc/salt/
-q, --quiet 安静模式,不输出信息到控制台
-y, --yes 对所有询问是否继续,回答yes,默认:false
Logging Options:
设置loggin选项会覆盖掉配置文件中对日志的配置.
--log-file=LOG_FILE
指定日志文件路径,默认: /var/log/salt/key.
--log-file-level=LOG_LEVEL_LOGFILE
日志文件等级,可设置下面中的一个值 'all', 'garbage',
'trace', 'debug', 'info', 'warning', 'error', 'quiet'.
默认: 'warning'.
--key-logfile=KEY_LOGFILE
将所有的输出发送到指定的文件,默认: '/var/log/salt/key'
Output Options:
配置输出格式
--out=OUTPUT, --output=OUTPUT
把salt-key命令的输出信息发送给指定的outputer.
可设置为下面参数值 'no_return', 'virt_query'.
'grains', 'yaml', 'overstatestage', 'json', 'pprint',
'nested', 'raw', 'highstate', 'quiet', 'key', 'txt',
--out-indent=OUTPUT_INDENT, --output-indent=OUTPUT_INDENT
设置输出行缩进的空格数.
负数取消输出缩进编排.仅对使用的outputer有效.
--out-file=OUTPUT_FILE, --output-file=OUTPUT_FILE
把显示输出到指定的文件
--no-color, --no-colour
关闭字体颜色
--force-color, --force-colour
强制开启输出颜色渲染
Actions:
-l ARG, --list=ARG
打印公钥key. 可设置下面三个值
"pre", "un", and "unaccepted" 会显示 不许可/未签名 keys.
"acc" or "accepted"会显示 许可/已签名 keys.
"rej" or "rejected"会显示拒绝的 keys.
"all" 会显示所有 keys.
-L, --list-all 会显示所有公钥,相当月: "--list all"
-a ACCEPT, --accept=ACCEPT
许可指定的公钥(使用--include-all选项
可以指定除了挂起的key外的所有reject状态的公钥)
-A, --accept-all 许可所有pending的公钥
-r REJECT, --reject=REJECT
拒绝指定的公钥 (使用--include-all选项
可以指定除了挂起的key外的所有accept状态的公钥)
-R, --reject-all 拒接所有pending的公钥
--include-all 配合 accepting/rejecting 选项使用,指定所有非pending状态的公钥
-p PRINT, --print=PRINT
打印指定的公钥
-P, --print-all Print all public keys
-d DELETE, --delete=DELETE
根据公钥的名称删除公钥
-D, --delete-all 删除所有 keys
-f FINGER, --finger=FINGER
打印指定key的指纹信息
-F, --finger-all 打印所有key的指纹信息
Key 常用选项:
--gen-keys=GEN_KEYS
对生成的key配置设置一个salt使用的名称。
--gen-keys-dir=GEN_KEYS_DIR
设置生成key对的放置目录,默认当前目录。default=.
--keysize=KEYSIZE
为生成key设置位数, 仅跟--gen-keys选项配合时有效,
数值大小必须大于2048,否则会被提升至2048位,默认2048
default=2048
3.公钥交换
1).查看钥匙
[root@server6 ~]# salt-key -L
2).添加钥匙
[root@server6 ~]# salt-key -A
3).此时密钥交换成功
4).查看端口:
[root@server6 ~]# netstat -antlp
5).查看公钥存放
[root@server6 salt]# cd pki/master/
[root@server6 master]# md5sum master.pub
[root@server7 salt]# cd pki/minion/
[root@server7 minion]# md5sum minion_master.pub
6).查看端口运行情况
查看python端口进程
[root@server6 master]# yum install python-setproctitle.x86_64 -y
[root@server6 master]# /etc/init.d/salt-master restart
[root@server6 master]# ps ax
4.测试salt服务
[root@server6 master]# salt ‘’ test.ping
[root@server6 master]# salt '’ cmd.run df
5.部署自动安装httpd,php
Saltstack的YAML语法三大规则
YAML语法 规则一:缩进
YAML使用一个固定的缩进风格表示数据层结构关系,Saltstack需要每个缩进级别由两个空格组成。一定不能使用tab键
规则二:冒号
YAML: mykey: my_value 每个冒号后面一定要有一个空格(以冒号结尾不需要空格,表示文件路径的模版可以不需要空格)
规则三:短横线
想要表示列表项,使用一个短横杠加一个空格。多个项使用同样的缩进级别作为同一个列表的一部分。
• YAML的结构通过空格来展示
• 项目使用"-"来表示
• 键值对使用":"来表示
• Master和Minion的配置文件均采用YAML语法
• YAML使用一个固定的缩进风格表示数据层级结构关
• 一般每个缩进级别由两个空格组成
• 注意不要使用tab
• 缩进是初学者容易出错的地方之一
• YAML的键值对采用冒号分隔
• YAML键值对对应python的字典
• YAML表示形式
name: test
或
name:
test
• Python字典
{'name': 'test'}
• 字典可以嵌套
hosts:
name: test
• 字典表示形式为
{
'hosts': {
'name': 'test'
}
}
• 列表项使用一个短横杠加一个空格
- test1
- test2
• 列表可以作为一个键值对的value
pkg-http:
- httpd
- php
• Python语法
{'pkg-http': ['httpd', 'php']}
sls文件存放根路径在master配置文件中定义,默认为/srv/salt,该目录在操作系统上不存在,需要手动创建。
在salt中可以通过salt://代替根路径.
1).开启文件系统服务器:
[root@server6 salt]# vim /etc/salt/master
2).编辑脚本并推送
文件必须以sls结尾:
[root@server6 ~]# mkdir /srv/salt
[root@server6 ~]# cd /srv/salt/
[root@server6 salt]# /etc/init.d/salt-master restart
[root@server6 salt]# mkdir httpd #在此目录里配置http与php
[root@server6 salt]# cd httpd/
[root@server6 httpd]# vim apache.sls
apache-install:
pkg.installed: #调用pkg模块里面的installed方法
- pkgs:
- httpd
- php
测试、执行推送
[root@server6 httpd]# salt server7 state.sls httpd.install #调用httpd下的install.sls
server7中查看是否安装成功:
6.安装,启动,配置httpd服务
1)[root@server6 ~]# cd /srv/salt/httpd
[root@server6 httpd]# mkdir files
[root@server6 httpd]# cd files/ #将server7的http.conf传过来,这里存放我们http的配置文件,在部署的脚本中我们会用到源文件取自这里,而对此文件直接修改,相当于对server2上的服务配置文件修改
[root@server6 httpd]# vim install.sls
[root@server6 httpd]# salt server7 state.sls httpd.install
sevice7查看httpd端口
修改http端口8080
[root@server6 files]# vim httpd.conf
[root@server6 httpd]# vim install.sls
apache-install:
pkg.installed: //安装模块
- pkgs:
- httpd
- php
file.managed: //文件模块
- name: /etc/httpd/conf/httpd.conf //server7配置文件地址
- source: salt://httpd/files/httpd.conf //源文件地址
- mode: 644 //权限
- user: root //用户
apache-service:
service.running: //服务启动模块
- name: httpd //服务名称
- enable: True //开机自启
- reload: True //修改配置文件后刷新
- watch: //监控文件,就是上面的文件模块中目的文件
- file: apache-install
推送到server7
[root@server6 httpd]# salt server7 state.sls httpd.install
server7:
----------
ID: apache-install
Function: pkg.installed
Result: True
Comment: All specified packages are already installed
Started: 18:57:07.251260
Duration: 319.787 ms
Changes:
----------
ID: apache-install
Function: file.managed
Name: /etc/httpd/conf/httpd.conf
Result: True
Comment: File /etc/httpd/conf/httpd.conf is in the correct state
Started: 18:57:07.572441
Duration: 29.819 ms
Changes:
----------
ID: apache-service
Function: service.running
Name: httpd
Result: True
Comment: Service httpd is already enabled, and is running
Started: 18:57:07.602853
Duration: 87.557 ms
Changes:
----------
httpd:
True
Summary for server7
------------
Succeeded: 3 (changed=1)
Failed: 0
------------
Total states run: 3
Total run time: 437.163 ms
server7中查看端口:
推送完成。
sls文件的多种编写方式:
1.将文件模块与安装模块并列出来
[root@server6 httpd]# vim install.sls
apache-install:
pkg.installed:
- pkgs:
- httpd
- php
service.running:
- name: httpd
- enable: True
- reload: True
- watch:
- /etc/httpd/conf/httpd.conf
/etc/httpd/conf/httpd.conf:
file.managed:
- source: salt://httpd/files/httpd.conf
- mode: 644
- user: root
2.将安装模块并列出来
httpd:
pkg.installed
php:
pkg.installed
apache-service:
service.running:
- name: httpd
- enable: True
- reload: True
- watch:
- /etc/httpd/conf/httpd.conf
/etc/httpd/conf/httpd.conf:
file.managed:
- source: salt://httpd/files/httpd.conf
- mode: 644
- user: root
3.安装,启动,配置,加载httpd文件分离
[root@server6 httpd]# vim install.sls
httpd:
pkg.installed
php:
pkg.installed
~
[root@server6 httpd]# vim service.sls
apache-service:
service.running:
- name: httpd
- enable: True
- reload: True
- watch:
- /etc/httpd/conf/httpd.conf
/etc/httpd/conf/httpd.conf:
file.managed:
- source: salt://httpd/files/httpd.conf
- mode: 644
- user: root
将以上两个文件结合起来,重新写入service.sls文件
[root@server6 httpd]# vim service.sls
include: //include模块可以将前边写的文件包括进来
- httpd.install
apache-service:
service.running:
- name: httpd
- enable: True
- reload: True
- watch:
- /etc/httpd/conf/httpd.conf
/etc/httpd/conf/httpd.conf:
file.managed:
- source: salt://httpd/files/httpd.conf
- mode: 644
- user: root
推送:
[root@server6 httpd]# salt server7 state.sls httpd.service
server7:
----------
ID: httpd
Function: pkg.installed
Result: True
Comment: Package httpd is already installed
Started: 19:36:28.194860
Duration: 323.203 ms
Changes:
----------
ID: php
Function: pkg.installed
Result: True
Comment: Package php is already installed
Started: 19:36:28.518198
Duration: 0.431 ms
Changes:
----------
ID: /etc/httpd/conf/httpd.conf
Function: file.managed
Result: True
Comment: File /etc/httpd/conf/httpd.conf is in the correct state
Started: 19:36:28.520607
Duration: 30.018 ms
Changes:
----------
ID: apache-service
Function: service.running
Name: httpd
Result: True
Comment: The service httpd is already running
Started: 19:36:28.550773
Duration: 19.589 ms
Changes:
Summary for server7
------------
Succeeded: 4
Failed: 0
------------
Total states run: 4
Total run time: 373.241 ms
推送完成。