死磕salt系列-salt grains pillar 配置
grains 和 pillar 对比:
- Grains:存放静态数据,主要存储客户端的主机信息,重启grains会刷新。
- Pillar: 处理敏感数据, 处理差异性的文件。
Grains数据系统
salt '*' grains.items ###列出服务器的详细参数
只查看OS的信息:
shell> salt 'linux-node2' grains.item os
linux-node2:
----------
os:
CentOS
shell> salt 'linux-node2' grains.get os
linux-node2:
CentOS
```
```shell
shell> salt 'linux-node2' grains.get ip_interfaces:eth0
linux-node2:
- 192.168.56.12
- fe80::250:56ff:fe30:8f96
列出所有信息的名称:
shell> salt '*' grains.ls
minion.saltstack.com:
- SSDs
- biosreleasedate
- biosversion
- cpu_flags
- cpu_model
- cpuarch
- domain
- fqdn
- fqdn_ip4
- fqdn_ip6
省略部分内容。。。。。。。。
在服务端测试:-G 表示匹配grains :
shell> salt -G 'env:prod' test.ping
minion.saltstack.com:
True
shell> salt -G 'os:CentOS' cmd.run 'w'
linux-node2:
03:35:48 up 9:50, 2 users, load average: 0.00, 0.00, 0.00
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
niu pts/0 10.0.2.1 02:02 1:10m 0.00s 0.00s -bash
niu pts/1 10.0.2.1 02:14 1:21m 0.00s 0.00s -bash
在客户端自定义grains:
shell> vim /etc/salt/minion
grains:
roles: nginx
env: prod
使用命令行设置minion端的grains。
## 给logstash4服务器设置一个elastic_url的grains值
salt 'linux-node2' grains.setval elastic_url 'http://192.168.56.12:9200'
## 查看elastic_url的值
salt 'linux-node2' grains.item elastic_url
## 重新给elastic_url赋值
salt 'linux-node2' grains.setval elastic_url 'http://192.168.56.12:9200'
## 查看新赋值是否生效
salt 'linux-node2' grains.item elastic_url
设置成功后,minion会在 /etc/minion/grains 增加一行配置文件
vim /etc/salt/grains
elastic_url: http://192.168.56.12:9200
在top.sls中调用grains的方法:
[root@linux-node1 salt]# vim top.sls
base:
'web:nginx':
- match: grain
- apache
在服务器端测试:
shell> salt -G 'cloud:openstack' test.ping
linux-node2:
True
在服务端输入如下命令可以刷新:(客户端更改后不用重启)
shell> salt '*' saltutil.sync_grains
在配置文件中调用
nginx:
pkg:
- installed
file.managed:
- source: salt://nginx/nginx.conf
- name: /etc/nginx/nginx.conf
- user: root
- group: root
- mode: 644
- template: jinja
service.running:
- enable: True
- reload: True
- watch:
- file: /etc/nginx/nginx.conf
- pkg: nginx
grains优先级:/etc/salt/minion.d/grains.conf (或/etc/salt/minion) > /etc/salt/grains配置中的优先级。
grains.filter_by 用法
salt.modules.grains.filter_by(lookup_dict, grain='os_family', merge=None, default='default', base=None)
lookup_dict-- 自定义列表值的字典。
grain-- 我们要从客户端grains到那个key来区分环境,这就要说明下,默认值:os_family。
merge-- 对lookup_dict
扩展新的字典。
default-- 默认值,默认选择哪个key。
base-- 选择lookup_dict合并在这最后合并字典合并。这允许每个案件的共同的价值观被收集在基地和粮食选择字典和词典被合并。默认设置。
Pillar 数据系统
pillar 常用命令列表
salt '*' saltutil.refresh_pillar
: 刷新目标用户的pillar信息。salt '*' pillar.items
: 查看目标用户的pillar值。
第一步: 启动pillar功能
vim /etc/salt/master
pillar_opts: True
##piller 默认参数的开启。
第二步:在master文件中配置pillar
文件存放的位置
vim /etc/salt/master
pillar_roots:
base:
- /srv/salt/pillar
第三步:开始编写pillar文件
shell> mkdir /srv/salt/pillar
shell> vim /srv/salt/pillar/top.sls
base:
'*':
- init.rsyslog
shell> mkdir init
shell> vim init/rsyslog.sls
pkgs:
{% if grains['os'] == 'CentOS' %}
apache: httpd
{% elif grains['os'] == 'Debian' %}
apache: apache2
{% endif %}
刷新一下配置:
[root@centos6 init]# salt '*' saltutil.refresh_pillar
linux-node2:
True
[root@linux-node1 pillar]# salt '*' pillar.items
第四步 使用pillar
- 使用索引调用:
pillar['pkgs']['apache']
- 使用get方法调用:
pillar.get('users', {})
索引的方式:
/srv/salt/apache/init.sls:
syslog:
pkg.installed:
- name: {{ pillar['pkgs']['apache'] }}
get的方式, 可以在state file中设置默认值,
/srv/salt/apache/init.sls:
apache:
pkg.installed:
- name: {{ salt['pillar.get']('pkgs:apache', 'httpd') }}
使用grains pillar 动态生成Nginx配置文件
user nginx;
worker_processes {{ grains['num_cpus'] }};
{% if grains['num_cpus'] == 2 %}
worker_cpu_affinity 01 10;
{% elif grains['num_cpus'] == 4 %}
worker_cpu_affinity 1000 0100 0010 0001;
{% elif grains['num_cpus'] >= 8 %}
worker_cpu_affinity 00000001 00000010 00000100 00001000 00010000 00100000 01000000 10000000;
{% else %}
worker_cpu_affinity 1000 0100 0010 0001;
{% endif %}
worker_rlimit_nofile {{ grains['max_open_file'] }};
error_log /var/log/nginx/error.log;
pid /var/run/nginx.pid;
events {
worker_connections {{ grains['max_open_file'] }};
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
sendfile on;
tcp_nopush on;
keepalive_timeout 65;
gzip on;
include /etc/nginx/conf.d/*.conf;
server {
listen 80 default_server;
server_name _;
access_log logs/host.access.log main;
location / {
root {{ pillar['nginx']['root'] }};
index index.html index.htm;
}
error_page 404 /404.html;
location = /404.html {
root /usr/share/nginx/html;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
}
}