def chef_roledefs(api=None, hostname_attr=DEFAULT_HOSTNAME_ATTR, environment=_default_environment):
"""Build a Fabric roledef dictionary from a Chef server.
Example::
from fabric.api import env, run, roles
from chef.fabric import chef_roledefs
env.roledefs = chef_roledefs()
@roles('web_app')
def mytask():
run('uptime')
``hostname_attr`` can either be a string that is the attribute in the chef
node that holds the hostname or IP to connect to, an array of such keys to
check in order (the first which exists will be used), or a callable which
takes a :class:`~chef.Node` and returns the hostname or IP to connect to.
To refer to a nested attribute, separate the levels with ``'.'`` e.g. ``'ec2.public_hostname'``
``environment`` is the Chef :class:`~chef.Environment` name in which to
search for nodes. If set to ``None``, no environment filter is added. If
set to a string, it is used verbatim as a filter string. If not passed as
an argument at all, the value in the Fabric environment dict is used,
defaulting to ``'_default'``.
.. note::
``environment`` must be set to ``None`` if you are emulating Chef API
version 0.9 or lower.
.. versionadded:: 0.1
.. versionadded:: 0.2
Support for iterable and callable values for the``hostname_attr``
argument, and the ``environment`` argument.
"""
api = _api(api)
if api.version_parsed < Environment.api_version_parsed and environment is not None:
raise ChefAPIVersionError('Environment support requires Chef API 0.10 or greater')
roledefs = {}
for row in Search('role', api=api):
name = row['name']
roledefs[name] = Roledef('roles:%s' % name, api, hostname_attr, environment)
return roledefs
评论列表
文章目录