saltstack之grains与pillar讲解(3)
一、grains简介
- Grains是SaltStack的一个组件,存放在saltstack的minion端
- 当salt-minion启动时会把收集到的数据静态存放在Grains当中,只有当minion重启时才会进行数据的更新
- 由于grains是静态数据,因此不推荐经常求修改它。
- 应用场景:
- 信息查询,可用作CMDB
- 在target中使用,匹配minion
- 在state系统中使用,匹配管理模块
二、grains中常用指令
1.grians查看
[root@node1 nginx]# salt node2 grains.ls | wc -l #查看有多少个
78
[root@node1 nginx]# salt node2 grains.item ipv4 #具体显示每一个
node2:----------ipv4:- 127.0.0.1- 172.25.7.132
[root@node1 nginx]# salt node2 grains.item fqdn
node2:----------fqdn:node2
[root@node1 nginx]# salt node2 grains.ls #所有的列出
2.grains的添加
如果grains不够用,有两种方法添加grains:
(1)在minion文件里,添加完需要重启服务。以node2为例:
vim /etc/salt/minion
[root@node2 salt]# systemctl restart salt-minion
(2)在/etc/salt/里,新建grains ,以node3为例:
[root@node3 salt]# vim grains
hahaha: nginx
[root@node1 nginx]# salt node3 saltutil.sync_grains #在master同步一下
node3:
[root@node1 nginx]# salt node3 grains.item hahaha
node3:
----------
hahaha:
nginx
3)在salt-master端建立_grains目录:
[root@node1 salt]# pwd
/srv/salt
[root@node1 salt]# mkdir _grains
[root@node1 salt]# cd _grains/
[root@node1 _grains]# vim my_grain.pydef my_grain():grains = {}grains['salt'] = 'stack'grains['hello'] = 'world'return grains
[root@node1 _grains]# salt '*' saltutil.sync_grains #同步到所有minion里
node2:
node3:
[root@node1 _grains]# salt '*' grains.item salt
node3:----------salt:stack
node2:----------salt:stack
3.grains,在target中匹配minion:
[root@node1 _grains]# salt -G hahaha:nginx cmd.run hostname
node3:node3
[root@node1 _grains]# salt -G roles:apache cmd.run hostname
node2:node2
[root@node1 _grains]# salt -G salt:stack cmd.run hostname
node2:node2
node3:node3
4.在top文件中匹配
[root@node1 salt]# ls
apache _grains _modules nginx top.sls
[root@node1 salt]# vim top.sls
base:'roles:apache':- match: grain- apache'hahaha:nginx':- match: grain- nginx
[root@node1 salt]# salt '*' state.highstate #高级模式,自动读取top.sls文件
三、pillar简介
- pillar和grains一样也是一个数据系统,但是应用场景不同
- pillar是将信息动态的存放在master端,主要存放私密,敏感信息(如用户密码等),而且可以制定某一个minion才可以看到对应的信息
- pillar更加适合在配置管理中运用
1.pillar的默认目录是在/srv/pillar,若没此目录,则需创建。
[root@node1 pillar]# pwd
/srv/pillar
[root@node1 pillar]# vim web.sls{% if grains['fqdn'] == 'node3' %}webserver: jj{% elif grains['fqdn'] == 'node2' %}webserver: kk{% endif %}port: 80
[root@node1 pillar]# vim top.slsbase:'*':- web
[root@node1 pillar]# salt '*' pillar.items
node2:----------port:80webserver:kk
node3:----------port:80webserver:jj
刷新pillar数据:
- [root@node1 pillar]# salt ‘*’ saltutil.refresh_pillar
查询pillar数据:
- salt ‘*’ pillar.items
- salt ‘*’ grains.item roles
2.pillar数据匹配
[root@node1 pillar]# cat /srv/pillar/web.sls
{% if grains['fqdn'] == 'node3' %}
webserver: nginx
{% elif grains['fqdn'] == 'node2' %}
webserver: httpd
{% endif %}
port: 80[root@node1 apache]# vim /srv/salt/apache/init.sls
install-apache:pkg.installed:- pkgs:- {{ pillar['webserver'] }}- httpd-tools- phpservice.running:- name: {{ pillar['webserver'] }}- enable: True- watch:- file: /etc/httpd/conf/httpd.conf
/etc/httpd/conf/httpd.conf:file.managed:- source: salt://apache/httpd.conf
四、Jinja模版
- Jinja是一种基于python 的模板引擎,在SLS文件里可以直接使用jinja 模版来做一些操作
- 通过jinaja模版可以为不同服务器定义各自的容量
- 两种分割符:{%…%}和{{…}},前者用于执行诸如for循环或赋值的语句,后者可以把表达式的结果打印模版上。通俗的说就是赋值和引用。
1.jina最基本的用法控制结构包装条件:
[root@node1 salt]# vim /srv/salt/test.sls
/mnt/testfile:file.append:{% if grains['fqdn'] == 'node2' %}- text: node3 #先是node2执行一次,改为node3,node4再执行一次。同样的内容不变,不同的内容追加- text: ndoe4{% elif grains['fqdn'] == 'node3' %}- text: node3{% endif %}
[root@node1 salt]# salt '*' state.sls test
[root@node2 salt]# cat /mnt/testfile
node2
nod3
ndoe4
[root@node3 salt]# cat /mnt/testfile
node3
2.jinja在普通模版中的使用
[root@node1 apache]# pwd
/srv/salt/apache
[root@node1 apache]# vim httpd.conf #见下图,将listen,引用端口
[root@node1 apache]# vim init.sls
install-apache:pkg.installed:- pkgs:- {{ pillar['webserver'] }}- httpd-tools- phpservice.running:- name: {{ pillar['webserver'] }}- enable: True- watch:- file: /etc/httpd/conf/httpd.conffile.managed:- source: salt://apache/httpd.conf- name: /etc/httpd/conf/httpd.conf- template: jinja- context:port: 8080
[root@node1 apache]# salt node2 state.sls apache
将配置文件中的端口改为变量引用:
执行成功
在node2查看端口:
3.import方式,可在state文件之间共享
定义变量文件:
vim lib.sls{% set port = 80 %}
导入模版文件:
vim httpd.conf{% from 'lib.sls' import port %}Listen {{ port }}[root@node1 salt]# vim lib.sls{% set port = 80 %}[root@node1 salt]# vim apache/init.sls
install-apache:pkg.installed:- pkgs:- {{ pillar['webserver'] }}- httpd-tools- phpservice.running:- name: {{ pillar['webserver'] }}- enable: True- watch:- file: /etc/httpd/conf/httpd.conffile.managed:- source: salt://apache/httpd.conf- name: /etc/httpd/conf/httpd.conf- template: jinja- context:port: 8080
[root@node1 salt]# vim apache/httpd.conf
[root@node1 salt]# salt node2 state.sls apache
4.变量,grains引用:
直接引用grains变量:
Listen {{ grains['ipv4'][1] }}直接引用pillar变量:
Listen {{ pillar['port']}}在state文件中引用:- template: jinja- content:bind: {{ pillar['port'] }}
[root@node1 salt]# vim apache/init.sls
install-apache:pkg.installed:- pkgs:- {{ pillar['webserver'] }}- httpd-tools- phpservice.running:- name: {{ pillar['webserver'] }}- enable: True- watch:- file: /etc/httpd/conf/httpd.conffile.managed:- source: salt://apache/httpd.conf- name: /etc/httpd/conf/httpd.conf- template: jinja- context:port: 8080bind: {{ grains['ipv4'][1] }} #file.managed,
[root@node1 salt]# vim apache/httpd.conf
[root@node1 salt]# salt node2 state.sls apache
[root@node2 salt]# vim /etc/httpd/conf/httpd.conf
也可直接将变量直接写进httpd.conf里:
5.用pillar安装keeplived
[root@node1 salt]# pwd
/srv/salt
[root@node1 salt]# mkdir keepalived
[root@node1 keepalived]# vim init.sls #首先安装keeplived,获取keepalived.conf文件
install-keepalived:pkg.installed:- name: keepalived
[root@node1 keepalived]# vim init.sls
[root@node1 keepalived]# salt '*' state.sls keepalived
[root@node1 keepalived]# scp node2:/etc/keepalived/keepalived.conf .
[root@node1 keepalived]# vim keepalived.conf #编辑配置文件,写入变量! Configuration File for keepalivedglobal_defs {notification_email {root@localhost}notification_email_from keepalived@localhostsmtp_server 127.0.0.1smtp_connect_timeout 30router_id LVS_DEVELvrrp_skip_check_adv_addrvrrp_strictvrrp_garp_interval 0vrrp_gna_interval 0}vrrp_instance VI_1 {state {{ STATE }} #变量interface eth0virtual_router_id 51priority {{ PRI }} #优先级变量advert_int 1authentication {auth_type PASSauth_pass 1111}virtual_ipaddress {{{ VIP }} #VIP变量}}[root@node1 keepalived]# vim init.sls install-keepalived:pkg.installed:- name: keepalivedfile.managed:- name: /etc/keepalived/keepalived.conf- source: salt://keepalived/keepalived.conf- template: jinja- context:STATE: {{ pillar['state'] }}PRI: {{ pillar['pri'] }}VIP: {{ pillar['vip'] }}service.running:- name: keepalived- watch:- file: /etc/keepalived/keepalived.conf
[root@node1 keepalived]# salt '*' state.sls keepalived
执行成功,node2上查看:
五、Job管理
master在下发指令任务时,会附带上产生的jid。
minion在接受指令开始执行时,会在本地的/var/cache/salt/minion/pron目录下产生该jid命名的文件,用于在执行过程中master查看当前任务的执行情况。
指令执行完毕将结果传送给master后,删除该临时文件
job缓存默认保存24小时
vim /etc/salt/master
keep_jobs:24master端Job缓存目录
/var/cache/salt/master/jobs
列出当前maser jobs cache中所有job
[root@node1 salt]# salt-run jobs.list_jobs
20200314023346224743:----------Arguments:Function:test.pinhStartTime:2020, Mar 14 02:33:46.224743Target:*Target-type:globUser:root..... 等等
查看某个jid的详细信息:
[root@node1 salt]# salt-run jobs.lookup_jid 20200314023348809486
node2:True
node3:True
将master收集的jid都传到数据库里:
在node1上安装 mariadb-server和MySQL-python
[root@node1 keepalived]# vim /etc/salt/mastermaster_job_cache: mysqlmysql.host: 'localhost'mysql.user: 'salt'mysql.pass: 'salt'mysql.db: 'salt'mysql.port: 3306
[root@node1 ~]# systemctl restart salt-master #重启服务
[root@node1 keepalived]# yum install -y mariadb-server MySQL-python
[root@node1 keepalived]# systemctl start mariadb #开启服务
[root@node1 ~]# vim salt.sql
mysql_secure_installation #安全初始化
[root@node1 ~]# mysql < salt.sql #导入数据模版
[root@node1 ~]# mysql
在命令行运行指令:
[root@node1 salt]# salt ‘’ test.ping
[root@node1 salt]# salt '’ state.sls keepalived
再次进入数据库查看,可看到jid信息:
六、salt-ssh 与salt-syndic
1.salt-ssh
不需要在minion端装什么软件,之前在node2上装有salt-minion,现在关闭该服务
[root@node2 ~]# systemctl stop salt-minion
[root@node1 .ssh]#yum install -y salt-ssh
若/root/.ssh/known_hosts 有node2解析,则直接可以,若没有,会询问是否连接,加-i 参数不询问。
或者在/root/.ssh建立config目录:
[root@node1 .ssh]# vim config
StrictHostKeyChecking no
则不用再输-i,没有询问。
2. salt-syndic
salt-syndic其实就是个代理,隔离master与minion,syndic必须运行在master上,再连接到另一个topmaster上。Topmaster下发的状态需要通过syndic传递给下级master,minion传递给master的数据也是有syndic传递给topmaster。
topmaster并不知道有多少个minion,syndic与topmaster的fie_roots和pillar_roots目录要保持一致。
node1 | salt-master |
---|---|
node2 | salt-minion |
node3 | salt-minon |
node4 | salt-master,salt-syndic |
salt-master配置:[root@node1 .ssh]# yum install -y salt-syndic
[root@node1 ~]# systemctl restart salt-syndic
[root@node1 ~]# vim /etc/salt/master
[root@node1 ~]vim /etc/salt/master
syndic_master: 172.25.7.134
[root@node1 ~]# systemctl restart salt-mastertopmaster端:
[root@node4 ~]# vim /etc/salt/master
order_masters: True
[root@node4 ~]# systemctl start salt-master
七、salt-api配置
[root@node1 ~]# yum install -y salt-api #安装salt-api
[root@node1 ~]# vim /etc/salt/master.d/eauth.confexternal_auth:pam:saltapi:- .*- '@wheel'- '@runner'- '@jobs'
[root@node1 master.d]# useradd -s /sbin/nologin saltapi #建立用户
[root@node1 master.d]# passwd saltapi #修改密码
Changing password for user saltapi.
New password:
BAD PASSWORD: The password is shorter than 8 characters
Retype new password:
passwd: all authentication tokens updated successfully.
[root@node1 master.d]# vim api.conf
[root@node1 master.d]# cat api.conf rest_cherrypy:port: 8000ssl_crt: /etc/pki/tls/certs/localhost.crtssl_key: /etc/pki/tls/private/localhost.key
[root@node1 master.d]# cd /etc/pki/tls/private/
[root@node1 private]# openssl genrsa 2048 > localhost.key
Generating RSA private key, 2048 bit long modulus
.....................+++
..........................................+++
e is 65537 (0x10001)[root@node1 private]# cd ../certs/
[root@node1 certs]# make testcert
umask 77 ; \
/usr/bin/openssl req -utf8 -new -key /etc/pki/tls/private/localhost.key -x509 -days 365 -out /etc/pki/tls/certs/localhost.crt
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [XX]:cn
State or Province Name (full name) []:shanxi
Locality Name (eg, city) [Default City]:xian
Organization Name (eg, company) [Default Company Ltd]:westos
Organizational Unit Name (eg, section) []:linux
Common Name (eg, your name or your server's hostname) []:node1
Email Address []:root@123[root@node1 certs]# systemctl restart salt-master
[root@node1 certs]# systemctl start salt-api
例子:
github上的代码:https://github.com/qitan/SOMS/blob/master/deploy/saltapi.py
[root@node1 ~]# vim saltapi.py
saltstack之grains与pillar讲解(3)相关推荐
- SaltStack的Grains和Pillar
SaltStack的Grains和Pillar 标签(空格分隔): SaltStack Grains理解为除了 id之外 ,用户可以自定义的属性 下面我们通过Grains模块来设置并定义Grains信 ...
- saltstack(十):saltstack数据系统-grains和pillar
saltstack数据系统-grains和pillar https://www.cnblogs.com/shhnwangjian/p/5985868.html 1.1 granis G ...
- Saltstack数据系统Grains和Pillar(三)
Saltstack数据系统 分为Grains和Pillar 一.Grains 静态数据,当Minion启动的时候收集的MInion本地的相关信息.(包含操作系统版本.内核版本.CPU.内存.硬盘.设备 ...
- Linux之Saltstack中grains、pillar取值和jinja模板的应用
一.grains和pillar介绍 1. Grains简介 Grains是SaltStack的一个组件,存放在SaltStack的minion端.当salt-minion启动时会把收集到的数据静态存放 ...
- Saltstack数据系统——grains和pillar
一.grains 静态数据,当Minion启动的时候收集的MInion本地的相关信息.(包含操作系统版本.内核版本.CPU.内存.硬盘.设备型号等) 1.自定义grains的item [root@se ...
- saltstack之grains与pillar
grains 收集被控主机获取信息,通常静态数据,CPU,操作系统,内核,虚拟化等.... 简单函数匹配server2 [root@server1 salt]# cat top.slsbase: 'r ...
- saltstack中grains与pillar详解
一.grains 简介 Grains是SaltStack的一个组件,存放在SaltStack的minion端. 当salt-minion启动时会把收集到的数据静态存放在Grains当中,只有当mini ...
- saltstack之Grains和Pillar
grains [root@server1 salt]# salt '*' grains.items##列出所有被控主机的所有信息 [root@server1 salt]# salt -G 'cpuar ...
- SaltStack自动化运维(三)——Grains与Pillar组件
前言 Grains组件 Grains是saltstack记录minion的一些静态信息组件,可以简单的理解为grains里面记录着每台minion的一些常用的属性,比如cpu.内存.磁盘.网络信息等, ...
最新文章
- Dominating Patterns
- 【动态规划】机器分配 (ssl 1639)
- 买基金的一个很重要的知识
- 酷派起诉小米:你竟敢侵我的权?
- 2020-10-27中国大学MOOC学习进度
- 3.8 以符号常量/字面常量取代魔法数
- LGOJP1941 飞扬的小鸟
- python pos函数_从0入门Python — 4. 函数
- Unix 环境高级编程 之 理解 rws 权限
- 【抠图工具】图片、视频自动抠图(VideoMatting)
- matlab2016 win10,新手,win10电脑上面装matlab2016a还是b好呢?64位操作系统
- 下载dosbox即环境的配置
- SQL数据库置疑恢复
- CCNA上机实验_19-PPP
- sequencer和driver
- 《菩萨蛮·隔花才歇帘纤雨》
- 手动安装jenkins默认插件
- linux usb有线网卡驱动_有线网卡Linux驱动安装小记
- 为什么要用Modbus转MQTT网关?
- 【成都云计算培训机构哪家好?】