วันนี้เรามาลอง AWX: Ansible but web GUI

สวัสดีครับ วันนี้โจทย์คือทำยังไงให้ L1 reset Mattermost password ให้พนักงานได้ ซึ่งปกติแล้วจะต้องให้คนที่สามารถเข้าถึง Admin account ได้รีเซ็ตให้เท่านั้นซึ่ง user ลืมกันบ่อย (555555 😭) เลย come up with AWX ครับ

วันนี้เรามาลอง AWX: Ansible but web GUI

สวัสดีครับ วันนี้โจทย์คือทำยังไงให้ 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-passwd

tasks/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:

Red Hat เปิดซอร์ส Ansible Tower ใช้ชื่อโครงการ AWX
Ansible ระบบคอนฟิกเซิร์ฟเวอร์ที่ได้รับความนิยมสูงถูก Red Hat ซื้อไปตั้งแต่ปี 2015 โดยสินค้าทำเงินของ Ansible คือ Ansible Tower ระบบจัดการระด
awx/INSTALL.md at devel · ansible/awx
AWX provides a web-based user interface, REST API, and task engine built on top of Ansible. It is one of the upstream projects for Red Hat Ansible Automation Platform. - ansible/awx

Read more

Restore MySQL DB ด้วย Binlog file

Restore MySQL DB ด้วย Binlog file

สวัสดีครับ วันนี้พลาดครับ เรื่องของเรื่องคือผมจะกลับมาเขียน blog เลยมาเช็ต blog ที่ผมรันไว้ ซึ่งผมรัน Ghost CMS blog บน docker แต่ดั๊นใช้ tag <:latest> ซึ่งใน compose file มีทั้ง ghost และ mysql ด้วยความที่รันไว้นานแล้ว และไม่ได้บันทึกอะไรไว้ มาถึงผมก็จัดแจง restart .... ไม่ขึ้นครับ

By Akachai Bunsorn