#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 }}
Если я правильно понял ваш вопрос, это должно сработать.