SaltStack基本架构
- 第一种: master-minion,这种架构master和所有minion都直接连接,minion接受来自master的指令,完成命令执行或配置管理。
- 第二种: master-syndic-minion,这种架构中master通过sydic对minion进行管理,可以进行多级扩展。
- 第三种: 无master的minion,这种架构中minion不受任何master控制,通过本地运行即可完成相关工作。
安装Saltstack
1 | ~]# yum install -y salt-master |
2 | ~}# yum install -y salt-minion |
Salt master启动默认会监听两个端口,4505(publish port)提供远程执行命令发送功能,4506( ret port)为Salt Master Ret接口,支持认证,文件服务,结果收集等功能。
Salt master的配置文件是/etc/salt/master,Salt minion的配置文件是/etc/salt/minion
配置salt-master和salt-minion,在/etc/salt/minion的配置中master: master
和id: minion-one
启动minion在启动后连接master会请求master为其签发证书,证书签发完毕后,代表master可以信任minion,并且salt-master和salt-minion之间的通信是加密的。
salt-master
1 | ~]# salt-key -L #查看key |
2 | ~]# salt-key -f minion- one #查看秘钥的指纹码,确保与minion相互匹配 |
salt-minion
1 | ~]# salt-call --local key.finger #查看秘钥指纹码 |
salt-master
1 | ~]# salt-key -a monion-one #master接受该秘钥 |
2 | ~]# salt-key -L |
对于很多minion的情况下,可以在/etc/salt/master配置文件中自动接受key:
1 | auto_accept: True |
相关命令
1 | ~]# salt '*' test.ping #探测主机是否存活 |
2 | ~]# salt '*' sys.list_functions test #列出test模块包含的其他函数 |
3 | ~]# salt '*' sys.doc test.echo #获得函数的用法 |
4 | ~]# salt '*' sys.list_modules #列出所以模块 |
目标定位字符串:
- 正则匹配: salt -E “^minion-.*” test.ping
- 列表匹配: salt -L ‘minion-one,minion-two’ test.ping
- 分组匹配: salt -N minions test.ping minions写在master的配置文件中
- Grains匹配: salt -G ‘os:CentOS’ test.ping
- Pillars匹配: salt -I ‘role:web’ test.ping
- 复合匹配: salt -C ‘minion-* and G@os:CentOS not E@.*-two$’ test.ping
- Grains PCRE: salt -P ‘os:(RedHat|Fedora|CentOS)’ test.ping
- subnet address: salt -S ‘192.168.1.0/24’ test.ping
自定义granins:
1 | ~]# salt 'minion-one' grains.setval cpu_num 8 |
2 | ~]# salt 'minion-one' grains.items # 查看全部grains的值 |
3 | ~]# salt 'minion-one' grains.item os # 查看特定grains的值 |
4 | ~]# vim /etc/salt/grains #写在minion的服务器,重启也将生效 |
5 | cpu_num: 8 |
6 | ~]# salt 'minion-one' grains.delval cpu_num |
7 | ``` |
8 | |
9 | 自定义pillars: |
10 | ```bash |
11 | ~]# salt 'minion-one' pillar.items #查看全部pillars的值 |
12 | ~]# salt 'minion-one' pillar.item role #查看单个数据的命令 |
- 远程命令执行模块
1
~]# salt '*' cmd.run "ps aux|wc -l"
2
~]# salt '*' cmd.run_all "ps aux|wc -l" #更详细的信息
- 安装包管理
1
~]# salt '*' pkg.install "httpd"
2
~]# salt '*' pkg.version "httpd"
3
~]# salt '*' pkg.remove "httpd"
- 管理服务模块
1
~]# salt '*' service.status httpd
2
~]# salt '*' service.start httpd
3
~]# salt '*' service.stop httpd
- 文件管理模块
1
~]# salt '*' file.stats /etc/fstab
2
~]# salt '*' file.chown /etc/fstab root root
- 用户管理模块
1
~]# salt '*' user.add name <uid> <gid> <groups> <home> <shell>
2
~]# salt '*' user.delete name
3
~}# salt '*' user.info root
state模块
1 | ~]# salt '*' pkg.install "httpd" |
2 | state状态 |
3 | ~]# vim apache.sls |
4 | install_httpd; |
5 | pkg.installed: |
6 | - name: httpd |
7 | ~]# salt '*' state.sls apache |
执行模块和状态模块,之间的主要区别,执行模块的是过程式的,而状态模块则是描述性的,即执行模块在目标主机执行相同的逻辑和指令,而描述模块只是进行必要的工作,使minion上达到指定的状态。
常用的状态模块用法
1 | ~]# salt '*' sys.list_state_modules #列出所有状态模块 |
2 | ~]# salt '*' sys.list_state_functions pkg #列出指定模块的函数用法 |
3 | ~]# salt '*' sys.state_doc file.managed |
file模块
下发文件1
/etc/fstab
2
file.managed:
3
- source:
4
- salt: ///etc/fstab
5
- user: root
6
- group: root
7
- mode: 644
创建目录
1
/ops/foo/bar:
2
file.directory:
3
- user: root
4
- group: root
5
- mode: 755
6
- makedirs: True
建立软连接
1
/etc/grub.conf:
2
file.symlink:
3
- target: /boot/grub/grub.conf
下发整个目录
1
/opt/code/flask:
2
file.recurse:
3
- source: salt:///code/flask
4
- include_empty: True
pkg模块
软件安装1
pkgs:
2
pkg.installed:
3
- pkgs:
4
- httpd
5
- mysql-server: '=5.6'
安装rpm包
1
pkgs:
2
pkg.installed:
3
- sources:
4
- httpd: salt:///rpms/httpd.rpm
5
- mysqd: http://rpms.com/mysqld.rpm
6
- wget: ftp://frp.com/wget.rpm
7
- qax: /rpms/qax.rpm
service模块
启动redis服务1
redis:
2
service.running:
3
- enable: True
4
- reload: True
5
- watch:
6
- pkg: redis
cron模块
1
date > /tmp/crondtest:
2
cron.present:
3
- user: root
4
- minute: '*/5'
user模块
1
user.present:
2
- fullname: jusene
3
- shell: /bin/bash
4
- home: /home/jusene
5
- uid: 4000
6
- gid: 4000
7
- groups:
8
- wheel
sysctl模块
1
vm.swappiness:
2
sysctl.present:
3
- value: 0
pip模块
1
django:
2
pip.installed:
3
- name: django >= 2.0
4
- require:
5
- pkg: python-pip
使用requisites对状态进行排序
通过require指定执行顺序,通过watch指定当改变时触发,这两个可以完成却大多数的顺序控制。