我们从Python开源项目中,提取了以下4个代码示例,用于说明如何使用fabric.api.env.roledefs()。
def chef_query(query, api=None, hostname_attr=DEFAULT_HOSTNAME_ATTR, environment=_default_environment): """A decorator to use an arbitrary Chef search query to find nodes to execute on. This is used like Fabric's ``roles()`` decorator, but accepts a Chef search query. Example:: from chef.fabric import chef_query @chef_query('roles:web AND tags:active') @task def deploy(): pass .. versionadded:: 0.2.1 """ 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') rolename = 'query_'+query env.setdefault('roledefs', {})[rolename] = Roledef(query, api, hostname_attr, environment) return lambda fn: roles(rolename)(fn)
def get_effective_role(): """Acquire the role definition according to current host """ for role in env.roles: if env.host in env.roledefs[role]['hosts']: return role, env.roledefs[role] raise ValueError('Role undefined by {}'.format(env.host))
def chef_environment(name, api=None): """A Fabric task to set the current Chef environment context. This task works alongside :func:`~chef.fabric.chef_roledefs` to set the Chef environment to be used in future role queries. Example:: from chef.fabric import chef_environment, chef_roledefs env.roledefs = chef_roledefs() .. code-block:: bash $ fab env:production deploy The task can be configured slightly via Fabric ``env`` values. ``env.chef_environment_task_alias`` sets the task alias, defaulting to "env". This value must be set **before** :mod:`chef.fabric` is imported. ``env.chef_environment_validate`` sets if :class:`~chef.Environment` names should be validated before use. Defaults to True. .. versionadded:: 0.2 """ if env.get('chef_environment_validate', True): api = _api(api) chef_env = Environment(name, api=api) if not chef_env.exists: raise ChefError('Unknown Chef environment: %s' % name) env['chef_environment'] = name
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