Creating a new user and password with Ansible

后端 未结 22 1397
迷失自我
迷失自我 2020-12-22 17:00

I have an ansible task which creates a new user on ubuntu 12.04;

- name: Add deployment user
    action: user name=deployer password=mypassword
相关标签:
22条回答
  • 2020-12-22 17:30

    Just for completeness I will post the ad-hoc command using ansible since there is a catch there as well.

    First try generating an encrypted password using the mkpasswd utility that is available on most Linux systems:

    mkpasswd --method=SHA-512
    

    Then try the ansible ad-hock command:

    ansible all -m user -a 'name=testuser shell=/bin/bash \
         comment="Test User" password=$6$XXXX' -k -u admin --sudo
    

    But make sure:

    1. The command is in single quotes and NOT double otherwise your password will never work
    2. You run it with --sudo or you end up with an error like (useradd: cannot lock /etc/passwd; try again later)
    0 讨论(0)
  • 2020-12-22 17:31

    Combining a few solutions from above, I created a playbook that automatically generates correct password hashes based on plaintext passwords stored in an encrypted, local ansible vault file:

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

    Run this command using "--ask-vault-pass" option to decrypt your vault file (see ansible-vault for info on how to manage an encrypted vault).

    0 讨论(0)
  • 2020-12-22 17:33

    Generating random password for user

    first need to define users variable then follow below

    tasks:

    - 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 }}'
    
    0 讨论(0)
  • 2020-12-22 17:34

    Tried many utilities including mkpasswd, Python etc. But it seems like there is some compatibility issue with Ansible in reading HASH values generated by other tools. So finally it worked by ansible # value itself.

    ansible all -i localhost, -m debug -a "msg={{ 'yourpasswd' | password_hash('sha512', 'mysecretsalt') }}"

    Playbook -

    - name: User creation
      user: 
        name: username  
        uid: UID
        group: grpname
        shell: /bin/bash
        comment: "test user"
        password: "$6$mysecretsalt$1SMjoVXjYf.3sJR3a1WUxlDCmdJwC613.SUD4DOf40ASDFASJHASDFCDDDWERWEYbs8G00NHmOg29E0"
    
    0 讨论(0)
  • 2020-12-22 17:36

    I know that I'm late to the party, but there is another solution that I'm using. It might be handy for distros that don't have --stdin in passwd binary.

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

    Label in loop_control is responsible for printing only username. The whole playbook or just user variables (you can use vars_files:) should be encrypted with ansible-vault.

    0 讨论(0)
  • 2020-12-22 17:37

    Well I'am totally late to party :) I had the need for ansible play that creates multiple local users with randoms passwords. This what I came up with, used some of examples from top and put them together with some changes.

    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
    

    /roles/create-user-with-password/tasks/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
    
    0 讨论(0)
提交回复
热议问题