pillar.rst 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409
  1. .. _pillar-walk-through:
  2. ==================
  3. Pillar Walkthrough
  4. ==================
  5. .. note::
  6. This walkthrough assumes that the reader has already completed the initial
  7. Salt :ref:`walkthrough <tutorial-salt-walk-through>`.
  8. Pillars are tree-like structures of data defined on the Salt Master and passed
  9. through to minions. They allow confidential, targeted data to be securely sent
  10. only to the relevant minion.
  11. .. note::
  12. Grains and Pillar are sometimes confused, just remember that Grains
  13. are data about a minion which is stored or generated from the minion.
  14. This is why information like the OS and CPU type are found in Grains.
  15. Pillar is information about a minion or many minions stored or generated
  16. on the Salt Master.
  17. Pillar data is useful for:
  18. Highly Sensitive Data:
  19. Information transferred via pillar is guaranteed to only be presented to
  20. the minions that are targeted, making Pillar suitable
  21. for managing security information, such as cryptographic keys and
  22. passwords.
  23. Minion Configuration:
  24. Minion modules such as the execution modules, states, and returners can
  25. often be configured via data stored in pillar.
  26. Variables:
  27. Variables which need to be assigned to specific minions or groups of
  28. minions can be defined in pillar and then accessed inside sls formulas
  29. and template files.
  30. Arbitrary Data:
  31. Pillar can contain any basic data structure in dictionary format,
  32. so a key/value store can be defined making it easy to iterate over a group
  33. of values in sls formulas.
  34. Pillar is therefore one of the most important systems when using Salt. This
  35. walkthrough is designed to get a simple Pillar up and running in a few minutes
  36. and then to dive into the capabilities of Pillar and where the data is
  37. available.
  38. Setting Up Pillar
  39. =================
  40. The pillar is already running in Salt by default. To see the minion's
  41. pillar data:
  42. .. code-block:: bash
  43. salt '*' pillar.items
  44. .. note::
  45. Prior to version 0.16.2, this function is named ``pillar.data``. This
  46. function name is still supported for backwards compatibility.
  47. By default, the contents of the master configuration file are not loaded into
  48. pillar for all minions. This default is stored in the ``pillar_opts`` setting,
  49. which defaults to ``False``.
  50. The contents of the master configuration file can be made available to minion
  51. pillar files. This makes global configuration of services and systems very easy,
  52. but note that this may not be desired or appropriate if sensitive data is stored
  53. in the master's configuration file. To enable the master configuration file to be
  54. available to minion as pillar, set ``pillar_opts: True`` in the master
  55. configuration file, and then for appropriate minions also set ``pillar_opts: True``
  56. in the minion(s) configuration file.
  57. Similar to the state tree, the pillar is comprised of sls files and has a top file.
  58. The default location for the pillar is in /srv/pillar.
  59. .. note::
  60. The pillar location can be configured via the ``pillar_roots`` option inside
  61. the master configuration file. It must not be in a subdirectory of the state
  62. tree or file_roots. If the pillar is under file_roots, any pillar targeting
  63. can be bypassed by minions.
  64. To start setting up the pillar, the /srv/pillar directory needs to be present:
  65. .. code-block:: bash
  66. mkdir /srv/pillar
  67. Now create a simple top file, following the same format as the top file used for
  68. states:
  69. ``/srv/pillar/top.sls``:
  70. .. code-block:: yaml
  71. base:
  72. '*':
  73. - data
  74. This top file associates the data.sls file to all minions. Now the
  75. ``/srv/pillar/data.sls`` file needs to be populated:
  76. ``/srv/pillar/data.sls``:
  77. .. code-block:: yaml
  78. info: some data
  79. To ensure that the minions have the new pillar data, issue a command
  80. to them asking that they fetch their pillars from the master:
  81. .. code-block:: bash
  82. salt '*' saltutil.refresh_pillar
  83. Now that the minions have the new pillar, it can be retrieved:
  84. .. code-block:: bash
  85. salt '*' pillar.items
  86. The key ``info`` should now appear in the returned pillar data.
  87. More Complex Data
  88. ~~~~~~~~~~~~~~~~~
  89. Unlike states, pillar files do not need to define :strong:`formulas`.
  90. This example sets up user data with a UID:
  91. ``/srv/pillar/users/init.sls``:
  92. .. code-block:: yaml
  93. users:
  94. thatch: 1000
  95. shouse: 1001
  96. utahdave: 1002
  97. redbeard: 1003
  98. .. note::
  99. The same directory lookups that exist in states exist in pillar, so the
  100. file ``users/init.sls`` can be referenced with ``users`` in the :term:`top
  101. file <Top File>`.
  102. The top file will need to be updated to include this sls file:
  103. ``/srv/pillar/top.sls``:
  104. .. code-block:: yaml
  105. base:
  106. '*':
  107. - data
  108. - users
  109. Now the data will be available to the minions. To use the pillar data in a
  110. state, you can use Jinja:
  111. ``/srv/salt/users/init.sls``
  112. .. code-block:: jinja
  113. {% for user, uid in pillar.get('users', {}).items() %}
  114. {{user}}:
  115. user.present:
  116. - uid: {{uid}}
  117. {% endfor %}
  118. This approach allows for users to be safely defined in a pillar and then the
  119. user data is applied in an sls file.
  120. Parameterizing States With Pillar
  121. =================================
  122. Pillar data can be accessed in state files to customise behavior for each
  123. minion. All pillar (and grain) data applicable to each minion is substituted
  124. into the state files through templating before being run. Typical uses
  125. include setting directories appropriate for the minion and skipping states
  126. that don't apply.
  127. A simple example is to set up a mapping of package names in pillar for
  128. separate Linux distributions:
  129. ``/srv/pillar/pkg/init.sls``:
  130. .. code-block:: jinja
  131. pkgs:
  132. {% if grains['os_family'] == 'RedHat' %}
  133. apache: httpd
  134. vim: vim-enhanced
  135. {% elif grains['os_family'] == 'Debian' %}
  136. apache: apache2
  137. vim: vim
  138. {% elif grains['os'] == 'Arch' %}
  139. apache: apache
  140. vim: vim
  141. {% endif %}
  142. The new ``pkg`` sls needs to be added to the top file:
  143. ``/srv/pillar/top.sls``:
  144. .. code-block:: yaml
  145. base:
  146. '*':
  147. - data
  148. - users
  149. - pkg
  150. Now the minions will auto map values based on respective operating systems
  151. inside of the pillar, so sls files can be safely parameterized:
  152. ``/srv/salt/apache/init.sls``:
  153. .. code-block:: jinja
  154. apache:
  155. pkg.installed:
  156. - name: {{ pillar['pkgs']['apache'] }}
  157. Or, if no pillar is available a default can be set as well:
  158. .. note::
  159. The function ``pillar.get`` used in this example was added to Salt in
  160. version 0.14.0
  161. ``/srv/salt/apache/init.sls``:
  162. .. code-block:: jinja
  163. apache:
  164. pkg.installed:
  165. - name: {{ salt['pillar.get']('pkgs:apache', 'httpd') }}
  166. In the above example, if the pillar value ``pillar['pkgs']['apache']`` is not
  167. set in the minion's pillar, then the default of ``httpd`` will be used.
  168. .. note::
  169. Under the hood, pillar is just a Python dict, so Python dict methods such
  170. as ``get`` and ``items`` can be used.
  171. Pillar Makes Simple States Grow Easily
  172. ======================================
  173. One of the design goals of pillar is to make simple sls formulas easily grow
  174. into more flexible formulas without refactoring or complicating the states.
  175. A simple formula:
  176. ``/srv/salt/edit/vim.sls``:
  177. .. code-block:: yaml
  178. vim:
  179. pkg.installed: []
  180. /etc/vimrc:
  181. file.managed:
  182. - source: salt://edit/vimrc
  183. - mode: 644
  184. - user: root
  185. - group: root
  186. - require:
  187. - pkg: vim
  188. Can be easily transformed into a powerful, parameterized formula:
  189. ``/srv/salt/edit/vim.sls``:
  190. .. code-block:: jinja
  191. vim:
  192. pkg.installed:
  193. - name: {{ pillar['pkgs']['vim'] }}
  194. /etc/vimrc:
  195. file.managed:
  196. - source: {{ pillar['vimrc'] }}
  197. - mode: 644
  198. - user: root
  199. - group: root
  200. - require:
  201. - pkg: vim
  202. Where the vimrc source location can now be changed via pillar:
  203. ``/srv/pillar/edit/vim.sls``:
  204. .. code-block:: jinja
  205. {% if grains['id'].startswith('dev') %}
  206. vimrc: salt://edit/dev_vimrc
  207. {% elif grains['id'].startswith('qa') %}
  208. vimrc: salt://edit/qa_vimrc
  209. {% else %}
  210. vimrc: salt://edit/vimrc
  211. {% endif %}
  212. Ensuring that the right vimrc is sent out to the correct minions.
  213. The pillar top file must include a reference to the new sls pillar file:
  214. ``/srv/pillar/top.sls``:
  215. .. code-block:: yaml
  216. base:
  217. '*':
  218. - pkg
  219. - edit.vim
  220. Setting Pillar Data on the Command Line
  221. =======================================
  222. Pillar data can be set on the command line when running :py:func:`state.apply
  223. <salt.modules.state.apply_` like so:
  224. .. code-block:: bash
  225. salt '*' state.apply pillar='{"foo": "bar"}'
  226. salt '*' state.apply my_sls_file pillar='{"hello": "world"}'
  227. Nested pillar values can also be set via the command line:
  228. .. code-block:: bash
  229. salt '*' state.sls my_sls_file pillar='{"foo": {"bar": "baz"}}'
  230. Lists can be passed via command line pillar data as follows:
  231. .. code-block:: bash
  232. salt '*' state.sls my_sls_file pillar='{"some_list": ["foo", "bar", "baz"]}'
  233. .. note::
  234. If a key is passed on the command line that already exists on the minion,
  235. the key that is passed in will overwrite the entire value of that key,
  236. rather than merging only the specified value set via the command line.
  237. The example below will swap the value for vim with telnet in the previously
  238. specified list, notice the nested pillar dict:
  239. .. code-block:: bash
  240. salt '*' state.apply edit.vim pillar='{"pkgs": {"vim": "telnet"}}'
  241. This will attempt to install telnet on your minions, feel free to
  242. uninstall the package or replace telnet value with anything else.
  243. .. note::
  244. Be aware that when sending sensitive data via pillar on the command-line
  245. that the publication containing that data will be received by all minions
  246. and will not be restricted to the targeted minions. This may represent
  247. a security concern in some cases.
  248. More On Pillar
  249. ==============
  250. Pillar data is generated on the Salt master and securely distributed to
  251. minions. Salt is not restricted to the pillar sls files when defining the
  252. pillar but can retrieve data from external sources. This can be useful when
  253. information about an infrastructure is stored in a separate location.
  254. Reference information on pillar and the external pillar interface can be found
  255. in the Salt documentation:
  256. :ref:`Pillar <pillar>`
  257. Minion Config in Pillar
  258. =======================
  259. Minion configuration options can be set on pillars. Any option that you want
  260. to modify, should be in the first level of the pillars, in the same way you set
  261. the options in the config file. For example, to configure the MySQL root
  262. password to be used by MySQL Salt execution module:
  263. .. code-block:: yaml
  264. mysql.pass: hardtoguesspassword
  265. This is very convenient when you need some dynamic configuration change that
  266. you want to be applied on the fly. For example, there is a chicken and the egg
  267. problem if you do this:
  268. .. code-block:: yaml
  269. mysql-admin-passwd:
  270. mysql_user.present:
  271. - name: root
  272. - password: somepasswd
  273. mydb:
  274. mysql_db.present
  275. The second state will fail, because you changed the root password and the
  276. minion didn't notice it. Setting mysql.pass in the pillar, will help to sort
  277. out the issue. But always change the root admin password in the first place.
  278. This is very helpful for any module that needs credentials to apply state
  279. changes: mysql, keystone, etc.