[bash] Ansible로 새 사용자 및 암호 생성

우분투 12.04에서 새 사용자를 만드는 ansible 작업이 있습니다.

- name: Add deployment user
    action: user name=deployer password=mypassword

예상대로 완료되지만 해당 사용자로 로그인하고 암호로 sudo를 시도하면 항상 잘못되었다고 설정합니다. 내가 뭘 잘못하고 있죠?



답변

user모듈 에 대한 Ansible의 매뉴얼을 읽으면 parameter 사용 방법에 대한 자세한 내용을 Ansible-examples github repo 로 안내합니다 .password

암호가 해시되어야 함을 알 수 있습니다.

- 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 명령 줄에 일반 텍스트로 된 암호가있는 경우 이는 섀도우 파일에 기록 된 암호 해시 가 잘못 되었음을 의미합니다 . 즉, 암호로 인증을 시도하면 해시가 일치하지 않습니다.

또한 암호 매개 변수의 일부 뉘앙스와이를 올바르게 사용하는 방법에 대해서는 Ansible FAQ 를 참조하십시오 .


답변

답장하기에는 너무 늦었지만 최근에 jinja2 필터가 암호화 된 암호 생성을 처리 할 수 ​​있다는 것을 알아 냈습니다. 내 main.yml에서 암호화 된 암호를 다음과 같이 생성하고 있습니다.

- 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 }}"

“uusername”및 “upassword”가 --extra-vars플레이 북 으로 전달되고 여기에서 jinja2 필터를 사용하여 전달 된 암호를 암호화 한 것을 알 수 있습니다.

나는 이것과 관련된 튜토리얼을 내 블로그에 추가했습니다.


답변

또 다른 해결책을 제안하고 싶습니다.

- 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

왜 더 낫습니까? 여기에서 이미 언급했듯이 Ansible 플레이는 멱 등성이어야합니다. 명령형의 일련의 동작이 아니라 원하는 상태, 선언적 스타일로 생각해야합니다. 결과적으로 여러 번 실행하고 동일한 결과, 동일한 서버 상태를 얻을 수 있어야합니다.

이 모든 것이 훌륭하게 들리지만 약간의 뉘앙스가 있습니다. 그중 하나는 사용자를 관리하는 것입니다. “원하는 상태”는 사용자를 생성하는 플레이를 실행할 때마다 해당 상태와 정확히 일치하도록 업데이트됨을 의미합니다. “업데이트 됨”이란 그의 비밀번호도 변경된다는 것을 의미합니다. 그러나 아마도 그것은 당신이 필요로하는 것이 아닙니다. 일반적으로 사용자를 생성하고 비밀번호를 한 번만 설정 및 만료해야하며, 추가 플레이를 실행해도 비밀번호를 업데이트하면 안됩니다.

다행히 Ansible 은이 문제를 해결 update_password하는 user모듈에 속성을 가지고 있습니다. 이것을 등록 된 변수 와 혼합 하면 사용자가 실제로 업데이트 될 때만 그의 암호를 만료시킬 수도 있습니다.

사용자의 셸을 수동으로 변경하면 (예를 들어 악의적 인 관리자가 자신의 플레이에서 강제 한 셸이 마음에 들지 않는다고 가정) 사용자가 업데이트되므로 암호가 만료됩니다.

또한 연극에서 일반 텍스트 초기 암호를 쉽게 사용할 수있는 방법에 유의하십시오. 다른 곳에서 인코딩하고 해시를 붙여 넣을 필요가 없습니다 . Jinja2 필터 를 사용할 수 있습니다 . 그러나 처음 로그인하기 전에 누군가가 로그인하는 경우 보안 결함이 될 수 있습니다.


답변

Ansible ‘user’모듈은 멱등적인 방식으로 사용자를 관리합니다 . 아래 플레이 북에서 첫 번째 작업은 사용자에 대해 state = present 를 선언 합니다. 첫 번째 작업의 ‘ register : newuser ‘는 두 번째 작업에서 사용자가 새 사용자 (newuser.changed == True)인지 기존 ( newuser.changed==False) 인지 확인 하여 암호를 한 번만 생성하는 데 도움이됩니다.

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


답변

이렇게 해봐

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"


답변

이 답변의 역할의 목적은 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 / tasks / 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"


답변

이것은 쉬운 방법입니다.

---
- 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