死磕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;  
        }  
    }  
} 
posted @ 2018-04-08 11:17  biglittleant  阅读(1464)  评论(0编辑  收藏  举报