developing.rst 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267
  1. ======================
  2. Developing New Modules
  3. ======================
  4. Interactive Debugging
  5. =====================
  6. Sometimes debugging with ``print()`` and extra logs sprinkled everywhere is not
  7. the best strategy.
  8. IPython is a helpful debug tool that has an interactive python environment
  9. which can be embedded in python programs.
  10. First the system will require IPython to be installed.
  11. .. code-block:: bash
  12. # Debian
  13. apt-get install ipython
  14. # Arch Linux
  15. pacman -Syu ipython2
  16. # RHEL/CentOS (via EPEL)
  17. yum install python-ipython
  18. Now, in the troubling python module, add the following line at a location where
  19. the debugger should be started:
  20. .. code-block:: python
  21. test = 'test123'
  22. import IPython; IPython.embed_kernel()
  23. After running a Salt command that hits that line, the following will show up in
  24. the log file:
  25. .. code-block:: text
  26. [CRITICAL] To connect another client to this kernel, use:
  27. [IPKernelApp] --existing kernel-31271.json
  28. Now on the system that invoked ``embed_kernel``, run the following command from
  29. a shell:
  30. .. code-block:: bash
  31. # NOTE: use ipython2 instead of ipython for Arch Linux
  32. ipython console --existing
  33. This provides a console that has access to all the vars and functions, and even
  34. supports tab-completion.
  35. .. code-block:: python
  36. print(test)
  37. test123
  38. To exit IPython and continue running Salt, press ``Ctrl-d`` to logout.
  39. Special Module Contents
  40. =======================
  41. These are things that may be defined by the module to influence various things.
  42. __virtual__
  43. -----------
  44. __virtual_aliases__
  45. -------------------
  46. __virtualname__
  47. ---------------
  48. __init__
  49. --------
  50. Called before ``__virtual__()``
  51. __proxyenabled__
  52. ----------------
  53. grains and proxy modules
  54. __proxyenabled__ as a list containing the names of the proxy types that the module supports.
  55. __load__
  56. --------
  57. __func_alias__
  58. --------------
  59. __outputter__
  60. -------------
  61. .. _dunder-dictionaries:
  62. Dunder Dictionaries
  63. ===================
  64. Salt provides several special "dunder" dictionaries as a convenience for Salt
  65. development. These include ``__opts__``, ``__context__``, ``__salt__``, and
  66. others. This document will describe each dictionary and detail where they exist
  67. and what information and/or functionality they provide.
  68. The following dunder dictionaries are always defined, but may be empty
  69. * ``__context__``
  70. * ``__grains__``
  71. * ``__pillar__``
  72. * ``__opts__``
  73. __opts__
  74. --------
  75. Defined in: All modules
  76. The ``__opts__`` dictionary contains all of the options passed in the
  77. configuration file for the master or minion.
  78. .. note::
  79. In many places in salt, instead of pulling raw data from the __opts__
  80. dict, configuration data should be pulled from the salt `get` functions
  81. such as config.get, aka - ``__salt__['config.get']('foo:bar')``
  82. The `get` functions also allow for dict traversal via the *:* delimiter.
  83. Consider using get functions whenever using ``__opts__`` or ``__pillar__``
  84. and ``__grains__`` (when using grains for configuration data)
  85. The configuration file data made available in the ``__opts__`` dictionary is the
  86. configuration data relative to the running daemon. If the modules are loaded and
  87. executed by the master, then the master configuration data is available, if the
  88. modules are executed by the minion, then the minion configuration is
  89. available. Any additional information passed into the respective configuration
  90. files is made available
  91. __salt__
  92. --------
  93. Defined in: Auth, Beacons, Engines, Execution, Executors, Outputters, Pillars,
  94. Proxies, Renderers, Returners, Runners, SDB, SSH Wrappers, State, Thorium
  95. ``__salt__`` contains the execution module functions. This allows for all
  96. functions to be called as they have been set up by the salt loader.
  97. .. code-block:: python
  98. __salt__['cmd.run']('fdisk -l')
  99. __salt__['network.ip_addrs']()
  100. .. note::
  101. When used in runners or outputters, ``__salt__`` references other
  102. runner/outputter modules, and not execution modules.
  103. __grains__
  104. ----------
  105. Filled in for: Execution, Pillar, Renderer, Returner, SSH Wrapper, State.
  106. The ``__grains__`` dictionary contains the grains data generated by the minion
  107. that is currently being worked with. In execution modules, state modules and
  108. returners this is the grains of the minion running the calls, when generating
  109. the external pillar the ``__grains__`` is the grains data from the minion that
  110. the pillar is being generated for.
  111. While ``__grains__`` is defined for every module, it's only filled in for some.
  112. __pillar__
  113. -----------
  114. Filled in for: Execution, Renderer, Returner, SSH Wrapper, State
  115. The ``__pillar__`` dictionary contains the pillar for the respective minion.
  116. While ``__pillar__`` is defined for every module, it's only filled in for some.
  117. __ext_pillar__
  118. --------------
  119. Filled in for: Pillar
  120. The ``__ext_pillar__`` dictionary contains the external pillar modules.
  121. .. _dunder-context:
  122. __context__
  123. -----------
  124. During a state run the ``__context__`` dictionary persists across all states
  125. that are run and then is destroyed when the state ends.
  126. When running an execution module ``__context__`` persists across all module
  127. executions until the modules are refreshed; such as when
  128. :py:func:`saltutil.sync_all <salt.modules.saltutil.sync_all>` or
  129. :py:func:`state.apply <salt.modules.state.apply_>` are executed.
  130. A great place to see how to use ``__context__`` is in the cp.py module in
  131. salt/modules/cp.py. The fileclient authenticates with the master when it is
  132. instantiated and then is used to copy files to the minion. Rather than create a
  133. new fileclient for each file that is to be copied down, one instance of the
  134. fileclient is instantiated in the ``__context__`` dictionary and is reused for
  135. each file. Here is an example from salt/modules/cp.py:
  136. .. code-block:: python
  137. if not 'cp.fileclient' in __context__:
  138. __context__['cp.fileclient'] = salt.fileclient.get_file_client(__opts__)
  139. .. note:: Because __context__ may or may not have been destroyed, always be
  140. sure to check for the existence of the key in __context__ and
  141. generate the key before using it.
  142. __utils__
  143. ---------
  144. Defined in: Cloud, Engine, Execution, File Server, Grain, Pillar, Proxy, Roster, Runner, SDB, State
  145. __proxy__
  146. ---------
  147. Defined in: Beacon, Engine, Execution, Executor, Proxy, Renderer, Returner, State, Util
  148. __runner__
  149. -----------
  150. Defined in: Engine, Roster, Thorium
  151. .. note:: When used in engines, it should be called __runners__ (plural)
  152. __executors__
  153. -------------
  154. Defined in: Executor
  155. __ret__
  156. -------
  157. Defined in: Proxy
  158. __thorium__
  159. -----------
  160. Defined in: Thorium
  161. __states__
  162. ----------
  163. Defined in: Renderers, State
  164. __serializers__
  165. ---------------
  166. Defined in: State
  167. __sdb__
  168. -------
  169. Defined in: SDB
  170. Additional Globals
  171. ==================
  172. Defined for: Runners, Execution Modules, Wheels
  173. * ``__jid__``: The job ID
  174. * ``__user__``: The user
  175. * ``__tag__``: The jid tag
  176. * ``__jid_event__``: A :py:class:`salt.utils.event.NamespacedEvent`.
  177. :py:class:`NamespacedEvent <salt.utils.event.NamespacedEvent>` defines a single
  178. method :py:meth:`fire_event <salt.utils.event.NamespacedEvent.fire_event>`, that takes data and tag. The :ref:`Runner docs <runners>` has examples.