自動化運維工具SaltStack(4)
目錄
1. SaltStack資料系統
SaltStack有兩大資料系統,分別是:
- Grains
- Pillar
1.1 Grains和Pillar的區別
名稱 | 儲存位置 | 資料型別 | 資料採集更新方式 | 應用 |
---|---|---|---|---|
grains | minion端 | 靜態資料 | minion啟動時收集,也可以使用saltutil.sync_grains進行重新整理 | 儲存minion基本資料。比如用於匹配minion,自身資料可以用來做資產管理cmdb等。 |
pillar | master端 | 動態資料 | 在master端定義,指定給對應的minion。可以使用saltutil.refresh_pillar進行重新整理 | 儲存master指定資料,只用指定的minion可以看到。用於敏感資料儲存。 |
2. SaltStack資料系統元件
2.1 SaltStack元件之Grains
Grains
是saltstack
記錄minion
的一些靜態資訊元件,可以簡單的理解為grains
裡面記錄著每臺minion
的一些常用的屬性,比如cpu
、記憶體、磁碟、網路資訊等,可以通過grains.items
檢視某臺minion
的grains
所有資訊,minion
的grains
minion
啟動的時候採集彙報給master
的。
grains
會在minion
程序啟動時進行載入,並快取在記憶體中。這樣salt-minion
程序無需每次操作都要重新檢索系統來獲取grain
,提升了minion
效能。
grains的定義:
- 通過minion配置檔案定義
- 通過grains相關模組定義
- 通過python指令碼定義
Grains的功能:
- 收集資產資訊
Grains應用場景:
- 資訊查詢
- 在命令列下進行目標匹配
- 在top file中進行目標匹配
- 在模板中進行目標匹配
關於Grain進行目標匹配可以檢視官方文件
資訊查詢
[root@node01 ~]# salt 'node02' grains.items node02: ---------- SSDs: biosreleasedate: //bios的時間 07/29/2019 biosversion: //bios的版本 6.00 cpu_flags: //cpu相關的屬性 - fpu - vme - de - pse - tsc - msr - pae - mce - cx8 - apic - sep - mtrr - pge - mca - cmov - pat - pse36 - clflush - mmx - fxsr - sse - sse2 - ss - syscall - nx - pdpe1gb - rdtscp - lm - constant_tsc - arch_perfmon - nopl - xtopology - tsc_reliable - nonstop_tsc - eagerfpu - pni - pclmulqdq - ssse3 - fma - cx16 - pcid - sse4_1 - sse4_2 - x2apic - movbe - popcnt - tsc_deadline_timer - aes - xsave - avx - f16c - rdrand - hypervisor - lahf_lm - abm - 3dnowprefetch - invpcid_single - ssbd - ibrs - ibpb - stibp - fsgsbase - tsc_adjust - bmi1 - avx2 - smep - bmi2 - invpcid - mpx - rdseed - adx - smap - clflushopt - xsaveopt - xsavec - arat - md_clear - spec_ctrl - intel_stibp - flush_l1d - arch_capabilities cpu_model: //cpu的具體型號 Intel(R) Core(TM) i5-9300H CPU @ 2.40GHz cpuarch: //cpu架構 x86_64 domain: fqdn: node02 fqdn_ip4: //ip地址 - 192.168.159.137 fqdn_ip6: - fe80::20c:29ff:feb2:1a0e gpus: |_ ---------- model: SVGA II Adapter vendor: unknown host: //主機名 node02 hwaddr_interfaces: ---------- eno16777736: 00:0c:29:b2:1a:0e lo: 00:00:00:00:00:00 id: //minion的ID node02 init: systemd ip4_interfaces: //網絡卡名 ---------- eno16777736: - 192.168.159.137 lo: - 127.0.0.1 ip6_interfaces: ---------- eno16777736: - fe80::20c:29ff:feb2:1a0e lo: - ::1 ip_interfaces: ---------- eno16777736: - 192.168.159.137 - fe80::20c:29ff:feb2:1a0e lo: - 127.0.0.1 - ::1 ipv4: - 127.0.0.1 - 192.168.159.137 ipv6: - ::1 - fe80::20c:29ff:feb2:1a0e kernel: Linux kernelrelease: 3.10.0-1127.18.2.el7.x86_64 locale_info: ---------- defaultencoding: UTF-8 defaultlanguage: zh_CN detectedencoding: UTF-8 localhost: node02 lsb_distrib_id: CentOS Linux machine_id: 7ea8cf102d5b4482ab28d073081b860f manufacturer: VMware, Inc. master: 192.168.159.136 mdadm: mem_total: 972 nodename: node02 num_cpus: 1 num_gpus: 1 os: CentOS os_family: RedHat osarch: x86_64 oscodename: Core osfinger: CentOS Linux-7 osfullname: CentOS Linux osmajorrelease: 7 osrelease: 7.8.2003 osrelease_info: - 7 - 8 - 2003 path: /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin productname: VMware Virtual Platform ps: ps -efH pythonexecutable: /usr/bin/python pythonpath: - /usr/bin - /usr/lib64/python27.zip - /usr/lib64/python2.7 - /usr/lib64/python2.7/plat-linux2 - /usr/lib64/python2.7/lib-tk - /usr/lib64/python2.7/lib-old - /usr/lib64/python2.7/lib-dynload - /usr/lib64/python2.7/site-packages - /usr/lib/python2.7/site-packages pythonversion: - 2 - 7 - 5 - final - 0 saltpath: /usr/lib/python2.7/site-packages/salt saltversion: 2015.5.10 saltversioninfo: - 2015 - 5 - 10 - 0 selinux: ---------- enabled: False enforced: Disabled serialnumber: VMware-56 4d 95 64 04 8e bc 7e-03 a7 8a 6d ba b2 1a 0e server_id: 711731264 shell: /bin/sh systemd: ---------- features: +PAM +AUDIT +SELINUX +IMA -APPARMOR +SMACK +SYSVINIT +UTMP +LIBCRYPTSETUP +GCRYPT +GNUTLS +ACL +XZ +LZ4 -SECCOMP +BLKID +ELFUTILS +KMOD +IDN version: 219 virtual: VMware zmqversion: 4.1.4 //只查詢所有的grains的key [root@node01 ~]# salt 'node02' grains.ls node02: - SSDs - biosreleasedate - biosversion - cpu_flags - cpu_model - cpuarch - domain - fqdn - fqdn_ip4 - fqdn_ip6 - gpus - host - hwaddr_interfaces - id - init - ip4_interfaces - ip6_interfaces - ip_interfaces - ipv4 - ipv6 - kernel - kernelrelease - locale_info - localhost - lsb_distrib_id - machine_id - manufacturer - master - mdadm - mem_total - nodename - num_cpus - num_gpus - os - os_family - osarch - oscodename - osfinger - osfullname - osmajorrelease - osrelease - osrelease_info - path - productname - ps - pythonexecutable - pythonpath - pythonversion - saltpath - saltversion - saltversioninfo - selinux - serialnumber - server_id - shell - systemd - virtual - zmqversion //查詢某個key的值,比如想獲取ip地址 [root@node01 ~]# salt 'node02' grains.get iqdn_ip4 node02: - 192.168.159.137 [root@node01 ~]# salt 'node02' grains.get ip4_interfaces node02: ---------- eno16777736: - 192.168.159.137 lo: - 127.0.0.1 - [root@node01 ~]# salt 'node02' grains.get ip4_interfaces:eno16777736 node02: - 192.168.159.137
目標匹配
用Grains
來匹配minion
:
[root@node01 ~]# salt -G 'os:CentOS' cmd.run 'uptime'
node01:
02:26:33 up 2:51, 1 user, load average: 0.00, 0.01, 0.05
node02:
18:33:32 up 2:51, 1 user, load average: 0.00, 0.01, 0.05
在top file裡面使用Grains:
[root@node01 ~]# vim /srv/salt/base/top.sls
[root@node01 ~]#
[root@node01 ~]# cat /srv/salt/base/top.sls
base:
'os:CentOS':
- match: grain
- web.apache.apache
自定義Grains的兩種方法
- minion配置檔案,在配置檔案中搜索grains
- 在/etc/salt下生成一個grains檔案,在此檔案中定義(推薦方式)
[root@node01 ~]# vim /etc/salt/grains
[root@node01 ~]# cat /etc/salt/grains
test-grains: node1
[root@node01 ~]# systemctl restart salt-minion
[root@node01 ~]# salt '*' grains.get test-grains
node02:
node01:
node1
不重啟的情況下自定義Grains
:
[root@node01 ~]# vim /etc/salt/grains
[root@node01 ~]# cat /etc/salt/grains
test-grains: node2
longnian: dragonyear
[root@node01 ~]# salt '*' saltutil.sync_grains
node01:
node02:
[root@node01 ~]# salt '*' saltutil.get longnian
node02:
dragonyear
node01:
2.2 SaltStack元件之Pillar
Pillar是資料管理中心,主要作用就是儲存和定義配置管理中需要的一些資料,比如軟體版本號、使用者密碼等資訊,格式與grains類似,都是YAML格式。
Pillar也是Salt用來分發全域性變數到所有minions的一個介面。安全起見,有些資料是不可以共享出來的,需要指定。比如高度敏感的資料:通過pillar傳輸的資料會保證只向選定的minions展現,這使得pillar可以作為Salt中管理安全資訊的引擎,比如加密的key和密碼。
預設Base環境下Pillar的工作目錄在/srv/pillar目錄下。若你想定義多個環境不同的Pillar工作目錄,只需要修改此處配置檔案即可。
Pillar的特點:
- 可以給指定的minion定義它需要的資料
- 只有指定的人才能看到定義的資料
- 在master配置檔案裡設定
//檢視pillar的資訊
[root@node01 ~]# salt '*' pillar.items
node01:
----------
node02:
----------
預設pillar
是沒有任何資訊的,如果想檢視資訊,需要在 master 配置檔案上把 pillar_opts
的註釋取消,並將其值設為 True。
[root@node01 ~]# vim /etc/salt/master
..........
//修改False為True
pillar_opts: True
//重啟master並檢視pillar的資訊
[root@node01 ~]# systemctl restart salt-master
[root@node01 ~]# salt '*' pillar.items
node01:
----------
master:
----------
__role:
master
auth_mode:
1
auto_accept:
False
cache_sreqs:
True
cachedir:
/var/cache/salt/master
cli_summary:
False
client_acl:
----------
client_acl_blacklist:
----------
cluster_masters:
cluster_mode:
paranoid
con_cache:
False
conf_file:
/etc/salt/master
config_dir:
/etc/salt
cython_enable:
False
daemon:
False
default_include:
master.d/*.conf
enable_gpu_grains:
False
enforce_mine_cache:
False
enumerate_proxy_minions:
False
environment:
None
event_return:
event_return_blacklist:
event_return_queue:
0
event_return_whitelist:
ext_job_cache:
ext_pillar:
extension_modules:
/var/cache/salt/extmods
external_auth:
----------
failhard:
False
file_buffer_size:
1048576
file_client:
local
file_ignore_glob:
None
file_ignore_regex:
None
file_recv:
False
file_recv_max_size:
100
file_roots:
----------
base:
- /srv/salt/base
prod:
- /srv/salt/prod
test:
- /srv/salt/test
..........
pillar自定義資料
在master的配置檔案裡找pillar_roots可以看到其存放pillar的位置
[root@node01 ~]# vim /etc/salt/master
..........
pillar_roots:
base:
- /srv/pillar/base
prod:
- /srv/pillar/prod
test:
- /srv/pillar/test
[root@node01 ~]# mkdir -p /srv/pillar/{base,prod,test}
[root@node01 ~]# tree /srv/pillar/
/srv/pillar/
├── base
├── prod
└── test
3 directories, 0 files
[root@node01 ~]# systemctl restart salt-master
[root@node01 ~]#
[root@node01 ~]# vim /srv/pillar/base/apache.sls
[root@node01 ~]# cat /srv/pillar/base/apache.sls
{% if grains['os'] == 'CentOS' %}
apache: httpd
{% elif grains['os'] == 'RedHat' %}
apache: apache2
{% endif %}
[root@node01 ~]# vim /srv/pillar/base/top.sls
[root@node01 ~]# cat /srv/pillar/base/top.sls
base:
'node02': //指定目標
- apache //引用apache.sls或apache/init.sls
//這個top.sls檔案的意思表示的是node02這臺主機的base環境能夠訪問到apache這個pillar
[root@node01 ~]# salt '*' pillar.items
node01:
----------
master:
----------
__role:
master
auth_mode:
1
auto_accept:
False
cache_sreqs:
True
..........
node02:
----------
apache:
httpd
master:
----------
..........
//在salt下修改apache的狀態檔案,引用pillar的資料
[root@node01 ~]# vim /srv/salt/base/web/apache/apache.sls
[root@node01 ~]# cat /srv/salt/base/web/apache/apache.sls
apache-install:
pkg.installed:
- name: {{ pillar['apache'] }}
apache-service:
service.running:
- name: {{ pillar['apache'] }}
- enable: True
//執行高階狀態檔案
[root@node01 ~]# salt 'node02' state.highstate
node02:
----------
ID: apache-install
Function: pkg.installed
Name: httpd
Result: True
Comment: All specified packages are already installed
Started: 19:26:16.648756
Duration: 1497.248 ms
Changes:
----------
ID: apache-service
Function: service.running
Name: httpd
Result: True
Comment: The service httpd is already running
Started: 19:26:16.648756
Duration: 158.657 ms
Changes:
Summary for 192.168.69.137
------------
Succeeded: 2
Failed: 0
------------
Total states run: 2
Total run time: 23.254 s