Couple of clarifications:
> * No for grains: grains are distributed. They are configured and evaluated on the minion host. When role assignment changes, do you want to go to _each_ minion (possibly restarting it) to modify roles they belong to? Or you rather change these assignments in your _centrally_ managed pillar on your master?
These days, you can use `grains.setval` or even sync a custom grain file from _grains/, so it no longer requires going to each minion. However, it should be noted that minions are the source of truth for grains, so if there's a security issue with a minion being able to change its own role, then you should fall back to pillar.
> * No for node groups: node groups require master restart. Node groups are configured in Salt master config file. Do you want to restart master _every time_ role assignments are changed? Or you rather change these assignments in pillar and simply re-run your states?
I don't think nodegroups require master restart anymore, but I guess I need to test again to be sure.
Both of those things said, there's no "right" answer. It really depends on your needs. But I lean towards pillar myself.
--
Colton Myers
Platform Engineer, SaltStack
@basepi on Github/Twitter/IRC