Ansible을 사용하여 새 사용자 및 암호 만들기
ubuntu 12.04에서 새로운 사용자를 생성하는 작업이 있습니다.
- name: Add deployment user
action: user name=deployer password=mypassword
예상대로 완료됩니다만, 그 유저로서 로그인하고, 설정한 패스워드로 sudo를 하려고 하면, 항상 「잘못했다」라고 표시됩니다.내가 뭘 잘못하고 있지?
답변이 늦었을지도 모르지만, 최근 저는 jinja2 필터가 암호화된 비밀번호 생성을 처리하는 기능을 가지고 있다는 것을 알게 되었습니다.의 마마 my에서는main.yml
'CHANGE: 'CHANGE: 'CHANGE: 'CHANGE:
- name: Creating user "{{ uusername }}" with admin access
user:
name: {{ uusername }}
password: {{ upassword | password_hash('sha512') }}
groups: admin append=yes
when: assigned_role == "yes"
- name: Creating users "{{ uusername }}" without admin access
user:
name: {{ uusername }}
password: {{ upassword | password_hash('sha512') }}
when: assigned_role == "no"
- name: Expiring password for user "{{ uusername }}"
shell: chage -d 0 "{{ uusername }}"
과 "upassword는 "uppassword"로 .--extra-vars
여기에 jinja2 필터를 사용하여 패스워드를 암호화하고 있습니다.
이와 관련된 아래의 튜토리얼을 블로그에 추가하였습니다.
모듈에 대한 Ansible의 설명서를 읽으면 파라미터 사용 방법에 대한 자세한 내용은 Ansible-examples github repo로 안내됩니다.
여기서 패스워드가 해시되어 있어야 합니다.
- hosts: all
user: root
vars:
# created with:
# python -c 'import crypt; print crypt.crypt("This is my Password", "$1$SomeSalt$")'
password: $1$SomeSalt$UqddPX3r4kH3UL5jq5/ZI.
tasks:
- user: name=tset password={{password}}
플레이북 또는 응답 가능한 명령줄에 일반 텍스트로 된 암호가 있는 경우, 이는 섀도 파일에 기록된 암호 해시가 잘못되었음을 의미합니다.즉, 패스워드를 사용하여 인증을 시도해도 해시는 일치하지 않습니다.
또한 패스워드 파라미터의 차이점 및 올바른 사용방법에 대해서는 Ansible FAQ를 참조하십시오.
또 다른 해결책을 제안하고 싶습니다.
- name: Create madhead user
user:
name: madhead
password: "{{ 'password' | password_hash('sha512') }}"
shell: /bin/zsh
update_password: on_create
register: madhead
- name: Force madhead to change password
shell: chage -d 0 madhead
when: madhead.changed
왜 더 좋은가?이미 여기서 언급했듯이 앤서블 플레이는 무의미해야 한다.당신은 그것들을 명령적인 스타일의 일련의 행동이 아니라 원하는 상태, 선언적인 스타일로 생각해야 합니다.그 결과 여러 번 실행할 수 있으며 동일한 서버 상태를 얻을 수 있습니다.
이 모든 것이 좋은 것처럼 들리지만, 약간의 뉘앙스가 있습니다.그 중 하나는 사용자 관리입니다."Desired state(희망 상태)"는 사용자를 생성하는 플레이를 실행할 때마다 해당 상태에 정확히 맞게 업데이트됨을 의미합니다."업데이트"란 그의 비밀번호도 변경된다는 것을 의미합니다.하지만 아마도 그것은 당신이 필요로 하는 것이 아닐 것이다.일반적으로 사용자를 생성하고 암호를 한 번만 설정 및 만료해야 합니다. 이후 재생을 실행하면 암호가 업데이트되지 않습니다.
은 가지고 있다update_password
이 문제를 해결하는 모듈 내의 Attribute.이 값을 등록된 변수와 함께 사용하면 사용자가 실제로 업데이트되었을 때만 암호를 만료할 수 있습니다.
사용자 셸을 수동으로 변경하면(악마의 관리자가 플레이에서 강제한 셸이 마음에 들지 않는다고 가정하면) 사용자가 갱신되므로 비밀번호가 만료됩니다.
또한 일반 텍스트 초기 암호를 재생에서 쉽게 사용할 수 있습니다.다른 곳에 인코딩하여 해시를 붙여넣을 필요가 없습니다.그것에는 Jinja2 필터를 사용할 수 있습니다.그러나 사용자가 로그인하기 전에 다른 사용자가 로그인하면 보안 결함이 발생할 수 있습니다.
이렇게 해보다
vars_prompt:
- name: "user_password"
prompt: "Enter a password for the user"
private: yes
encrypt: "md5_crypt" #need to have python-passlib installed in local machine before we can use it
confirm: yes
salt_size: 7
- name: "add new user" user: name="{{user_name}}" comment="{{description_user}}" password="{{user_password}}" home="{{home_dir}}" shell="/bin/bash"
Ansible 'user' 모듈은 사용자를 유휴 방식으로 관리합니다.아래 플레이북에서 첫 번째 작업은 사용자에게 state=present를 선언합니다.첫 번째 동작의 'register: newuser'는 두 번째 동작에서 사용자가 새 사용자인지 확인하는 데 도움이 됩니다(newuser.devl=).=참) 또는 기존(newuser.changed==False
1번
Ansible 플레이북에는 다음이 있습니다.
tasks:
- name: create deployment user
user:
name: deployer
createhome: yes
state: present
register: newuser
- name: generate random password for user only on creation
shell: /usr/bin/openssl rand -base64 32 | passwd --stdin deployer
when: newuser.changed
이 답변의 역할은 new_user_name에 대해 랜덤 비밀번호를 생성하고 비밀번호를 즉시 만료하는 것입니다.new_user_name은 첫 번째 로그온 시 비밀번호를 변경하기 위해 필요합니다.
create_user.yml:
---
# create_user playbook
- hosts: your_host_group
become: True
user: ansible
roles:
- create_user
roles/create_user/main.yml:
---
# Generate random password for new_user_name and the new_user_name
# is required to change his/her password on first logon.
- name: Generate password for new user
shell: makepasswd --chars=20
register: user_password
- name: Generate encrypted password
shell: mkpasswd --method=SHA-512 {{ user_password.stdout }}
register: encrypted_user_password
- name: Create user account
user: name={{ new_user_name }}
password={{ encrypted_user_password.stdout }}
state=present
append=yes
shell="/bin/bash"
update_password=always
when: new_user_name is defined and new_user_name in uids
register: user_created
- name: Force user to change password
shell: chage -d 0 {{ new_user_name }}
when: user_created.changed
- name: User created
debug: msg="Password for {{ new_user_name }} is {{ user_password.stdout }}"
when: user_created.changed
새 사용자를 생성하는 경우:
ansible-playbook -i hosts.ini create_user.yml --extra-vars "new_user_name=kelvin"
나는 다음을 포함한 많은 유틸리티들을 시도했다.mkpasswd
만, 툴에 때 것 .Python , 、 ,, 、 ,, 、 ,, 、 ,,, 、 ,,, 、 Ansible 。앤서블 넘버 값
ansible all -i localhost, -m debug -a "msg={{ 'yourpasswd' | password_hash('sha512', 'mysecretsalt') }}"
플레이북:
- name: User creation
user:
name: username
uid: UID
group: grpname
shell: /bin/bash
comment: "test user"
password: "$6$mysecretsalt$1SMjoVXjYf.3sJR3a1WUxlDCmdJwC613.SUD4DOf40ASDFASJHASDFCDDDWERWEYbs8G00NHmOg29E0"
내 솔루션은 조회와 비밀번호 생성을 자동으로 사용하는 것입니다.
---
- hosts: 'all'
remote_user: root
gather_facts: no
vars:
deploy_user: deploy
deploy_password: "{{ lookup('password', '/tmp/password chars=ascii_letters') }}"
tasks:
- name: Create deploy user
user:
name: "{{ deploy_user }}"
password: "{{ deploy_password | password_hash('sha512') }}"
간단한 방법은 다음과 같습니다.
---
- name: Create user
user: name=user shell=/bin/bash home=/srv/user groups=admin,sudo generate_ssh_key=yes ssh_key_bits=2048
- name: Set password to user
shell: echo user:plain_text_password | sudo chpasswd
no_log: True
나는 이렇게 했다.
- hosts: main
vars:
# created with:
# python -c "from passlib.hash import sha512_crypt; print sha512_crypt.encrypt('<password>')"
# above command requires the PassLib library: sudo pip install passlib
- password: '$6$rounds=100000$H/83rErWaObIruDw$DEX.DgAuZuuF.wOyCjGHnVqIetVt3qRDnTUvLJHBFKdYr29uVYbfXJeHg.IacaEQ08WaHo9xCsJQgfgZjqGZI0'
tasks:
- user: name=spree password={{password}} groups=sudo,www-data shell=/bin/bash append=yes
sudo: yes
ansible-vault를 사용하여 플레이북의 비밀키를 사용할 수 있습니다.비밀번호를 yml로 정의합니다.
예: 패스: 비밀 또는
user:
pass: secret
name: fake
를 사용하여 비밀 파일을 암호화합니다.
ansible-vault encrypt /path/to/credential.yml
ansible은 암호화하기 위한 비밀번호를 요구합니다.(그 패스의 사용법을 설명하겠습니다)
원하는 곳에 변수를 사용할 수 있습니다.금고 열쇠 없이는 아무도 읽을 수 없다.
볼트 키 사용:
passing 인수를 통해 플레이북을 실행할 수 있습니다.
--ask-vault-pass: secret
또는 패스워드처럼 파일에 저장할 수 있습니다.txt와 어딘가에 숨는다.(CI 사용자에게 편리)
--vault-password-file=/path/to/file.txt
이 경우: 변수 yml을 포함하고 변수를 사용합니다.
- include_vars: /path/credential.yml
- name: Add deployment user
action: user name={{user.name}} password={{user.pass}}
ansible을 사용하여 ad-hoc 명령어를 투고합니다.그곳에도 함정이 있기 때문입니다.
먼저 대부분의 Linux 시스템에서 사용할 수 있는mkpasswd 유틸리티를 사용하여 암호화된 비밀번호를 생성합니다.
mkpasswd --method=SHA-512
그런 다음 ansible ad-hock 명령을 실행합니다.
ansible all -m user -a 'name=testuser shell=/bin/bash \
comment="Test User" password=$6$XXXX' -k -u admin --sudo
단, 다음 사항을 확인합니다.
- 명령어는 작은 따옴표로 묶어서 이중으로 묶지 않으면 암호가 작동하지 않습니다.
- 를 사용하여 실행한다.
--sudo
또는 다음과 같은 오류가 발생합니다.useradd: cannot lock /etc/passwd; try again later
)
사용자에 대한 임의 암호 생성
먼저 사용자 변수를 정의한 후 다음을 따라야 합니다.
작업:
- name: Generate Passwords
become: no
local_action: command pwgen -N 1 8
with_items: '{{ users }}'
register: user_passwords
- name: Update User Passwords
user:
name: '{{ item.item }}'
password: "{{ item.stdout | password_hash('sha512')}}"
update_password: on_create
with_items: '{{ user_passwords.results }}'
- name: Save Passwords Locally
become: no
local_action: copy content={{ item.stdout }} dest=./{{ item.item }}.txt
with_items: '{{ user_passwords.results }}'
사용자 모듈에 대한 작업 정의는 최신 Ansible 버전에서 달라야 합니다.
tasks:
- user: name=test password={{ password }} state=present
위의 몇 가지 솔루션을 조합하여 암호화된 로컬 호환 볼트 파일에 저장된 일반 텍스트 암호를 기반으로 올바른 암호 해시를 자동으로 생성하는 플레이북을 만들었습니다.
---
- hosts: [your hosts]
tasks:
- include_vars: [path to your encrypted vault file]
- local_action: "command openssl passwd -salt '{{password_salt}}' -1 '{{password}}'"
register: password_hash
- user: >
name=[your username]
state=present
password="{{password_hash.stdout}}"
볼트 파일의 암호를 해독하려면 "--ask-vault-pass" 옵션을 사용하여 이 명령을 실행합니다(암호화된 볼트를 관리하는 방법에 대한 자세한 내용은 ansible-vault 참조).
전달하기 위한 암호화된 비밀번호 작성 방법password
Ansible로 바꿉니다.user
태스크(@Brendan Wood 코멘트):
openssl passwd -salt 'some_plain_salt' -1 'some_plain_pass'
결과는 다음과 같습니다.
$1$some_pla$lmVKJwdV3Baf.o.F0OOy71
의 예user
작업:
- name: Create user
user: name="my_user" password="$1$some_pla$lmVKJwdV3Baf.o.F0OOy71"
UPD: SHA-512를 사용한 암호화는 다음과 같습니다.
파이썬
$ python -c "import crypt, getpass, pwd; print crypt.crypt('password', '\$6\$saltsalt\$')"
$6$saltsalt$qFmFH.bQmmtXzyBY0s9v7Oicd2z4XSIecDzlB5KiA2/jctKu9YterLp8wwnSq.qc.eoxqOmSuNp2xS0ktL3nh/
펄
$ perl -e 'print crypt("password","\$6\$saltsalt\$") . "\n"'
$6$saltsalt$qFmFH.bQmmtXzyBY0s9v7Oicd2z4XSIecDzlB5KiA2/jctKu9YterLp8wwnSq.qc.eoxqOmSuNp2xS0ktL3nh/
루비
$ ruby -e 'puts "password".crypt("$6$saltsalt$")'
$6$saltsalt$qFmFH.bQmmtXzyBY0s9v7Oicd2z4XSIecDzlB5KiA2/jctKu9YterLp8wwnSq.qc.eoxqOmSuNp2xS0ktL3nh/
이를 Ansible ad-hoc 명령으로 수행하려면 다음을 수행합니다.
$ password='SomethingSecret!'
$ ansible 192.168.1.10 -i some_inventory -b -m user -a "name=joe_user \
update_password=always password=\"{{ \"$password\" | password_hash('sha512') }}\""
위의 명령어 출력:
192.168.1.10 | SUCCESS => {
"append": false,
"changed": true,
"comment": "Joe User",
"group": 999,
"home": "/home/joe_user",
"move_home": false,
"name": "joe_user",
"password": "NOT_LOGGING_PASSWORD",
"shell": "/bin/bash",
"state": "present",
"uid": 999
}
Mxx의 답은 맞지만 Python은crypt.crypt()
다른 운영체제가 관련되어 있는 경우(시스템에서 사용되는 glibc 해시 알고리즘과 관련됨) 방법은 안전하지 않습니다.
예를 들어 MacOS에서 해시를 생성하고 Linux에서 플레이북을 실행하면 작동하지 않습니다.이 경우 passlib()를 사용할 수 있습니다.pip install passlib
로컬에 인스톨 합니다).
from passlib.hash import md5_crypt
python -c 'import crypt; print md5_crypt.encrypt("This is my Password,salt="SomeSalt")'
'$1$SomeSalt$UqddPX3r4kH3UL5jq5/ZI.'
두 솔루션 모두 Ubuntu를 제어하는 Mac에서 직접 작동하지 않았습니다.Mxx와 JoelB의 답변을 조합한 최신 Python 3 솔루션은 다음과 같습니다.
pip3 install passlib
python3 -c 'from passlib.hash import md5_crypt; \
print(md5_crypt.encrypt("This is my Password", salt="SomeSalt"))'
결과는 다음과 같습니다.$1$SomeSalt$UqddPX3r4kH3UL5jq5/ZI.
Mxx의 답변과 같습니다.
python3 -c 'from passlib.hash import sha512_crypt; \
print(sha512_crypt.encrypt("This is my Password", salt="SomeSalt"))'
결과:
$6$rounds=656000$SomeSalt$oYpmnpZahIsvn5FK8g4bFEAMGpEN114Fe6Ko4HvinzFaz5Rq2UXXoJZ9ZQyQoi9zaBo3gBH/FEAov3FHv48
패스워드 인증이 가능한 Linux 계정을 만들 수 있는 앤서블 플레이북을 만들었습니다.
AnsibleLinux AccountCreator 를 참조하십시오.
는 '비밀번호'를 사용하여 됩니다.mkpasswd
명령어를 입력합니다.mkpasswd
다양한 운영 체제에서 사용할 수 있습니다.
스크립트를 사용하기 위해서 필요한 순서는 다음과 같습니다.
<your_user_name>
★★★★★★★★★★★★★★★★★」<your_password>
에 inside inside insiderun.sh
원하는 사용자 이름과 비밀번호를 입력합니다.합니다.
inventory
할 수 .ansible은 사용자를 생성할 수 없습니다.실행합니다.
./run.sh
스크립트를 실행합니다.
파티에 늦은 건 알지만, 다른 해결책이 있어요.디스트로가 없는 경우 편리할 수 있습니다.--stdin
패스워드 바이너리로 지정합니다.
- hosts: localhost
become: True
tasks:
- name: Change user password
shell: "yes '{{ item.pass }}' | passwd {{ item.user }}"
loop:
- { pass: 123123, user: foo }
- { pass: asdf, user: bar }
loop_control:
label: "{{ item.user }}"
벨벨의 loop_control
는 사용자 이름만 출력합니다.플레이북 전체 또는 사용자 변수(사용할 수 있음vars_files:
안심이 되다
변수들이 잔뜩 쌓여있긴 하지만 여기서 작업하기 위한 어떤 대답도 얻을 수 없었습니다.따라서 "vaulted" 비밀번호를 사용하여 다음 오류가 발생한 사용자는 다음과 같습니다.
"msg": "Unexpected templating type error occurred on ({{ jinja template stuff }}): expected string or bytes-like object"
볼트 암호화 변수를 작동하려면 "string"을 통해 "|"을 연결해야 합니다.
- name: Creating user "{{ uusername }}" with admin access
user:
name: {{ uusername }}
password: "{{ upassword | string | password_hash('sha512', (upassword_salt | string)) }}"
groups: admin append=yes
when: assigned_role == "yes"
GitHub의 Ansible 솔루션 #24425를 기반으로 합니다.
사고하는 괴물의 대답과 마이클 에이셔의 코멘트를 바탕으로 코드를 작성합니다.
- name: Create user
hosts: all
become: true
tasks:
- name: "Creating Users and set password"
user:
name: <username>
update_password: always
password: password_hash('sha512')
groups: sudo
@madhead의 대답은 완벽하지 않다.
할 수 .changed
이 는 해결할수 .을 사용하다
- name: get all existing users info
getent:
database: passwd
# ---- @madhead 's answer ----
- name: Create madhead user
user:
name: madhead
password: "{{ 'password' | password_hash('sha512') }}"
shell: /bin/zsh
update_password: on_create
register: madhead
- name: Force madhead to change password
shell: chage -d 0 madhead
# origin:
# when: madhead.changed
# improved:
when: 'madhead' not in getent_passwd and madhead.changed
파티에 늦었네요:) 랜덤 패스워드를 사용하여 여러 로컬 사용자를 생성하는 무난한 플레이가 필요했습니다.제가 생각해낸 것은 위에서부터 몇 가지 예를 들어 몇 가지 변화를 조합한 것입니다.
create-user-with-password.yml
---
# create_user playbook
- hosts: all
become: True
user: root
vars:
#Create following user
users:
- test24
- test25
#with group
group: wheel
roles:
- create-user-with-password
/create/create-user-with-password/main.yml
- name: Generate password for new user
local_action: shell pwgen -s -N 1 20
register: user_password
with_items: "{{ users }}"
run_once: true
- name: Generate encrypted password
local_action: shell python -c 'import crypt; print(crypt.crypt( "{{ item.stdout }}", crypt.mksalt(crypt.METHOD_SHA512)))'
register: encrypted_user_password
with_items: "{{ user_password.results }}"
run_once: true
- name: Create new user with group
user:
name: "{{ item }}"
groups: "{{ group }}"
shell: /bin/bash
append: yes
createhome: yes
comment: 'Created with ansible'
with_items:
- "{{ users }}"
register: user_created
- name: Update user Passwords
user:
name: '{{ item.0 }}'
password: '{{ item.1.stdout }}'
with_together:
- "{{ users }}"
- "{{ encrypted_user_password.results }}"
when: user_created.changed
- name: Force user to change the password at first login
shell: chage -d 0 "{{ item }}"
with_items:
- "{{ users }}"
when: user_created.changed
- name: Save Passwords Locally
become: no
local_action: copy content={{ item.stdout }} dest=./{{ item.item }}.txt
with_items: "{{ user_password.results }}"
when: user_created.changed
언급URL : https://stackoverflow.com/questions/19292899/creating-a-new-user-and-password-with-ansible
'programing' 카테고리의 다른 글
WPF 싱글인스턴스의 베스트프랙티스 (0) | 2023.04.19 |
---|---|
C#에서 SQL Server에 대해 단순한 SQL 쿼리를 이스케이프하는 방법 (0) | 2023.04.19 |
열 F의 날짜가 오늘 날짜와 동일한 경우 조건부 형식을 사용하여 행 강조 표시 (0) | 2023.04.19 |
출력을 파일과 stdout으로 리디렉션하는 방법 (0) | 2023.04.19 |
공유 호스트의 "LOG_BACKUP" 때문에 데이터베이스의 트랜잭션 로그가 가득 찼습니다." (0) | 2023.04.19 |