SaltStack ---Grains的应用
1 Grains概述
Grains是SaltStack的一个组件,存放在SaltStack的minion端。
当salt-minion启动时会把收集到的数据静态存放在Grains当中,只有当minion重启时才会进行数据的更新。
由于grains是静态数据,因此不推荐经常去修改它。
1.1 Grains的应用场景
- Grains可以在state系统中使用,用于配置管理模块。
- Grains可以在target中使用,用来匹配minion,比如匹配操作系统,使用-G选项
- Grains可以用于信息查询,Grains保存着收集到的客户端的详细信息。
2 Grains的应用示例
2.1 Grains信息查询
- 用于查询minion端的IP、FQDN等信息
- 查看server2中grains每一项的值:salt server2 grains.items
- 取单项的值
salt server2 grains.item ipv4 ##取server2ip地址
salt server2 grains.item fqdn ##取server2主机名
2.2 自定义grains项
(1) 在/etc/salt/grains中定义(master):vim /etc/salt/grains
roles:
- nginx
- 同步数据:salt server3 saltutil.sync_grains
- 查询自定义项:salt server3 grains.item roles
(2) 在/etc/salt/minion中定义(minion):vim /etc/salt/minion
(3) 重启salt-minion,否则数据不会更新:
systemctl restart salt-minion
- 测试server2可以正常连接:
salt server2 test.ping
(4) 查询自定义项:salt server2 grains.item roles
2.3 编写grains模块
(1) 在salt-master端创建_grains目录:mkdir /srv/salt/_grains/
(2) 编辑模块文件(python):vim /srv/salt/_grains/mygrains.py
def my_grain():
grains = {}
grains['salt'] = 'stack'
grains['hello'] = 'world'
return grains
(3) 同步: salt '*' saltutil.sync_grains
(4) 测试
salt '*' grains.item hello ##查询模块中的hello item
salt '*' grains.item salt ##查询模块中的salt item
- 在sale-minion端查看_grains模块已经同步
2.4 grains匹配运用
(1) 在target中匹配minion
salt -G roles:apache cmd.run hostname
salt -G roles:nginx cmd.run hostname
salt -G salt:stack cmd.run hostname
salt -G hello:world cmd.run hostname
(2) 在top文件中匹配
- vim /srv/salt/top.sls
base:
'roles:apache':
- match: grain
- apache
'roles:nginx':
- match: grain
- nginx
- 编辑apache的sls文件:
vim /srv/salt/apache/init.sls
apache:
pkg.installed:
- pkgs:
- httpd
- php
file.managed:
- source: salt://apache/files/index.html
- name: /var/www/html/index.html
service.running:
- name: httpd
- enable: true
- watch:
- file: /etc/httpd/conf/httpd.conf
/etc/httpd/conf/httpd.conf:
file.managed:
- source: salt://apache/files/httpd.conf
- 编辑nginx的sls文件:
vim /srv/salt/nginx/init.sls
nginx:
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 --with-threads --with-file-aio --with-http_stub_status_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:
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 '*' state.highstate
server2成功安装并启动了appache服务
server2成功安装并启动了nginx服务
在server3只安装nginx,不启动服务(将安装的sls文件写进init.sls)
cd /srv/salt/nginx
cp init.sls install.sls
- 编辑init.sls文件:
vim /srv/salt/nginx/init.sls
- 编辑init.sls文件:
vim /srv/salt/nginx/install.sls
- 测试:
salt server3 state.sls nginx.install