1.远程执行shell命令
1. 1Salt命令由三个主要部分构成:
salt '<target>' <function> [arguments]
target: 指定哪些minion, 默认的规则是使用glob匹配minion id.
salt '*' test.ping
Targets也可以使用正则表达式:
salt -E 'server[1-3]' test.ping
Targets也可以指定列表:
salt -L 'server2,server3' test.ping
funcation是module提供的功能,Salt内置了大量有效的functions.
salt '*' cmd.run 'uname -a'
arguments通过空格来界定参数:
salt 'server2' sys.doc pkg #查看模块文档
salt 'server2' pkg.install httpd
salt 'server2' pkg.remove httpd
server1操作:
server2查看
cat /var/log/messages
salt内置的执行模块列表:
http://docs.saltstack.cn/ref/modules/all/index.html
2.远程执行模块
1.master配置文件:
vim /etc/salt/master
file_roots:
base:
- /srv/salt
2.手动建立目录
mkdir /srv/salt
3.重启master服务:
systemctl restart salt-master
4.创建模块目录:
mkdir /srv/salt/_modules
5.编写模块文件:
vim /srv/salt/_modules/mydisk.py
def df():
return __salt__['cmd.run']('df -h')
6.同步模块:
salt server2 saltutil.sync_modules
测试:
3.配置管理
Salt 状态系统的核心是SLS,或者叫SaLt State 文件。
SLS表示系统将会是什么样的一种状态,而且是以一种很简单的格式来包含这些数据,常被叫做配置管理。
sls文件命名:
sls文件以”.sls”后缀结尾,但在调用是不用写此后缀
使用子目录来做组织是个很好的选择。
init.sls 在一个子目录里面表示引导文件,也就表示子目录本身, 所以apache/init.sls
就是表示apache
.
如果同时存在apache.sls 和 apache/init.sls,则 apache/init.sls 被忽略,apache.sls将被用来表示 apache.
3.1了解YAML语法
规则一: 缩进
Salt需要每个缩进级别由两个空格组成,不要使用tabs。
规则二: 冒号
字典的keys在YAML中的表现形式是一个以冒号结尾的字符串。
my_key: my_value
规则三: 短横杠
想要表示列表项,使用一个短横杠加一个空格。
- list_value_one
- list_value_two
准备Top文件:
vim /srv/salt/top.sls
base:
'*':
- apache
批量执行:
salt '*' state.highstate
创建一个sls文件:
3.2.sls文件编写规则
实验一:
vim /srv/salt/apache.sls
httpd: # ID声明
pkg: # 状态声明
- installed # 函数声明
指定主机执行:
salt server2 state.sls apache
实验二:安装Apache
安装apache,并将配置文件复制到minion并启用
server1操作
mkdir apache
vim init.sls #引导文件
mkdir apache/files
cp /etc/httpd/conf/http apache/files/
执行测试:
f
file.managed也可作如下定义
实验三.源码编译安装nginx
nginx.service的编写可以去nginc.com官网去下载
下载后需要自己更改一下路径
init.sls文件编写:
nginx-install:
pkg.installed:
- pkgs:
- openssl-devel
- pcre-devel
- gcc
file.managed:
- name: /mnt/nginx-1.18.0.tar.gz
- source: salt://nginx/files/nginx-1.18.0.tar.gz
cmd.run:
- name: cd /mnt/ && tar zxf nginx-1.18.0.tar.gz && cd nginx-1.18.0 && sed -i 's/CFLAGS="$CFLAGS -g"/#CFLAGS="$CFLAGS -g"/g' auto/cc/gcc && ./configure --prefix=/usr/local/nginx --with-http_ssl_module &> /dev/null && make &> /dev/null && make install &> /dev/null
- creates: /usr/local/nginx
/usr/local/nginx/conf/nginx.conf:
file.managed:
- source: salt://nginx/files/nginx.conf
nginx-service:
file.managed:
- name: /usr/lib/systemd/system/nginx.service
- source: salt://nginx/files/nginx.service
service.running:
- name: nginx
- reload: True
- enable: True
- watch:
- file: /usr/local/nginx/conf/nginx.conf
测试:
salt server5 state.sls nginx
测试成功:
在server5上已安装nginx
4.grains
4.1 grains简介
Grains是SaltStack的一个组件,存放在SaltStack的minion端。
当salt-minion启动时会把收集到的数据静态存放在Grains当中,只有当minion重启时才会进行数据的更新。
由于grains是静态数据,因此不推荐经常去修改它。
应用场景:
信息查询,可用作CMDB。
在target中使用,匹配minion。
在state系统中使用,配置管理模块。
4.2 信息查询
1.用于查询minion端的IP、FQDN等信息。
默认可用的grains:
salt '*' grains.ls
2.查看每一项的值:
salt '*' grains.items
取单项的值:
salt server3 grains.item ipv4
salt server3 grains.item fqdn
4.3自定义grains项
有三种方法:
1.在/etc/salt/minion中定义
2.在/etc/salt/grains中定义
3.在salt-master端创建_grains目录
4.3.1 在/etc/salt/minion中定义(在minion上定义)
vim /etc/salt/minion
grains:
roles:
- apache
- httpd
重启salt-minion,否则数据不会更新:
systemctl restart salt-minion
4.3.2 .在/etc/salt/grains中定义
vim /etc/salt/grains:
deployment: datacenter1
同步数据:(重要)在master几点操作
salt server5 saltutil.sync_grains
查询自定义项:
salt server3 grains.item deployment
将server5 minion的数据同步
4.3.3 在salt-master端创建_grains目录
在salt-master端创建_grains目录:
mkdir /srv/salt/_grains
vim /srv/salt/_grains/my_grain.py
def my_grain():
grains = {}
grains['roles'] = 'nginx'
grains['hello'] = 'world'
return grains
salt '*' saltutil.sync_grains #同步grains到minion端
查看:
4.4grains匹配运用
1.在target中匹配minion:
salt -G roles:apache cmd.run hostname
2.在top文件中匹配:
vim /srv/salt/top.sls
base:
'roles:apache':
- match: grain
- apache.install
让标签为apache的server安装Apache,标签为nginx的安装nginx
salt '*' state.highstate
5.pillar
5.1 pillar简介
pillar和grains一样也是一个数据系统,但是应用场景不同。
pillar是将信息动态的存放在master端,主要存放私密、敏感信息(如用户名密码等),而且可以指定某一个minion才可以看到对应的信息。
pillar更加适合在配置管理中运用。
5.2声明pillar
定义pillar基础目录:
vim /etc/salt/master
pillar_roots:
base:
- /srv/pillar
mkdir /srv/pillar
重启salt-master服务:
/etc/init.d/salt-master restart
5.3自定义pillar项
vim /srv/pillar/top.sls
base:
'*':
- packages
vim /srv/pillar/packages.sls
{% if grains['fqdn'] == 'server2' %}
package: httpd
{% elif grains['fqdn'] == 'server5' %}
package: nginx
{% endif %}
刷新pillar数据:
salt '*' saltutil.refresh_pillar
查询pillar数据:
salt '*' pillar.items
5.4pillar数据匹配
命令行中匹配:
salt -I 'roles:apache' test.ping
state系统中使用:
vim /srv/salt/apache.sls
apache:
pkg.installed:
- name: {{ pillar['package'] }}
推成功:
6.Jinja模板
6.1Jinja模板简介
Jinja是一种基于python的模板引擎,在SLS文件里可以直接使用jinja模板来做一些操作。
通过jinja模板可以为不同服务器定义各自的变量。
两种分隔符: {% … %} 和 {{ … }},前者用于执行诸如 for 循环 或赋值的语句,后者把表达式的结果打印到模板上。
6.2Jinja模板使用方式
1.Jinja最基本的用法是使用控制结构包装条件:
vim /srv/salt/test.sls
/mnt/testfile:
file.append:
{% if grains['fqdn'] == 'server2' %}
- text: server2
{% elif grains['fqdn'] == 'server3' %}
- text: server3
{% endif %}
2.Jinja在普通文件的使用:
vim /srv/salt/apache.sls
/etc/httpd/conf/httpd.conf:
file.managed:
-
source: salt://httpd.conf
-
template: jinja
-
context:
bind: 192.168.1.17
2.
vim /srv/salt/apache/files/ httpd.conf
vim /srv/pillar/packages.sls
测试:
3.常用方法:
vim /srv/salt/apache/init.sls
测试:
import方式,可在state文件之间共享:
定义变量文件:
vim lib.sls
{% set port = 80 %}
导入模板文件:
vim httpd.conf
{% from 'lib.sls' import port %}
Listen {{ prot }
测试:优先级的问题,lib.sls 覆盖了之前的端口