120 lines
3.6 KiB
Python
120 lines
3.6 KiB
Python
|
# -*- coding: utf-8 -*-
|
||
|
# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt)
|
||
|
|
||
|
"""The community.general.random_words Ansible lookup plugin."""
|
||
|
|
||
|
from __future__ import absolute_import, division, print_function
|
||
|
|
||
|
__metaclass__ = type
|
||
|
|
||
|
DOCUMENTATION = r"""
|
||
|
name: random_words
|
||
|
author:
|
||
|
- Thomas Sjögren (@konstruktoid)
|
||
|
short_description: Return a number of random words
|
||
|
version_added: "4.0.0"
|
||
|
requirements:
|
||
|
- xkcdpass U(https://github.com/redacted/XKCD-password-generator)
|
||
|
description:
|
||
|
- Returns a number of random words. The output can for example be used for
|
||
|
passwords.
|
||
|
- See U(https://xkcd.com/936/) for background.
|
||
|
options:
|
||
|
numwords:
|
||
|
description:
|
||
|
- The number of words.
|
||
|
default: 6
|
||
|
type: int
|
||
|
min_length:
|
||
|
description:
|
||
|
- Minimum length of words to make password.
|
||
|
default: 5
|
||
|
type: int
|
||
|
max_length:
|
||
|
description:
|
||
|
- Maximum length of words to make password.
|
||
|
default: 9
|
||
|
type: int
|
||
|
delimiter:
|
||
|
description:
|
||
|
- The delimiter character between words.
|
||
|
default: " "
|
||
|
type: str
|
||
|
case:
|
||
|
description:
|
||
|
- The method for setting the case of each word in the passphrase.
|
||
|
choices: ["alternating", "upper", "lower", "random", "capitalize"]
|
||
|
default: "lower"
|
||
|
type: str
|
||
|
"""
|
||
|
|
||
|
EXAMPLES = r"""
|
||
|
- name: Generate password with default settings
|
||
|
ansible.builtin.debug:
|
||
|
var: lookup('community.general.random_words')
|
||
|
# Example result: 'traitor gigabyte cesarean unless aspect clear'
|
||
|
|
||
|
- name: Generate password with six, five character, words
|
||
|
ansible.builtin.debug:
|
||
|
var: lookup('community.general.random_words', min_length=5, max_length=5)
|
||
|
# Example result: 'brink banjo getup staff trump comfy'
|
||
|
|
||
|
- name: Generate password with three capitalized words and the '-' delimiter
|
||
|
ansible.builtin.debug:
|
||
|
var: lookup('community.general.random_words', numwords=3, delimiter='-', case='capitalize')
|
||
|
# Example result: 'Overlabor-Faucet-Coastline'
|
||
|
|
||
|
- name: Generate password with three words without any delimiter
|
||
|
ansible.builtin.debug:
|
||
|
var: lookup('community.general.random_words', numwords=3, delimiter='')
|
||
|
# Example result: 'deskworkmonopolystriking'
|
||
|
# https://www.ncsc.gov.uk/blog-post/the-logic-behind-three-random-words
|
||
|
"""
|
||
|
|
||
|
RETURN = r"""
|
||
|
_raw:
|
||
|
description: A single-element list containing random words.
|
||
|
type: list
|
||
|
elements: str
|
||
|
"""
|
||
|
|
||
|
from ansible.errors import AnsibleLookupError
|
||
|
from ansible.plugins.lookup import LookupBase
|
||
|
|
||
|
try:
|
||
|
from xkcdpass import xkcd_password as xp
|
||
|
|
||
|
HAS_XKCDPASS = True
|
||
|
except ImportError:
|
||
|
HAS_XKCDPASS = False
|
||
|
|
||
|
|
||
|
class LookupModule(LookupBase):
|
||
|
"""The random_words Ansible lookup class."""
|
||
|
|
||
|
def run(self, terms, variables=None, **kwargs):
|
||
|
|
||
|
if not HAS_XKCDPASS:
|
||
|
raise AnsibleLookupError(
|
||
|
"Python xkcdpass library is required. "
|
||
|
'Please install using "pip install xkcdpass"'
|
||
|
)
|
||
|
|
||
|
self.set_options(var_options=variables, direct=kwargs)
|
||
|
method = self.get_option("case")
|
||
|
delimiter = self.get_option("delimiter")
|
||
|
max_length = self.get_option("max_length")
|
||
|
min_length = self.get_option("min_length")
|
||
|
numwords = self.get_option("numwords")
|
||
|
|
||
|
words = xp.locate_wordfile()
|
||
|
wordlist = xp.generate_wordlist(
|
||
|
max_length=max_length, min_length=min_length, wordfile=words
|
||
|
)
|
||
|
|
||
|
values = xp.generate_xkcdpassword(
|
||
|
wordlist, case=method, delimiter=delimiter, numwords=numwords
|
||
|
)
|
||
|
|
||
|
return [values]
|