วันนี้เรามาลอง AWX: Ansible but web GUI
สวัสดีครับ วันนี้โจทย์คือทำยังไงให้ L1 reset Mattermost password ให้พนักงานได้ ซึ่งปกติแล้วจะต้องให้คนที่สามารถเข้าถึง Admin account ได้รีเซ็ตให้เท่านั้นซึ่ง user ลืมกันบ่อย (555555 😭) เลย come up with AWX ครับ
สวัสดีครับ วันนี้โจทย์คือทำยังไงให้ L1 reset Mattermost password ให้พนักงานได้ ซึ่งปกติแล้วจะต้องให้คนที่สามารถเข้าถึง Admin account ได้รีเซ็ตให้เท่านั้นซึ่ง user ลืมกันบ่อย (555555 😭) เลย come up with AWX ครับ
AWX?
AWX มันคือ Ansible Tower opensource ครับ Web-Based GUI มี user management และ log result
คือแทนที่เราจะไป run Ansible ผ่าน cli ก็มาคลิ๊กๆใน AWX เอา อะไรประมาณนี้
ทำไมถึงใช้?
ง่ายต่อการใช้งาน, จำกัดการเข้าถึง task ต่างๆได้ตามแต่เลเวล, มี log


Howto
ผมขอข้ามการติดตั้ง AWX ไปเลยแล้วกัน อ่านวิธีได้ที่นี่ หรือ google search ได้เลยครับ จากนั้นเมื่อติดตั้ง AWX แล้ว เรามาเขียน Playbook กัน โดยตอนแรกผมคิดจะใช้ mmctl ครับ แต่จำไม่ได้แล้วว่าทำไมถึงโดน reject เลยใช้ mm OpenAPI แทน แต่ก็ไม่สามารถใช้ Password reset API แบบส่ง email ได้ (Server not allow postfix) เลยต้องใช้แบบ set password เอาขั้นแรกเลยก็ออกแบบ flow/scenario ก่อน โดยคิดไว้ประมาณนี้

Edit: จริงๆใน flow ต้องมี revoke all user session ด้วย แต่หลักๆครบแล้ว ผมเลยไม่แก้ละ
จากนั้นอ่าน doc ก่อน แล้วเมื่อคิดว่าโอเคแล้ว เรามาเขียน playbook กัน โดยผมจะใช้ Ansible role
init Ansible role
ansible-galaxy init mm-reset-passwdเมื่อรัน command นี้ เราก็จะได้ structure ประมาณนี้
Roles
└── mm-reset-passwd
├── defaults
│ └── main.yml
├── files
├── handlers
│ └── main.yml
├── meta
│ └── main.yml
├── README.md
├── tasks
│ └── main.yml
├── templates
├── tests
│ ├── inventory
│ └── test.yml
└── vars
└── main.ymlอีกไฟล์นึงคือ Playbook ซึ่งผมใช้ประมาณนี้
---
- name: Mattermopst password reset
hosts: all
gather_facts: no
roles:
- role: mm-reset-passwdtasks/main.yaml
---
- name: Admin Login
uri:
url: https://your.mattermost.url/api/v4/users/login
method: POST
body_format: json
body:
login_id: "{{ devops_user }}"
password: "{{ devops_password }}"
# Set var
register: admin_info
# เพื่อไม่ให้เปิดเผย request ซึ่งใน request มี user/password อยู่
no_log: true
# - debug:
# var: admin_info
# Ansible survey to ask target email and set as target_email var
- name: Get user ID via email
uri:
url: https://your.mattermost.url/api/v4/users/email/{{ target_email }}
method: GET
headers:
Authorization: "Bearer {{ admin_info.token }}"
register: users_info
# - debug:
# var: users_info
- name: Set temp password
set_fact:
target_new_password: "{{ lookup('password', '/dev/null chars=ascii_lowercase,ascii_uppercase,digits length=10') }}"
# - debug:
# msg: "The user's temporary password is set as {{ target_new_password }}"
#Once got the user detail then set user's name as "target_user" and target id as "user_id"
- name: Reset password
uri:
url: https://your.mattermost.url/api/v4/users/{{ users_info.json.id }}/password
method: PUT
headers:
Authorization: "Bearer {{ admin_info.token }}"
body_format: json
body:
new_password: "{{ target_new_password }}"
- debug:
msg: "The Mattermost Password for {{ users_info.json.email }} has been reset successfully, The new user's password is {{ target_new_password }}"
- name: Revoke all user session
uri:
url: https://your.mattermost.url/api/v4/users/{{ users_info.json.id }}/sessions/revoke/all
method: POST
headers:
Authorization: "Bearer {{ admin_info.token }}"
register: users_session
# Kill token
- name: Admin logout
uri:
url: https://your.mattermost.url/api/v4/users/logout
method: POST
headers:
Authorization: "Bearer {{ admin_info.token }}"no_log: true

ทั้งนี้ผมใช้ Ansible vault ในการ encrypt user/password ใน var/main.yaml เพื่อความปลอดภัย และใช้ AWX Survey ในการถาม Email แล้วเก็บไว้ที่ var ชื่อ {{target_email}}
Summary
จากนั้นเมื่อทดสอบจนทุกอย่างโอเคแล้ว ทำเอกสารคู่มือการใช้งานแล้วก็เริ่มให้ L1 ลองใช้งาน งานนี้จะช่วยลด ad hoc job ให้ทีมได้ และสามารถตรวจสอบย้อนหลังได้
หวังว่าเพื่อนๆจะสามารถนำไปประยุกต์ได้ไม่มากก็น้อยนะครับ
Ref:


