五、Salt Pillar

来源:互联网 发布:js页面初始化方法 编辑:程序博客网 时间:2024/05/17 13:41

Pillar是Salt用来分发全局变量到所有minions的一个接口

Pillar和State有什么区别了?Pillar文件里面存放的是各种数据,如:软件包名、软件版本等。而State里面存放的对匹配的minion要做的操作,如安装一个包。此外,Pillar用于存储敏感数据,这些数据只对匹配的minion有效,这一个特性对于为特定的minion存放特殊的数据十分有用。如存放一个minion的密码等。Pillar定义的数据可以被Salt其他的组件使用,如State

Pillar大致有以下场景:

  • 敏感数据
    例如ssh key,加密证书等,由于Pillar使用独立的加密session,可以确保这些敏感数据不被其他minion看到。
  • 变量
    可以在Pillar中处理平台差异性,比如针对不同的操作系统设置软件包的名字,然后在State中引用。
  • 其他任何数据
    可以在Pillar中添加任何需要用到的数据。比如定义用户和UID的对应关系,mnion的角色等。
  • 用在Targetting中
    Pillar可以用来选择minion,使用-I选项。

一、配置Pillar

Salt Master服务器维护了一个pillar_roots 设置 ,和在Salt 文件服务器上使用的file_roots结构对应。和Salt 文件服务器类似,master配置文件中的 pillar_roots 选项也是基于环境映射到目录。Pillar数据被映射到基于top文件匹配到的Minion上, top 文件是和state top文件一样的方式列出的。Salt pillar可以使用和标准的top 文件同样的匹配器类型。

0. 查看pillar模块的相关函数及用法

  • 列出pillar函数及其详细用法

    salt ‘*’ sys.doc pillar

  • 列出pillar模块的相关函数

    salt ‘*’ sys.list_functions pillar

1. 声明master Pillar
/etc/salt/master

pillar_roots:  base:    - /srv/pillar

2. 重启master
3. 创建/srv/pillar/目录

二、开始使用Pillar

1. 创建sls文件。这些文件的格式和state文件格式基本一致

以安装Apache为例

/srv/pillar/top.sls

base:  '*':    - httpd

/srv/pillar/httpd.sls

{% if grains['os'] == 'CentOS' %}apache: httpd{% elif grains['os'] == 'Debian' %}apache: apache2{% endif %}

2. 刷新Pillar 数据
在master上修改pillar文件后,需要刷新minion上的数据,刷新命令:

salt ‘*’ saltutil.refresh_pillar

3. pillar模块的常用函数
- 两种方法命令行中查看Pillar数据:

salt ‘*’ pillar.data

salt ‘*’ pillar.raw

  • pillar.items
  • pillar.item

  • pillar.get

salt ‘*’ pillar.get
备注: 这里的key指的是字典里面的‘key’,根据SLS文件的不同,key的深度可能也不通。如有的字典里面嵌套了其他的字典。

4. 在State组件中使用Pillar

前面提过Pillar数据可以用于其他组件,比如State SLS文件中。首先明白一点,Pillar数据解析后是以字典的形式存在的,因此,引用Pillar数据的过程,实际上就是从字典里面读取数据的过程。

在State SLS文件中有两中方法使用Pillar数据:

pillar[‘apache’]

pillar.get(‘apache’,{})

  • 配置State SLS文件

/srv/salt/top.sls

base:  '*':    - httpd

/srv/salt/httpd.sls

httpd:  pkg:    - installed    - name: {{ pillar.get('apache', {})  }}

执行state命令:

salt ‘*’ state.sls httpd

5. pillar列表

以添加多个用户为例

  • pillar文件

/srv/pillar/top

base:  '*':    - users

/srv/pillar/users/init.sls

users:  user1: 1000  user2: 1001  user3: 1002  user4: 1003
  • state文件

/srv/salt/top.sls

base:  '*':    - users

/srv/salt/users/init.sls

{% for user,uid in pillar.get('users',{}).items() %}{{  user }}:  user.present:    - uid: {{ uid }}{% endfor %}

注意: 1. 这里的sls文件用了Jinja模板;2. for user,uid in pillar.get(‘users’,{}).items() 语句会取出user和对应的uid

备注:注意观察下面的pillar文件
/srv/pillar/top.sls

base:  '*':    - sshd    - httpd

/srv/pillar/sshd.sls

service:  ssh_service: sshd

/srv/pillar/httpd.sls

service:  httpd_name: httpd

观察此时的pillar数据值

root@master:/srv/pillar# salt '*' pillar.data192.168.159.136:    ----------    service:        ----------        httpd_service:            httpd        sshd_service:            sshd

结论: 即使是两个不同的pillar sls文件,如果字典的主key一致,则不通sls文件的的数据都会=将解析后放入主字典下

0 0