grains
Grains是SaltStack的一个组件,存放在SaltStack的minion端。
当salt-minion启动时会把收集到的数据静态存放在Grains当中,只有当minion重启时才会进行数据的更新。
由于grains是静态数据,因此不推荐经常去修改它。
应用场景:
信息查询,可用作CMDB。
在target中使用,匹配minion。
在state系统中使用,配置管理模块。
salt server2 grains.ls #列出所有
salt server2 grains.item ipv4 #查询
salt server2 grains.item fqdn
salt '*' grains.item fqdn
自定义grains项
方法一
server2上:
vim /etc/salt/minion
grains:
roles:
- apache
重启服务:
systemctl restart salt-minion.service
server1上:
salt server2 test.ping #重启服务会断开连接,检测是否通畅
salt server2 grains.item roles
方法二
在server3上:
vim /etc/salt/grains
roles:
- nginx
在server1上同步数据:
salt server3 saltutil.sync_grains
salt '*' grains.item roles
方法三
编写grains模块
mkdir /srv/salt/_grains
vim /srv/salt/_grains/mygrains.py
def my_grain():
grains = {}
grains['salt'] = 'stack'
grains['hello'] = 'world'
return grains
同步:
salt '*' grains.item salt #查看
salt '*' grains.item hello
salt '*' saltutil.sync_grains #同步
salt '*' grains.item hello
grains匹配应用
salt -G roles:apache cmd.run hostname
salt -G roles:apache test.ping
salt -G roles:nginx test.ping
salt -G salt:stack test.ping
给server2部署apache,给server3传输nginx
编写top脚本
vim /srv/salt/top.sls
base:
'roles:apache':
- match: grain
- apache
'roles:nginx':
- match: grain
- nginx
mkdir /srv/salt/nginx
mkdir /srv/salt/nginx/files
将nginx-1.18.0.tar.gz传到files下
cd /srv/salt/nginx
vim init.sls
nginx:
file.managed:
- source: salt://nginx/files/nginx-1.18.0.tar.gz
- name: /mnt/nginx-1.18.0.tar.gz
cd /srv/salt/apache
mv install.sls init.sls
执行:
salt '*' state.highstate #高级推
nginx
cd /srv/salt/nginx/files
vim nginx.service
[Unit]
Description=The NGINX HTTP and reverse proxy server
After=syslog.target network.target remote-fs.target nss-lookup.target
[Service]
Type=forking
PIDFile=/usr/local/nginx/logs/nginx.pid
ExecStartPre=/usr/local/nginx/sbin/nginx -t
ExecStart=/usr/local/nginx/sbin/nginx
ExecReload=/usr/local/nginx/sbin/nginx -s reload
ExecStop=/bin/kill -s QUIT $MAINPID
PrivateTmp=true
[Install]
WantedBy=multi-user.target
cd /srv/salt/nginx
vim install.sls
nginx-install:
pkg.installed:
- pkgs:
- gcc
- pcre-devel
- openssl-devel
file.managed:
- source: salt://nginx/files/nginx-1.18.0.tar.gz
- name: /mnt/nginx-1.18.0.tar.gz
cmd.run:
- name: cd /mnt && tar zxf nginx-1.18.0.tar.gz && cd nginx-1.18.0 && ./configure --prefix=/usr/local/nginx --with-http_ssl_module &> /dev/null && make &> /dev/null && make install &> /dev/null
- creates: /usr/local/nginx
cd /srv/salt/nginx
vim init.sls
include:
- nginx.install
/usr/local/nginx/conf/nginx.conf:
file.managed:
- source: salt://nginx/files/nginx.conf
nginx-service:
user.present:
- name: nginx
- shell: /sbin/nologin
- home: /usr/local/nginx
- createhome: false
file.managed:
- source: salt://nginx/files/nginx.service
- name: /usr/lib/systemd/system/nginx.service
service.running:
- name: nginx
- enable: true
- reload: true
- watch:
- file: /usr/local/nginx/conf/nginx.conf
salt server3 state.sls nginx.install #给server3安装nginx
scp server3:/usr/local/nginx/conf/nginx.conf . #文件导入后才能全局推
salt server3 state.sls nginx
也可以使用top高级推
salt -G roles:nginx test.ping
salt -G roles:apache test.ping
salt '*' state.highstate
Jinja模板
Jinja是一种基于python的模板引擎,在SLS文件里可以直接使用jinja模板来做一些操作。
通过jinja模板可以为不同服务器定义各自的变量。
两种分隔符: {% … %} 和 {{ … }},前者用于执行诸如 for 循环 或赋值的语句,后者把表达式的结果打印到模板上。
1)使用方式
vim /srv/salt/test.sls
/mnt/testfile:
file.append:
{% if grains['fqdn'] == 'server2' %}
- text: server2
{% elif grains['fqdn'] == 'server3' %}
- text: server3
{% endif %}
[root@server1 salt]# salt '*' state.sls test
[root@server2 ~]# ls /mnt
testfile
[root@server3 ~]# ls /mnt
2)引用变量
cd /srv/salt/apache
vim init.sls
file.managed:
- source: salt://apache/files/httpd.conf
- name: /etc/httpd/conf/httpd.conf
- template: jinja
- context:
port: 80
bind: {{ grains['ipv4'][-1] }}
cd /srv/salt/apache/files
vim index.html
{{ grains['os'] }} - {{ grains['fqdn'] }}
{{ NAME }}
cd /srv/salt/apache/files
vim httpd.conf
Listen {{ bind }}:{{ port }}
执行:
[root@server1 files]# salt server2 state.sls apache
效果:
server2端口改变
[root@server2 ~]# vim /etc/httpd/conf/httpd.conf