saltstack是自动化管理工具。
术语:
Master - 控制中心,salt命令运行和资源状态管理端
Minions - 需要管理的客户端机器,会主动去连接Master端,并从Master端得到资源状态信息,同步资源管理信息
States - 配置管理的指令集
Grains - minion端的变量,静态
pillar - minion端的变量,动态
highstate - 给minion永久下添加状态,从sls配置文件读取到的
salt schedule - 自动保持客户端配置
安装源
centos6
rpm -ivh http://ftp.linux.ncsu.edu/pub/epel/6/i386/epel-release-6-8.noarch.rpm
centos5
rpm –ivh http://mirror.pnl.gov/epel/5/i386/epel-release-5-4.noarch.rpm
安装
yum –y install salt-master (master 安装)
yum –y install salt-minion (minion 安装)
master配置
编辑配置文件/etc/salt/master 修改如下所示的配置项,去掉注释
interface: 0.0.0.0
keep_jobs: 12 #12小时清楚一次cache
file_recv: Ture #开启master从minion上拉取文件
file_recv_max_size: 2000 #拉取文件的最大2000m(默认为m)
file_roots: #修改saltstack管理目录
base:
- /srv/salt
nodegroups: #配置组
lc1: '[email protected],rsync2.a.com'
minion配置
master: 192.168.100.102
id: rsync1.a.com
schedule: #配置受控端同步,每隔60秒与主控端进行同步一次 编辑/etc/salt/minion
highstate:
function: state.highstate
seconds: 60
证书管理
salt-key -L #列出所有
salt-key -a rsync1.a.com #接受一个证书
通信测试
测试与受控主机网络是否通畅
salt '*' test.ping
执行客户端的命令
salt '*' cmd.run 'ifconfig'
可以通过grains查看一些系统信息,例如
salt \* grains.items
查看单个grain,使用grains.item命令
salt \* grains.item os
安装软件
[root@rsync2 ~]# salt -N lc1 pkg.install telnet
查看已经安装的包
[root@rsync2 ~]# salt '*' pkg.list_pkgs
删除包
[root@rsync2 ~]# salt '*' pkg.remove telnet
查看你repos
[root@rsync2 ~]# salt '*' pkg.list_repos
模板的使用
文件的拷贝
[root@rsync2 salt]# cat zabbix/zabbix.sls
/etc/zabbix/zabbix_agentd.conf:
file.managed:
- source: salt://zabbix/zabbix_agentd.conf
- mode: 644
- owner: root
- group: root
- template: jinja
将zabbix/zabbix_agentd.conf中的Hostname换成下面
{% if grains['os'] == 'Ubuntu' %}
Hostname={{ grains['host'] }}
{% elif grains['os'] == 'CentOS' %}
Hostname={{ grains['fqdn'] }}
{% endif %}
执行
[root@rsync2 salt]# salt -N "lc2" state.sls zabbix.zabbix
监控配置文件的更改
[root@rsync2 salt]# vim apache/httpd.sls
test1: #id宣告
pkg: #安装包管理
- name: httpd #安装哪个软件
- installed #要求是安装
service: #服务管理
- name: httpd #指定服务
- running #服务运行状态
- reload: True #是否重启
- watch: #如果下面文件发生变化,就重启
- file: /etc/httpd/conf/httpd.conf #监控的文件地址
/etc/httpd/conf/httpd.conf: #宣告
file.managed: #文件管理
- source: salt://apache/httpd.conf #源数据在哪里
- user: root #用户
- group: root #组
- mode: 644 #权限
- backup: minion #备份一份
- template: jinja #使用的模板
执行
[root@rsync2 salt]# salt -N "lc2" state.sls apache.httpd
创建用户
[root@rsync2 users]# vim lists.sls
test13:
user.present:
- name: test13
- gid: wheel
- fullname: zhou test13
- workphone: 11111111111
- password: '$6$v9/LkY5c$t5OZ/2O0l6gWVd5LH7OHC8OEHMsWvfhYAsMYrZJ8trL5Xmfi02Y9.6XFiT8F6GH2vsjF6g9AefdGdpgp99p7Z1'
- shell: /bin/bash
- home: /home/test13
/home/test13/.ssh/authorized_keys:
file.managed:
- source: salt://users/keys/test13
- makedirs: True
- mode: 600
- owner: test13
- group: wheel
- template: jinja
执行
[root@rsync2 salt]# salt "rsync1.a.com" state.sls users.lists
rsync1.a.com:
----------
ID: test13
Function: user.present
Result: True
Comment: User test13 is present and up to date
Changes:
----------
ID: /home/test13/.ssh/authorized_keys
Function: file.managed
Result: True
Comment: File /home/test13/.ssh/authorized_keys is in the correct state
Changes:
Summary
------------
Succeeded: 2
Failed: 0
------------
Total: 2
user.present: 确保指定的账户名存在,并指定其对应的属性. 这些属性包括如下内容:
name: 指定需要管理的账户名.
uid: 指定uid, 如果不设置将配自动分配下一个有效的uid.
gid: 指定默认的组id(group id)
gid_from_name: 如果设置为_True_,默认的组id将自动设置为和本用户同名的组id
groups: 分配给该用户的组列表(a list of groups). 如果组在minion上不存在,则本state会报错. 如果设置会空,将会删除本用户所属的除了默认组之外的其他组
optional_groups: 分配给用户的组列表。 如果组在minion上不存在,则state会忽略它.
home: 关于用户的家目录(home directory).
password: 设置用户hash之后的密码.
enforce_password: 当设置为_False_时,如果设置的_password_与用户原密码不同,将保持原密码不做更改.如果没有设置_password_选项,该选项将自动忽略掉.
shell: 指定用户的login shell。 默认将设置为系统默认shell。
unique: UID唯一,默认为True.
system: 从_FIRST_SYSTEM_UID_和_LAST_SYSTEM_UID_间选择一个随机的UID.
用户描述选项(GECOS)支持(当前只支持Linux和FreeBSD系统):
fullname: 指定用户全名(full name).
roomnumber: 指定用户的房间号.
workphone: 指定用户的工作电话号码.
homephone: 指定用户的家庭电话号码.
user.absent 用于删除用户.其有以下选项:
name: 指定需要删除的用户名.
purge: 设置清除用户的文件(家目录)
force: 如果用户当前已登录,则absent state会失败. 设置_force_选项为True时,就算用户当前处于登录状态也会删除本用户.
当管理用户时,至少需要指定_user.present_或_user.absent_。 其他选项是可选的,比如_uid_、_gid_、_home_等选项没有指定是,将自动使用下一个有效的或者系统默认的
拷贝目录
[root@rsync2 dir]# vi file.sls
/tmp/zhou: #id宣告
file.recurse: #使用文件递归模块
- makedirs: Ture #创建目录
- user: root #文件的用户
- group: root #文件的组
- dir_mode: 755 #文件的权限
- template: jinja #使用的模板
- source: salt://zhou #文件的来源
- include_empty: True #空目录也拷贝
- clean: True #清理现在不存在文件或目录
执行
[root@rsync2 dir]# salt -N 'rsync1' state.sls dir.file
引入变量
一样的文件拷贝
[root@rsync2 files]# cat myapp.sls
/etc/myapp.conf:
file.managed:
- source: salt://files/myapp2.conf
- mode: 644
- owner: test2
- group: test2
- template: jinja
参数的使用
[root@rsync2 files]# cat myapp2.conf
Listen: {{ pillar['db']['listen'] }}
参数的定义
[root@rsync2 pillar]# cat top.sls
base:
'rsync1.a.com':
- data
'rsync2.a.com':
- data2
[root@rsync2 pillar]# cat data.sls
db:
listen: 888
[root@rsync2 pillar]# cat data2.sls
db:
listen: 1111
执行
[root@rsync2 pillar]# salt -N 'lc1' state.sls files.myapp
查看所有变量
[root@rsync2 pillar]# salt 'rsync1.a.com' pillar.items
高级部分
cp.get_file用来从master下载文件到客户端,语法如下:
# salt '*' cp.get_file salt://vimrc /etc/vimrc
对于大文件,cp.get_file支持gzip压缩,在参数中指定gzip的压缩级别,如下:
# salt '*' cp.get_file salt://vimrc /etc/vimrc gzip=5
cp.get_file默认不在客户端上建立目录,如果客户端上没有这个目录了,文件拷贝将失败,可以指定makedirs=True来创建目录:
# salt '*' cp.get_file salt://vimrc /etc/vim/vimrc makedirs=True
cp.get_dir可以从master下载整个目录,语法如下:
# salt '*' cp.get_dir salt://etc/apache2 /etc
cp.get_dir也支持模板和压缩:
# salt '*' cp.get_dir salt://etc/`pillar`.`webserver` /etc gzip=5 template=jinja
get_url
cp.get_url可以从一个URL地址下载文件,URL可以是msater上的路径(salt://),也可以是http网址。
# salt '*' cp.get_url salt://my/file /tmp/mine
# salt '*' cp.get_url http://www.slashdot.org /tmp/index.html
get_template
cp.get_template可以在文件下载之前用模板引擎处理。
# salt '*' cp.get_template salt://path/to/template /minion/dest