Salt 是一个统一配置管理工具(与 puppet 功能相似)。可以批量远程执行命令、修改配置文件、部署软件、定时执行任务…… 总之,你能想到的,从远程对服务器执行的操作,它几乎都能做,而且可以批量对一批服务器做。
Salt 采用 master(server) - minion(client) 模式。具有很好的水平拓展性,以 “支持无限多个 client” 为设计目标。
总体架构
Salt Master
控制中心。Salt Minion
装在被操作的服务器上。Grains
是每一台 Minion 自身的 静态 属性。以 Python 字典的形式存放在 Minion 端。Pillar
存放 key-value 变量。存放在 Master 端,由 Master 编译好后,下发给 Minion。所以,可以存放密码之类的涉密的或是一些需要统一配置的变量。State
希望由 Salt 执行的一套操作。(比如 “安装 vim、配置 vim” 可以写在一个 state 里,也可以拆成两个 state 写。)执行时,Master 将 states 生成好,下发给 Minion,由 Minion 执行 states (转化成一条条命令)。
安装 salt
各种安装方法:
http://docs.saltstack.com/en/latest/topics/tutorials/salt_bootstrap.html
通过包管理器安装
http://docs.saltstack.com/en/latest/topics/installation/ubuntu.html
sudo add-apt-repository ppa:saltstack/salt
sudo apt-get update
sudo apt-get install salt-master salt-minion salt-ssh salt-syndic
或者
源码安装(从某个 git tag 安装)
curl -o install_salt.sh -L https://bootstrap.saltstack.com
sudo sh install_salt.sh git v0.16.4
Salt 端口
TCP 4505 & 4506
基本配置
都在 /etc/salt
下,
/etc/salt/master
/etc/salt/minion
Master 配置
每次更新,需要重启 Salt Master。
Master 监听 0.0.0.0:4505 和 4506
Minion 配置
每次更新,需要重启 Salt Minion。
通常都需要在 /etc/salt/minion
配置 master 这一项,指定其 Salt Master。
如果不配置这一项,Minion 会自动通过 DNS 尝试连接 hostname 为 salt
的这个服务器。
utf-8
解决在 sls 文件中使用中文的问题,在 master 的 /etc/salt/master
& minion 的 /etc/salt/minion
上都配置
yaml_utf8: True
Key 的配置
Salt 使用 AES 加密 Master 与 Minion 之间通讯。而如果要想让 Master 认识一个 Minion,这个 Master 就必须接受这个 Minion 的 key。
重启 salt-minion,会触发 Minion 把自己的 key 发给 Master。
在 Salt Master 上:
salt-key -L # list all the keys
salt-key -A # accept all the keys
salt-key -D # delete all the keys
salt-key -R # reject all pending keys
如果只想对某个 key 进行操作,只需把参数的大写字母换成小写字母。
例如:
salt-key -a <keyname> # accept a specific key
minion_id 是如何生成的?
/etc/salt/minion
中的 id 优先级最高。如果没有设置,Minion 会再按以下顺序寻找值来作为 minion_id:
- Python 函数 socket.getfqdn() 获取的值
- /etc/hostname 定义的值(仅限于非 Windows 系统)
- /etc/hosts (%WINDIR%\system32\drivers\etc\hosts on Windows hosts) 中定义的任何映射 127.0.0.0/8 的主机名做 ID 值
最终获取的 ID 将记录在
/etc/salt/minion_id
文件中,该文件可以手动更改,重启服务后不会被重新覆盖。 但如果 minion 的配置文件/etc/salt/minion
中设置了id: xxxx
,那么这个 id 值将取代/etc/salt/minion_id
中记录的 ID 数值。http://docs.saltstack.com/en/latest/topics/tutorials/walkthrough.html#minion-id-generation
文件位置
Salt 的文件分为 State 文件 和 Pillar 文件 。
- State 文件 默认存放在
/srv/salt
- Pillar 文件 默认存放在
/srv/pillar
这两个路径都可以通过 /etc/salt/master 的 fileserver_backend, file_roots, pillar_roots 进行修改。一些高级的,跟环境 (env) 的设置,后面再介绍。
基本命令
启动 Salt
# 根据自己需要,选择以下启动方式
salt-master
salt-master -d # daemonize the process
sudo service salt-master start # linux service
salt-master --log-level=debug
salt-minion
salt-minion -d # daemonize the process
sudo service salt-minion start # linux service
执行 Salt 命令
salt '<target>' <function> [arguments]
target:
用来指定对哪些 minion 执行操作。可以匹配 minion id 或 Grains。
# 支持正则表达、列表以及 id/grains 混合。
# 普通 (按 minion-id 过滤)
salt '*.example.org' test.ping
# 正则表达 (regular expression)
salt -E 'virtmach[0-9]' test.ping
# 列表 (list)
salt -L 'foo,bar,baz,quo' test.ping
# 混合型 (combined)
salt -C 'G@os:Ubuntu and webser* or E@database.*' test.ping
| Letter | Match Type | Example |
| :----- | :----------------- | :---------------------------------- |
| G | Grains glob | G@os:Ubuntu |
| E | 正则匹配 Minion ID | E@web\d+\.(dev\|qa\|prod)\.loc |
| P | Grains 正则匹配 | P@os:(RedHat\|Fedora\|CentOS) |
| L | List of minions | L@minion1,minion3 or bl*.domain.com |
| I | Pillar glob | I@pdata:foobar |
| S | Subnet/IP address | S@192.168.1.0/24 or S@192.168.1.100 |
| R | Range cluster | R@%foo.bar |
function:
指定执行哪个命令模块(module)。
要习惯从下面这个 salt builtin execution modules 列表中寻找自己需要的,点进去看详细的命令参数。
http://docs.saltstack.com/en/latest/ref/modules/all/常用的举例:
salt '*' test.ping salt '*' cmd.run "ls -l | awk '/foo/{print \$2}'" salt '*' state.sls xxx
arguments:
module 的参数。通过空格分隔,加在 function 后面。 比如:-l debug
输出 debug 信息
salt 命令参数:http://docs.saltstack.com/en/latest/ref/cli/salt.html
salt module 使用指南:http://docs.saltstack.cn/topics/tutorials/modules.html
salt builtin execution modules 列表: http://docs.saltstack.com/en/latest/ref/modules/all/
salt logging 指南:http://salt.readthedocs.org/en/latest/ref/configuration/logging/index.html
Q&A:
是否可以在 salt minion 上直接无 master 运行 module/state ?
答案所肯定的。首先,这需要把 /etc/salt/minion 像 /etc/salt/master 那样配置好:
file_roots
和pillar_roots
,然后:方法一:
本来 salt 会去 master 上找 file server 和 pillar data,现在则需要把 /etc/salt/minion 里的
file_client
从默认的 remote 改为 local,这样 salt 就会在本地寻找。file_client: local
运行
salt-call test.ping
方法二:
直接运行
salt-call --local test.ping
--local
参数让 Minion 在本地寻找 salt tree,而不用修改 /etc/salt/minion
至此,Salt 入门完成了。你已经学会用 salt 自带的 modules,对选定范围的 minion 执行命令了。