JunJiang江骏 bio photo

JunJiang江骏

Staff Engineer @ Ant Group. Machine Learning GDE(Google Developer Expert). Focus on machine learning platform and training framework optimization.

Twitter Google+ LinkedIn Instagram Github Weibo

Salt (1) 入门

tags: salt

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 配置

master configuration reference

每次更新,需要重启 Salt Master。
Master 监听 0.0.0.0:4505 和 4506

Minion 配置

minion configuration reference

每次更新,需要重启 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:

  1. Python 函数 socket.getfqdn() 获取的值
  2. /etc/hostname 定义的值(仅限于非 Windows 系统)
  3. /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_rootspillar_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 执行命令了。


comments powered by Disqus