Создайте пароль и запишите его в файл

#ansible

#ansible

Вопрос:

Идея состоит в том, чтобы создавать учетные записи пользователей через API. Использование переменных по умолчанию в качестве основной информации:

 ---
students:
  - Username: testuser1
    E-Mail: student1@student.com
  - Username: testuser2
    E-Mail: student2@student.com
  

Затем Creating User роль создаст всех пользователей с API:

 - name: "Creating User"
  uri:
    url: "https://URL/api/v1/users"
    method: POST
    headers:
      Content-Type: application/json
      Authorization: AUTH TOKEN
    body:
      name: "{{ item['Username'] }}"
      email: "{{ item['E-Mail'] }}"
      password: "{{ item['Password'] }}"
    body_format: json
    validate_certs: no
  loop: "{{ students }}"
  

Я не могу найти способ сгенерировать пароль для каждого пользователя и записать их в файл. Есть ли способ, которым я могу добавить Password переменную к каждому элементу student перед Creating User ролью? Если это так, я мог бы просто записать переменную по умолчанию в файл в качестве последней роли.

Я играл с модулем паролей. Я не хочу иметь более 100 файлов с паролями пользователей. В конце мне нужно иметь отдельный файл со всей информацией.

Комментарии:

1. Пожалуйста, смотрите docs.ansible.com/ansible/latest/collections/ansible/builtin /…

2. Привет, Zeitounator, я знаю об этом модуле, но это не проблема и не помогает.

3. Вы явно пропустили часть документа : A special case is using /dev/null as a path . Поэтому вы можете использовать поиск, чтобы создать пароль для каждого пользователя и (повторно) создать структуру данных, содержащую пароль, а затем сохранить все в файле.

Ответ №1:

Я не уверен на 100%, что понял ваш вопрос.

Ниже будет приведен ваш фактический список пользователей, создайте новый с сгенерированным паролем для каждого и сохраните результат в одном файле для всех пользователей. Бонус: если файл существует, var будет инициализирован оттуда, минуя создание пароля.

Примечания:

  • Приведенное ниже может быть улучшено. Вы можете поместить задачи блока для создания файла в отдельный файл и использовать условное включение, чтобы пропущенная итерация цикла вообще не выполнялась, когда файл уже существует.
  • Я, очевидно, не принял во внимание безопасность здесь, и я настоятельно рекомендую вам обезопасить способ хранения вашего файла.

Демонстрационный сборник:

 ---
- name: Create random passwords and store
  hosts: localhost
  gather_facts: false

  vars:

    users_with_pass_file: /tmp/test_pass.txt

    students:
      - Username: testuser1
        E-Mail: student1@student.com
      - Username: testuser2
        E-Mail: student2@student.com

  tasks:

    - name: Try to load users and passwords from file if it exists
      vars:
        file_content: "{{ lookup('ansible.builtin.file', users_with_pass_file, errors='ignore') }}"
      ansible.builtin.set_fact:
        users_with_pass: "{{ file_content }}"
      when:
        - file_content | length > 0
        # Unfortunately, there is no test 'is list' in jinja2...
        - file_content is iterable
        - file_content is not mapping
        - file_content is not string
      ignore_errors: true
      changed_when: false
      register: load_from_disk

    - name: Create user list with passwords and store it if it does not exists (or is malformed...)
      block:

        - name: Create the list
          vars:
            user_password: "{{ lookup('ansible.builtin.password', '/dev/null', length=12) }}"
          ansible.builtin.set_fact:
            users_with_pass: "{{ users_with_pass | default([])   [item | combine({'password': user_password})] }}"
          loop: "{{ students }}"

        - name: Store the result
          ansible.builtin.copy:
            dest: "{{ users_with_pass_file }}"
            content: "{{ users_with_pass | to_json }}"

      when: load_from_disk is skipped or load_from_disk is failed

    - name: Show the result
      ansible.builtin.debug:
        var: users_with_pass
  

первый запуск (с используемой версией ansible):

 $ ansible-playbook --version
ansible-playbook 2.10.1
  config file = None
  configured module search path = ['/home/user/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules']
  ansible python module location = /usr/local/lib/python3.6/dist-packages/ansible
  executable location = /usr/local/bin/ansible-playbook
  python version = 3.6.9 (default, Jul 17 2020, 12:50:27) [GCC 8.4.0]

$ ansible-playbook test.yml 

PLAY [Create random passwords and store] ***********************************************************************************************************************************************************************************************

TASK [Try to load users and passwords from file if it exists] **************************************************************************************************************************************************************************
[WARNING]: Unable to find '/tmp/test_pass.txt' in expected paths (use -vvvvv to see paths)
skipping: [localhost]

TASK [Create the list] *****************************************************************************************************************************************************************************************************************
ok: [localhost] => (item={'Username': 'testuser1', 'E-Mail': 'student1@student.com'})
ok: [localhost] => (item={'Username': 'testuser2', 'E-Mail': 'student2@student.com'})

TASK [Store the result] ****************************************************************************************************************************************************************************************************************
changed: [localhost]

TASK [Show the result] *****************************************************************************************************************************************************************************************************************
ok: [localhost] => {
    "users_with_pass": [
        {
            "E-Mail": "student1@student.com",
            "Username": "testuser1",
            "password": "5l1RG7HzqaKMWJcH:mRH"
        },
        {
            "E-Mail": "student2@student.com",
            "Username": "testuser2",
            "password": "tZvLT3LVj3_60GV_WoQd"
        }
    ]
}

PLAY RECAP *****************************************************************************************************************************************************************************************************************************
localhost                  : ok=3    changed=1    unreachable=0    failed=0    skipped=1    rescued=0    ignored=0
  

Второй запуск:

 PLAY [Create random passwords and store] ***********************************************************************************************************************************************************************************************

TASK [Try to load users and passwords from file if it exists] **************************************************************************************************************************************************************************
ok: [localhost]

TASK [Create the list] *****************************************************************************************************************************************************************************************************************
skipping: [localhost] => (item={'Username': 'testuser1', 'E-Mail': 'student1@student.com'}) 
skipping: [localhost] => (item={'Username': 'testuser2', 'E-Mail': 'student2@student.com'}) 

TASK [Store the result] ****************************************************************************************************************************************************************************************************************
skipping: [localhost]

TASK [Show the result] *****************************************************************************************************************************************************************************************************************
ok: [localhost] => {
    "users_with_pass": [
        {
            "E-Mail": "student1@student.com",
            "Username": "testuser1",
            "password": "5l1RG7HzqaKMWJcH:mRH"
        },
        {
            "E-Mail": "student2@student.com",
            "Username": "testuser2",
            "password": "tZvLT3LVj3_60GV_WoQd"
        }
    ]
}

PLAY RECAP *****************************************************************************************************************************************************************************************************************************
localhost                  : ok=2    changed=0    unreachable=0    failed=0    skipped=2    rescued=0    ignored=0
  

Ответ №2:

Если у вас установлена программа diceware, вы можете сгенерировать пароль:

 - name: generate new password
  delegate_to: localhost
  command: diceware --no-caps -d ' ' -w en_eff
  register: generatedpass
  

Затем вы можете сохранить в файле:

 - name: store password
  copy:
    dest: '/path/to/password/file'
    content: |
      {{ generatedpass }}
  

Если я правильно понял ваш вопрос, это должно сработать.