ansible.builtin.password 查找 – 检索或生成一个随机密码,存储在文件中

注意

此查找插件是 ansible-core 的一部分,包含在所有 Ansible 安装中。在大多数情况下,可以使用简短的插件名称 password。但是,我们建议您使用 完全限定集合名称 (FQCN) ansible.builtin.password,以便轻松链接到插件文档并避免与其他可能具有相同查找插件名称的集合冲突。

概要

  • 生成一个随机的明文密码,并将其存储在给定文件路径的文件中。

  • 如果文件之前存在,它将检索其内容,其行为类似于 with_file。

  • 在文件路径中使用像 "{{ inventory_hostname }}" 这样的变量可用于设置每个主机的随机密码,从而简化 "host_vars" 变量中的密码管理。

  • 一个特殊情况是使用 /dev/null 作为路径。密码查找每次都会生成一个新的随机密码,但不会将其写入 /dev/null。当您需要密码而又不想将其存储在控制器上时,可以使用此方法。

术语

参数

注释

术语

字符串 / 必需

存储/将要存储密码的文件的路径

关键字参数

这描述了查找的关键字参数。这些是以下示例中的 key1=value1key2=value2 等值:lookup('ansible.builtin.password', key1=value1, key2=value2, ...)query('ansible.builtin.password', key1=value1, key2=value2, ...)

参数

注释

chars

列表 / 元素=字符串

在生成的密码中组成自定义字符集的名称列表。

此参数定义结果密码中可能的字符集,而不是必需的字符集。如果要为密码要求某些字符集,可以使用 community.general.random_string 查找插件。

默认情况下,生成的密码包含大小写 ASCII 字母、数字 0-9 和标点符号(“.,:-_”)的随机组合。

它们可以是 Python 的字符串模块属性的一部分,也可以字面量表示 (:, -)。

虽然字符串模块可能因 Python 版本而异,但两个主要版本的有效值包括:‘ascii_lowercase’、‘ascii_uppercase’、‘digits’、‘hexdigits’、‘octdigits’、‘printable’、‘punctuation’ 和 ‘whitespace’。

请注意,Python 的 ‘hexdigits’ 包括 a-f 的大小写版本,因此它不是一个好选择,因为它会使那些不区分大小写的系统的值的可能性加倍,从而扭曲预期的熵。

当使用逗号分隔的字符串时,要输入逗号,请在某处使用两个逗号 ‘,,’ - 最好在末尾。不支持引号和双引号。

默认值: ["ascii_letters", "digits", ".,:-_"]

encrypt

字符串

用于加密返回密码的哈希方案,应该是 passlib.hash 中的一种哈希方案;md5_cryptbcryptsha256_cryptsha512_crypt

如果未提供,则密码将以纯文本形式返回。

请注意,密码始终以纯文本形式存储,只有返回的密码会被加密。

加密还会强制保存 salt 值以实现幂等性。

请注意,在 2.6 之前,此选项长期以来被错误地标记为布尔值。

ident

字符串

在 ansible-core 2.12 中添加

指定在使用 encrypt 作为 bcrypt 时要使用的 Bcrypt 算法版本。

此参数仅适用于 bcrypt - https://passlib.readthedocs.io/en/stable/lib/passlib.hash.bcrypt.html#passlib.hash.bcrypt

其他哈希类型将简单地忽略此参数。

此参数的有效值为:22a2y2b

length

整数

生成的密码的长度。

默认值: 20

seed

字符串

在 ansible-core 2.12 中添加

用于初始化随机数生成器的种子。

相同的种子将产生相同的密码。

使用此项进行随机但幂等的密码生成。

备注

注意

  • 当关键字参数和位置参数一起使用时,位置参数必须在关键字参数之前列出:lookup('ansible.builtin.password', term1, term2, key1=value1, key2=value2)query('ansible.builtin.password', term1, term2, key1=value1, key2=value2)

  • 如果您不需要在每个主机上生成随机密码,那么 playbook 中使用 Vault 是密码查找插件的一个很好的替代方案。请阅读那里的文档并考虑首先使用它,对于大多数应用程序来说,它将更受欢迎。

  • 如果文件已经存在,则不会向其中写入任何数据。如果文件有内容,则会将这些内容读取为密码。空文件会导致密码返回为空字符串。

  • 与所有查找一样,此查找在 Ansible 主机上以运行 playbook 的用户身份运行,“become”不适用,目标文件必须可供 playbook 用户读取,或者,如果它不存在,则 playbook 用户必须具有创建它的足够权限。(因此,例如,尝试写入诸如 /etc 之类的区域将失败,除非整个 playbook 以 root 身份运行)。

示例

- name: create a mysql user with a random password
  community.mysql.mysql_user:
    name: "{{ client }}"
    password: "{{ lookup('ansible.builtin.password', 'credentials/' + client + '/' + tier + '/' + role + '/mysqlpassword', length=15) }}"
    priv: "{{ client }}_{{ tier }}_{{ role }}.*:ALL"

- name: create a mysql user with a random password using only ascii letters
  community.mysql.mysql_user:
    name: "{{ client }}"
    password: "{{ lookup('ansible.builtin.password', '/tmp/passwordfile', chars=['ascii_letters']) }}"
    priv: '{{ client }}_{{ tier }}_{{ role }}.*:ALL'

- name: create a mysql user with an 8 character random password using only digits
  community.mysql.mysql_user:
    name: "{{ client }}"
    password: "{{ lookup('ansible.builtin.password', '/tmp/passwordfile', length=8, chars=['digits']) }}"
    priv: "{{ client }}_{{ tier }}_{{ role }}.*:ALL"

- name: create a mysql user with a random password using many different char sets
  community.mysql.mysql_user:
    name: "{{ client }}"
    password: "{{ lookup('ansible.builtin.password', '/tmp/passwordfile', chars=['ascii_letters', 'digits', 'punctuation']) }}"
    priv: "{{ client }}_{{ tier }}_{{ role }}.*:ALL"

- name: create lowercase 8 character name for Kubernetes pod name
  ansible.builtin.set_fact:
    random_pod_name: "web-{{ lookup('ansible.builtin.password', '/dev/null', chars=['ascii_lowercase', 'digits'], length=8) }}"

- name: create random but idempotent password
  ansible.builtin.set_fact:
    password: "{{ lookup('ansible.builtin.password', '/dev/null', seed=inventory_hostname) }}"

返回值

描述

返回值

列表 / 元素=字符串

密码

返回: 成功

作者

  • Daniel Hokka Zakrisson

  • Javier Candeira

  • Maykel Moya

提示

每个条目类型的配置条目具有从低到高的优先级顺序。例如,列表中较低的变量将覆盖较高的变量。