Classes: Post Installation on Ansible
Managing many servers is not an easy job; we need to plan and create a good and manageable Ansible Playbook to implement Ansible properly.
Since then, we all agree that it is hard to manage a lot of servers at once. For example, you have installed 50 VMs/Servers with fresh OS and need to add some users to it.
Thus, In this class, we will learn how to add some users to the servers using Ansible Playbook.
How to Add users using Ansible Playbook
First, create a folder called ansible_try
Under folder ansible_try, create files for inventory and YML master playbook.
For the inventory file, please fill in the lists of the IP address server.
[allserver]
192.168.20.183
192.168.20.184
Then, create a YML file for the master playbook
- usergroup.yml
hosts: allservers
gather_facts: false
roles:
- usergroup
- after that, create 3 folders called tasks, files, and vars.
- The tasks folder, will be filled with the Ansible automation code
- Files folder will be filled with the SSH_Key_Pub and sudoers config file
- The Vars folder will be filled with variables files for Ansible automation code
Then, go to the Task folder and create a file as below:
main.ym
import_tasks: configureSudoers.yml
import_tasks: configureUsers.yml
__________________________________________________
configureSudoers.yml
name: Create Engineer Group
group: name=engineer state=present
ignore_errors: yes
become: true
tags:
- sudoersgroup
name: Engineer Group As Sudoers
copy: src=sudoers.d/00-engineer.j2 dest=/etc/sudoers.d/00-engineer
owner=root
group=root
mode=440
backup=no
ignore_errors: yes
become: true
tags:
- sudoersgroup
_________________________________________________
configureUsers.yml
name: Manage Users SA
user:
name: "{{ item.key }}"
state: "{{ item.value.state }}"
groups: "{{ item.value.groups }}"
shell: "{{ item.value.shell }}"
with_dict: '{{users_sa}}'
become: true
tags:
- usergroup
name: Manage User Keys SA
authorized_key:
user: "{{ item.key }}"
state: present
key: "{{ lookup('file', item.value.authkey) }}"
with_dict: '{{users_sa}}'
become: true
tags:
- usergroup
name: Remove inactive User
user:
name: "{{ item.key }}"
state: "{{ item.value.state }}"
remove: "{{ item.value.remove }}"
with_dict: '{{ inactiveUsers }}'
become: true
tags:
- usergroup
- remove
- After creating the task code, then go to the vars folder and create main.yml file
main.ymlusers_sa:
user1:
name: user1
state: present
groups: engineer
shell: /bin/bash
authkey: authkeys/user1.pub
users_noc:
user2:
name: user2
state: present
groups: engineer
shell: /bin/bash
authkey: authkeys/user.pubinactiveUsers:
alfian:
state: absent
remove: yes
- Then, goes to the Files Folder and create two subfolders “authkeys” and “sudoers.d”
- Under the folder “authkeys”, put the SSH_Key_Public according to it’s username, for example, user1.pub, user2.pub
- Next, under the “sudoers.d”, put the jinja file about the sudoers file configuration that will be copied to the server as below
- Create a file with name 00-engineer.j2
- Fill with below sudoers configuration
“%engineer ALL=NOPASSWD: ALL”
- Back to the top of folder ansible_try and run this command
ansible-playbook -i inventory usergroup.yml -u ubunt
u
- ansible-playbook is a command for running a playbook
- -i is for variable inventory
- -u is for the username used for SSH
- The Output will go like this
PLAY [allserver] *************************************************************************************************************************************
TASK [usergroup : Create Engineer Group] *************************************************************************************************************
ok: [192.168.20.184]
ok: [192.168.20.183]
TASK [usergroup : Engineer Group As Sudoers] *********************************************************************************************************
changed: [192.168.20.183]
changed: [192.168.20.184]
TASK [usergroup : Manage Users SA] *******************************************************************************************************************
ok: [192.168.20.183] => (item={'key': 'user1', 'value': {'name': 'user1', 'state': 'present', 'groups': 'engineer', 'shell': '/bin/bash', 'authkey': 'authkeys/user1.pub'}})
ok: [192.168.20.184] => (item={'key': 'user1', 'value': {'name': 'user1', 'state': 'present', 'groups': 'engineer', 'shell': '/bin/bash', 'authkey': 'authkeys/user1.pub'}})
ok: [192.168.20.183] => (item={'key': 'user2', 'value': {'name': 'user2', 'state': 'present', 'groups': 'engineer', 'shell': '/bin/bash', 'authkey': 'authkeys/user2.pub'}})
ok: [192.168.20.184] => (item={'key': 'user2', 'value': {'name': 'user2', 'state': 'present', 'groups': 'engineer', 'shell': '/bin/bash', 'authkey': 'authkeys/user2.pub'}})
TASK [usergroup : Remove inactive User] **************************************************************************************************************
ok: [192.168.20.183] => (item={'key': 'alfian', 'value': {'name': 'alfian', 'state': 'absent', 'remove': True}})
ok: [192.168.20.184] => (item={'key': 'alfian', 'value': {'name': 'alfian', 'state': 'absent', 'remove': True}})
PLAY RECAP *******************************************************************************************************************************************
192.168.20.183 : ok=5 changed=2 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
192.168.20.184 : ok=5 changed=2 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
- If you want just to send a command to get the output, like checking the OS version, just execute this command
ansible allserver -m shell -a "lsb_release -a" -i inventory -u ubuntu
- The output will go like this
192.168.20.184 | CHANGED | rc=0 >>
Distributor ID: Ubuntu
Description: Ubuntu 16.04.5 LTS
Release: 16.04
Codename: xenialNo LSB modules are available.
192.168.20.183 | CHANGED | rc=0 >>
Distributor ID: Ubuntu
Description: Ubuntu 16.04.5 LTS
Release: 16.04
Codename: xenialNo LSB modules are available.
- So with this Ansible command, you don’t need to sign in to every single server to check the OS version, and it will make your action faster, especially if the server you manage is quite a large scale.
Summary
To manage many servers, you need to learn how to run Ansible post the installation. Eager to know more? Visit our site.