本实验是在云计算自动化运维——SaltStack详解文章基础上进行的,master-minion端已经配置好。
实验环境
主机名 | ip | 服务 |
---|---|---|
server1 | 172.25.1.1 | 服务端 salt-master |
server2 | 172.25.1.2 | 客户端 salt-minion |
server3 | 172.25.1.3 | 客户端 salt-minion |
server4 | 172.25.1.4 | 客户端 salt-minion |
Grains是saltstack的组件,用于收集salt-minion在启动时候的信息,又称为静态信息。并向master提交。注:重启便会重新收集。
可以理解为Grains记录着每台Minion的一些常用属性,比如CPU、内存、磁盘、网络信息等。
通过 grains 所获取的minion端的主机信息是固定不变的,就是在minion端主机配置发生改变时,这种数据仍然不会发生改变;除非重启服务;当然还有给命令可以刷新,使之生效,
使用salt -G :grains可以用于进行目标匹配,比如让所有的linux系统进行某个操作
Grains的四种存在形式及minion端读取grains变量的优先级:
①Core grains. #核心的grains变量,包含(minion端)系统的一些环境信息。
②在 /etc/salt/grains (minion端)自定义grains变量。
③在 /etc/salt/minion (minion主配置文件)自定义grains变量。
④在master端的 _grains 目录自定义grain,写到.py文件中,同步到minions。
注:方式③minion主配置文件 /etc/salt/minion变量定义方式
##单个变量
grains:
roles: nginx
##多个变量
grains:
roles:
- webserver
- memcache
注:方式④同步grains变量,当以下命令被执行的时候被触发
state.highstate
saltutil.sync_grains
saltutil.sync_all
把master端变量脚本my_grains.py同步到所有被控端的 /var/cache/salt/minion/extmods/grains和 /var/cache/salt/minion/files/base/_grains两个目录下。前者是最终的存放目录,而后者是临时存放位置。同时在前者目录中还会生成对应的python字节码文件即.pyc文件
pyc是编译过的文件,提高了查询的快速性。.pyc文件生成之后就表明这个脚本中写入的grains信息已经被被控端接收了,此时就可以通过主控端salt ‘*’ grains.item roles 来查看roles对应的值了。而这个值是通过在各个不同被控端上运行这个脚本获得而来的。
例:形式③的使用
在master端查看minion端server2主机roles变量不存在:
在server2主机上的minion端主配置文件中添加变量:
在master端查看server2主机变量roles值,此时已经存在:
例:形式④的使用
在master主机上创建 _grains 目录自定义grain,并同步到minions:
在minion端(server3)上查看同步文件并重启服务:
在master端测试变量添加是否成功:
查看变量ipv4的值是以列表形式存储的:
所以在下边文件中引用变量值时是采用列表切片方式提取的
【1】方式一:在install.sls文件中调用jinja模板,grains变量提取放在配置文件中
步骤一:编写apache安装文件install.sls,在要复制到目标主机的配置文件中调用jinja模板
vim /srv/salt/apache/install.sls
apache-install:
pkg.installed:
- pkgs:
- httpd
- httpd-tools
file.managed:
- name: /etc/httpd/conf/httpd.conf
- source: salt://apache/files/httpd.conf
- template: jinja #必须调用模版,否则会报错
service.running:
- name: httpd
- reload: true
- watch:
- file: apache-install
步骤二:在配置文件中提取ipv4变量值
vim apache/files/httpd.conf
Listen {
{
grains['ipv4'][-1] }}:8 #列表必须要切片,提取列表最后一个元素
步骤三:推送到server3主机
salt server3 state.sls apache.install
步骤四:在server3上查看配置文件
【2】方式二:在install.sls文件中调用jinja模板并定义变量承载grains变量提取值
步骤一:编写apache安装文件install.sls,在要复制到目标主机的配置文件中调用jinja模板并设置变量
vim install.sls
apache-install:
pkg.installed:
- pkgs:
- httpd
- httpd-tools
file.managed:
- name: /etc/httpd/conf/httpd.conf
- source: salt://apache/files/httpd.conf
- template: jinja
http_host: {
{
grains['ipv4'][-1]}} #定义一个变量http_host,承载ipv4列表元素。需要对列表切片.将值给变量 http_host
service.running:
- name: httpd
- reload: true
- watch:
- file: apache-install
步骤二:修改配置文件,将模板中定义的变量 http_host 写入文件
vim apache/files/httpd.conf
Listen {
{
http_host }}:8080 #监听主机:监听端口
步骤三:推送到server3主机
salt server3 state.sls apache.install
Pillar是Salt非常重要的一个组件,它用于给特定的minion定义任何你需要的数据,这些数据可以被Salt的其他组件使用。Pillar数据是与特定minion关联的,也就是说每一个minion都只能看到自己的数据,所以Pillar可以用来传递敏感数据。它跟grains的结构一样,也是一个字典格式,数据通过key/value的格式进行存储。
在Salt的设计中,Pillar使用独立的加密sessiion。可用于提供开发接口,用于在master端定义数据,然后再minion中使用,
一般传输敏感的数据,例如ssh key,加密证书等。
pillar和states建立方式类似,由sls文件组成,有一个入口文件top.sls,通过这个文件关联其他sls文件。
默认路径在/srv/pillar,可通过/etc/salt/master里面pillar_roots:指定位置
。
存储位置:Master端
数据类型:动态数据
数据采集更新方式:在Master端定义,指定给对应的Minion,可以用saltutil.refresh_pillar刷新
应用:存储Master指定的数据,只有指定的Minion可以看到。用于敏感数据保存
特点:minion只能查看自己的pillar,无权修改
saltstack默认将主控端配置文件中的所有数据都定义到pillar中,而且对所有被控主机开放,可以通过修改/etc/salt/master配置中的pillar_opts:Ture来开启pillar功能,使用户可以使用系统自带的pillar变量数据(若不开启,master端可以自定义,不影响pillar数据使用)
,然后重启master 服务再去进行查看。
默认情况下master端自带的给minion端定义的pillar数据是看不到的:
开启pillar功能 pillar_opts:
在master端查看pillar动态数据:
为方便查看后续自定义pillar变量,在这里我们关闭系统默认定义的变量数据:
master上配置文件中定义pillar_roots,用来指定pillar的数据存储在哪个目录
默认情况下配置文件/etc/salt/master文件中存在的pillar变量定义目录的路径是/srv/pillar,可以直接去掉注释。
我使用的是文件中指明的默认目录,目录需要自己创建。
pillar变量定义在.sls文件中,有一个入口文件top.sls,通过top.sls文件关联其他变量所在的sls文件。
步骤一:在pillar默认目录中创建web.sls文件,定义动态变量。(相同变量名对应不同值)
cd /srv/pillar/ #进入pillar默认目录
vim web.sls #编写web.sls文件
{
% if grains['fqdn'] == 'server2' %}
webserver: nginx
http_port: 80
{
% elif grains['fqdn'] == 'server3' %}
webserver: httpd
http_port: 80
{
% endif %}
lb: haproxy #全局变量
注:
文件中的fdqn是grains所获取的minion端的主机名,可在master端获取:
salt '*' grains.item fqdn
步骤二:在pillar默认目录中创建top.sls文件,关联web.sls文件
vim top.sls
base:
'*':
- web
salt server2 pillar.items #查看minion端server2的pillar变量
salt server3 pillar.items #查看minion端server3的pillar变量
salt server4 pillar.items #查看minion端server4的pillar变量
步骤一:编写apache安装文件install.sls 引用上一步定义的端口变量 port
[root@server1 salt]# vim apache/install.sls
apache-install:
pkg.installed:
- pkgs:
- httpd
- httpd-tools
file.managed:
- name: /etc/httpd/conf/httpd.conf
- source: salt://apache/files/httpd.conf
- template: jinja #调用jinja模板
- context:
http_host: {
{
grains['ipv4'][-1] }} #调用grains获取的静态数据
http_port: {
{
pillar['port']}} #调用pillar自定义的动态数据
service.running:
- name: httpd
- reload: true
- watch:
- file: apache-install
步骤二:将install.sls文件中承载变量值的http_host及http_port自定义变量写进source指向的配置文件中
vim /srv/salt/apache/files/httpd.conf
42 Listen {
{
http_host }}:{
{
http_port }}
步骤三:在server3主机上进行推送,安装apache服务
salt server3 state.sls apache.install
步骤一:在/srv/salt路径下的任意位置创建变量文件,在文件中使用jinja语法定义变量。
vim /srv/salt/apache/lib.sls
{
% set http_port = '8080' %}
步骤二:在配置文件中导入变量所在文件路径
vim /srv/salt/apache/files/httpd.conf
{
% from 'apache/lib.sls' import http_port with context %} #加在配置文件第一行
步骤三:在server3主机上推送apache安装文件
salt server3 state.sls apache.install