-
Notifications
You must be signed in to change notification settings - Fork 1.6k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
add docs for the vardict module utils (#8460)
* add docs for the vardict module utils * fix var name * add entry to BOTMETA * rollback adjustment in deps guide * Update docs/docsite/rst/guide_vardict.rst Co-authored-by: Felix Fontein <felix@fontein.de> * adjustments * Update docs/docsite/rst/guide_vardict.rst Co-authored-by: Felix Fontein <felix@fontein.de> --------- Co-authored-by: Felix Fontein <felix@fontein.de>
- Loading branch information
1 parent
2a3819a
commit a0ad2d5
Showing
3 changed files
with
179 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -17,3 +17,4 @@ sections: | |
- title: Developer Guides | ||
toctree: | ||
- guide_deps | ||
- guide_vardict |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,176 @@ | ||
.. | ||
Copyright (c) Ansible Project | ||
GNU General Public License v3.0+ (see LICENSES/GPL-3.0-or-later.txt or https://www.gnu.org/licenses/gpl-3.0.txt) | ||
SPDX-License-Identifier: GPL-3.0-or-later | ||
.. _ansible_collections.community.general.docsite.guide_vardict: | ||
|
||
VarDict Guide | ||
============= | ||
|
||
Introduction | ||
^^^^^^^^^^^^ | ||
|
||
The ``ansible_collections.community.general.plugins.module_utils.vardict`` module util provides the | ||
``VarDict`` class to help manage the module variables. That class is a container for module variables, | ||
especially the ones for which the module must keep track of state changes, and the ones that should | ||
be published as return values. | ||
|
||
Each variable has extra behaviors controlled by associated metadata, simplifying the generation of | ||
output values from the module. | ||
|
||
Quickstart | ||
"""""""""" | ||
|
||
The simplest way of using ``VarDict`` is: | ||
|
||
.. code-block:: python | ||
from ansible_collections.community.general.plugins.module_utils.vardict import VarDict | ||
Then in ``main()``, or any other function called from there: | ||
|
||
.. code-block:: python | ||
vars = VarDict() | ||
# Next 3 statements are equivalent | ||
vars.abc = 123 | ||
vars["abc"] = 123 | ||
vars.set("abc", 123) | ||
vars.xyz = "bananas" | ||
vars.ghi = False | ||
And by the time the module is about to exit: | ||
|
||
.. code-block:: python | ||
results = vars.output() | ||
module.exit_json(**results) | ||
That makes the return value of the module: | ||
|
||
.. code-block:: javascript | ||
{ | ||
"abc": 123, | ||
"xyz": "bananas", | ||
"ghi": false | ||
} | ||
Metadata | ||
"""""""" | ||
|
||
The metadata values associated with each variable are: | ||
|
||
- ``output: bool`` - marks the variable for module output as a module return value. | ||
- ``fact: bool`` - marks the variable for module output as an Ansible fact. | ||
- ``verbosity: int`` - sets the minimum level of verbosity for which the variable will be included in the output. | ||
- ``change: bool`` - controls the detection of changes in the variable value. | ||
- ``initial_value: any`` - when using ``change`` and need to forcefully set an intial value to the variable. | ||
- ``diff: bool`` - used along with ``change``, this generates an Ansible-style diff ``dict``. | ||
|
||
See the sections below for more details on how to use the metadata. | ||
|
||
|
||
Using VarDict | ||
^^^^^^^^^^^^^ | ||
|
||
Basic Usage | ||
""""""""""" | ||
|
||
As shown above, variables can be accessed using the ``[]`` operator, as in a ``dict`` object, | ||
and also as an object attribute, such as ``vars.abc``. The form using the ``set()`` | ||
method is special in the sense that you can use it to set metadata values: | ||
|
||
.. code-block:: python | ||
vars.set("abc", 123, output=False) | ||
vars.set("abc", 123, output=True, change=True) | ||
Another way to set metadata after the variables have been created is: | ||
|
||
.. code-block:: python | ||
vars.set_meta("abc", output=False) | ||
vars.set_meta("abc", output=True, change=True, diff=True) | ||
You can use either operator and attribute forms to access the value of the variable. Other ways to | ||
access its value and its metadata are: | ||
|
||
.. code-block:: python | ||
print("abc value = {0}".format(vars.var("abc")["value"])) # get the value | ||
print("abc output? {0}".format(vars.get_meta("abc")["output"])) # get the metadata like this | ||
The names of methods, such as ``set``, ``get_meta``, ``output`` amongst others, are reserved and | ||
cannot be used as variable names. If you try to use a reserved name a ``ValueError`` exception | ||
is raised with the message "Name <var> is reserved". | ||
|
||
Generating output | ||
""""""""""""""""" | ||
|
||
By default, every variable create will be enable for output with minimum verbosity set to zero, in | ||
other words, they will always be in the output by default. | ||
|
||
You can control that when creating the variable for the first time or later in the code: | ||
|
||
.. code-block:: python | ||
vars.set("internal", x + 4, output=False) | ||
vars.set_meta("internal", output=False) | ||
You can also set the verbosity of some variable, like: | ||
|
||
.. code-block:: python | ||
vars.set("abc", x + 4) | ||
vars.set("debug_x", x, verbosity=3) | ||
results = vars.output(module._verbosity) | ||
module.exit_json(**results) | ||
If the module was invoked with verbosity lower than 3, then the output will only contain | ||
the variable ``abc``. If running at higher verbosity, as in ``ansible-playbook -vvv``, | ||
then the output will also contain ``debug_x``. | ||
|
||
Generating facts is very similar to regular output, but variables are not marked as facts by default. | ||
|
||
.. code-block:: python | ||
vars.set("modulefact", x + 4, fact=True) | ||
vars.set("debugfact", x, fact=True, verbosity=3) | ||
results = vars.output(module._verbosity) | ||
results["ansible_facts"] = {"module_name": vars.facts(module._verbosity)} | ||
module.exit_json(**results) | ||
Handling change | ||
""""""""""""""" | ||
|
||
You can use ``VarDict`` to determine whether variables have had their values changed. | ||
|
||
.. code-block:: python | ||
vars.set("abc", 42, change=True) | ||
vars.abc = 90 | ||
results = vars.output() | ||
results["changed"] = vars.has_changed | ||
module.exit_json(**results) | ||
If tracking changes in variables, you may want to present the difference between the initial and the final | ||
values of it. For that, you want to use: | ||
|
||
.. code-block:: python | ||
vars.set("abc", 42, change=True, diff=True) | ||
vars.abc = 90 | ||
results = vars.output() | ||
results["changed"] = vars.has_changed | ||
results["diff"] = vars.diff() | ||
module.exit_json(**results) | ||
.. versionadded:: 6.1.0 |