grains和ansible的facts变量差不多,但facts是ansible管理节点动态收集的信息
而grains是记录在minion本地的静态信息 ,会被minion定期收集 ,master可以随时收集grains信息,以key-value的形式存放
grains模块的用法 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 salt 'minion1' sys.list_functions grains minion1: - grains.append - grains.delkey - grains.delval - grains.equals - grains.fetch - grains.filter_by - grains.get - grains.has_value - grains.item - grains.items - grains.ls - grains.remove - grains.set - grains.setval - grains.setvals 列出可以查看的信息 salt 'minion1' grains.ls minion1: - biosreleasedate - biosvendor - biosversion - cpu_flags - cpu_model ... 查看所有grains的值,和打印facts变量其实差不多 salt 'minion1' grains.items --out=json minion1: { "minion1" : { "cwd" : "/" , "ip_gw" : true , "ip4_gw" : "10.163.2.200" , "ip6_gw" : false , "dns" : { "nameservers" : [ "114.114.114.114" ], "ip4_nameservers" : [ "114.114.114.114" ], "ip6_nameservers" : [], "sortlist" : [], "domain" : "" , "search" : [], "options" : [] }, "fqdns" : [], "machine_id" : "e16b33fe874b4eba9fec3d3b8b3bdda2" , "master" : "salt" , ... 查看单个grains的key value值 salt 'minion1' grains.item ip_interfaces minion1: ---------- ip_interfaces: ---------- bond0: eth0: - 10.163.2.128 - fe80::f7c1:e6d6:13f4:d28d eth1: eth2: eth3: lo: - 127.0.0.1 - ::1 通过json细化查看: salt 'minion1' grains.item ip_interfaces:eth0 minion1: ---------- ip_interfaces:eth0: - 10.163.2.128 - fe80::f7c1:e6d6:13f4:d28d salt 'minion1' grains.item ip_interfaces:eth0:0 minion1: ---------- ip_interfaces:eth0:0: 10.163.2.128
利用grains筛选目标主机(远程执行模块) 使用-G参数,根据Minion的Grains信息来匹配和选择Minion
1 2 3 4 5 6 7 8 9 10 salt -G "os:Ubuntu" grains.item os minion3: ---------- os: Ubuntu salt -G "os:Centos" test.ping minion2: True minion1: True
使用-C参数,进行复合匹配
1 2 3 salt -C 'G@os:Ubuntu and G@cpuarch:x86_64' pkg.upgrade minion3: True
使用-E参数,使用正则表达式进行匹配(默认)
1 2 3 4 5 6 7 8 9 salt -E 'minion[1-3]' test.ping minion1: True minion3: True minion2: True salt '*' test.ping
使用-L参数,列表匹配目标主机
1 2 3 4 5 salt -L 'minion1,minion2' test.ping minion2: True minion1: True
利用grains筛选目标主机(状态管理模块) 可以使用j2模板
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 {% if grains.os_family == 'RedHat' %} install httpd: pkg.installed: - name: httpd start httpd: service.running: - name: httpd - enable : yes {% elif grains.os_family == 'Debian' %} install apache: pkg.installed: - name: apache2 start apache: service.running: - name: apache2 - enable : yes {% endif %} delete index: file.absent: - name: /var/www/html/index.html set web content: file.managed: - name: /var/www/html/index.html - contents: | this is on {{ grains.os_family }} system ip is {{ grains.ip4_interfaces.eth0.0 }} - require: - delete index salt \* state.sls saltenv=base test --summary ... ------------------------------------------- Summary ------------------------------------------- ------------------------------------------- curl minion1 this is on RedHat system ip is 10.163.2.128 curl minion2 this is on RedHat system ip is 10.163.2.102 curl minion3 this is on Debian system ip is 10.163.2.129
自定义grains 如果觉得grains信息不够,可以通过两种形式自定义grains
在master上使用grains方法直接定义
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 salt 'minion1' sys.doc grains.setval CLI Example: salt '*' grains.setval key val salt '*' grains.setval key "{'sub-key': 'val', 'sub-key2': 'val2'}" salt 'minion1' grains.setval system centos7.9 变量矩阵 设置多个字典作为key: salt 'minion1' grains.setval sw "{" op1"," op2"," op3"}" minion1: ---------- sw: ---------- op1: None op2: None op3: None 设置多个值 salt 'minion1' grains.setval sw "{" op1": " an1"," op2": " an2"," op3": " an3"}" minion1: ---------- sw: ---------- op1: an1 op2: an2 op3: an3 设置多个键值对 salt '*' grains.setvals "{'key1': 'val1', 'key2': 'val2'}"
在minion上的grains文件中定义
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 刚刚在minion1上自定义的变量,会存储到对应节点的/etc/salt/grains中 [root@minion1 ~] sw: op1: an1 op2: an2 op3: an3 system: null 那么我们直接手工添加也可以 [root@minion2 ~] 刷新方法 方法(1)[root@minion2 ~] 方法(2)[root@master ~] salt 'minion2' grains.item system minion2: ---------- system: centos8.5
删除自定义grains的方法
1 2 3 4 5 6 7 8 9 10 11 12 只会删value的值 salt '*' grains.delval key 删除key的方法 salt '*' grains.delkey key salt 'minion1' grains.item system [root@minion1 ~] sw: op1: an1 op2: an2 op3: an3