Home Previous Next
Home Targetting YAML

Grains

Grains are pieces of information about the Nodes in your cluster that Salt discovers when it installs Minion on the node. The grain attribute comprise of information about the OS, Kernel and other system information attributes.

In addition to the built in Grains, you can also add custom grains to a node which can be used for classification. For example some teams add a “roles” grain to the system and then assign roles such as “webserver”, “dbserver” and so on to a node.

A grain can be a value or a list of values based on nature of the grain attribute. Let’s get some practicals :)

Built In Grains

Built in grains are pieces of information which Salt itself discovers ands is typically related to kernel, system and any other available information based on OS.

To list grains that are present on a node, we can use ls command on grains module:

sudo salt '*1*' grains.ls
1.sagent.learn.com:
    - SSDs
    - biosreleasedate
    - biosversion
    - cpu_flags
    - cpu_model
    - cpuarch
    - disks
    - dns
    - domain
    - fqdn
    - fqdn_ip4
    - fqdn_ip6
    - gid
    - gpus
    - groupname
    - host
    - hwaddr_interfaces
    - id
    - init
    - ip4_interfaces
    - ip6_interfaces
    - ip_interfaces
    - ipv4
    - ipv6
    - kernel
    - kernelrelease
    - locale_info
    - localhost
    - lsb_distrib_codename
    - lsb_distrib_description
    - lsb_distrib_id
    - lsb_distrib_release
    - machine_id
    - manufacturer
    - master
    - mdadm
    - mem_total
    - nodename
    - num_cpus
    - num_gpus
    - os
    - os_family
    - osarch
    - oscodename
    - osfinger
    - osfullname
    - osmajorrelease
    - osrelease
    - osrelease_info
    - path
    - pid
    - productname
    - ps
    - pythonexecutable
    - pythonpath
    - pythonversion
    - saltpath
    - saltversion
    - saltversioninfo
    - server_id
    - shell
    - uid
    - username
    - uuid
    - virtual
    - zmqversion

If we want to see the values of the grains as well, we can use items command on the grains module. The output is fairly long and I have truncated it and pasted it here:

sudo salt '*1*' grains.items
1.sagent.learn.com:
    ----------
    SSDs:
    biosreleasedate:
        12/01/2006
    biosversion:
        VirtualBox
    cpu_flags:
        - fpu
        - vme
        - de
        - pse
        - tsc
        - msr
        - pae
        - mce
        - cx8
        - apic
        - sep
        - mtrr
        - pge
        - mca
        - cmov
        - pat
        - pse36
        - clflush
        - mmx
        - fxsr
        - sse
        - sse2
        - syscall
        - nx
        - rdtscp
        - lm
        - constant_tsc
        - rep_good
        - nopl
        - xtopology
        - nonstop_tsc
        - pni
        - pclmulqdq
        - monitor
        - ssse3
        - cx16
        - sse4_1
        - sse4_2
        - movbe
        - popcnt
        - aes
        - xsave
        - avx
        - rdrand
        - lahf_lm
        - abm
        - 3dnowprefetch
        - rdseed
    cpu_model:
        Intel(R) Core(TM) i7-7700HQ CPU @ 2.80GHz
    cpuarch:
        x86_64
    disks:
        - sda
        - ram0
        - ram1
        - ram2
        - ram3
        - ram4
        - ram5
        - ram6
        - ram7
        - ram8
        - ram9
        - loop0
        - loop1
        - loop2
        - loop3
        - loop4
        - loop5
        - loop6
        - loop7
        - ram10
        - ram11
        - ram12
        - ram13
        - ram14
        - ram15
    dns:
        ----------
        domain:
        ip4_nameservers:
            - 10.0.2.3
        ip6_nameservers:
        nameservers:
            - 10.0.2.3
        options:
        search:
            - infracloud.com
        sortlist:
    domain:
        sagent.learn.com
    fqdn:
        1.sagent.learn.com
    fqdn_ip4:
        - 127.0.0.1
    fqdn_ip6:
        - ::1
    gid:
        0
    gpus:
        |_
          ----------
          model:
              VirtualBox Graphics Adapter
          vendor:
              unknown
    groupname:
        root
    host:
        1
    hwaddr_interfaces:
        ----------
        eth0:
            08:00:27:ce:e5:3b
        eth1:
            08:00:27:36:47:bd
        lo:
            00:00:00:00:00:00
    id:
        1.sagent.learn.com
    init:

Now to only list the grains and their values you need you can pass arguments to the item method as shown in example below:

 sudo salt '*1*' grains.item os_family osfinger
1.sagent.learn.com:
    ----------
    os_family:
        Debian
    osfinger:
        Ubuntu-14.04

Grains Configuration

The grains for a node can be configured in two different ways. One way is to configure the minion file located at /etc/salt/minion and modify the grains section there. Following snippet shows the grains configuration example commented in the minion configuration file.

As you can notice, the roles grain is a list whereas the deployment and other grains have a single value. Let’s uncomment these values and save the file. Please note that the ‘grains’ declaration should start with one space and each of others are separated by two spaces (This is a YAML syntax which we will cover shortly)

# Custom static grains for this minion can be specified here and used in SLS
# files just like all other grains. This exmple sets 4 custom grains, with
# the 'roles' grain having two values that can be matched against.
#grains:
#  roles:
#    - webserver
#    - memcache
#  deployment: datacenter4
#  cabinet: 13
#  cab_u: 14-15
#

After modification the grain section looks like:

# the 'roles' grain having two values that can be matched against.
 grains:
   roles:
     - webserver
     - memcache
   deployment: datacenter4
#  cabinet: 13
#  cab_u: 14-15

Now we will have to restart the minion for above changes to take effect.

sudo service salt-minion restart

Simikarly grains for a node can also be defined in a file at /etc/salt/minion.d/grains and the effect is the same. You will have to follow the YAML syntax neverthless.

Custom Grain: Define and use

If you have followed the previous section then we have defined custom grain called roles and deployment on that node. We can validate the same on same node:

```$ sudo salt-call grains.item deployment roles local: ———- deployment: datacenter4 roles: - webserver - memcache


Now if we switch to master, we can use this custom grain for filtering etc. as we used built in grains:

$ sudo salt -G ‘roles:webserver’ test.ping 0.sagent.learn.com: True

$ sudo salt -G ‘roles:memcache’ test.ping 0.sagent.learn.com: True

$ sudo salt ‘0.sagent.learn.com’ grains.item roles 0.sagent.learn.com: ———- roles: - webserver - memcache

As you can note from above two commands, we queried on the grain which has a list of values and it matched even if one of the roles from the list matched the value we quried.


If a grain is set only on certain nodes, you will get blank value for other nodes for that grain:

$ sudo salt ‘*’ grains.item deployment 0.sagent.learn.com: ———- deployment: datacenter4 1.sagent.learn.com: ———- deployment: smaster.learn.com: ———- deployment: ```

Quiz

TBD

Home Previous Next
Home Targetting YAML