Pengalaman & Penyelesaian Isu yang Aku Hadapi
Pengenalan
Ansible ialah automation tool yang popular untuk provisioning, configuration management, dan deployment.
Masalahnya, Ansible dibina untuk Linux/Unix environment dan tidak secara rasmi disokong pada Windows.
Kalau guna Windows, biasanya kita kena:
- Pasang WSL (Windows Subsystem for Linux), atau
- Guna VM / Docker
Tapi dalam environment kerja aku, WSL & install global tak dibenarkan (Windows environment “restricted” habis).
Jadi aku pilih jalan Cygwin Portable — versi Cygwin yang boleh jalan terus dari USB/folder tanpa install.
1. Muat Turun & Setup Cygwin Portable + Ansible
- Download Cygwin Portable Installer
- Edit
.cmd
file untuk tambah package yang aku nak, contoh: cmdCopyEditset CYGWIN_PACKAGES=ansible,openssh,sshpass,dos2unix
ansible
→ core Ansibleopenssh
→ untuk SSH connectionsshpass
→ untuk password-based authdos2unix
→ elak masalah line ending Windows
- Run
.cmd
file → installer download semua dan setup dalam foldercygwin-portable
.
2. Buka Terminal Cygwin Portable
- Double-click
Cygwin-Terminal.bat
- Test:
ansible --version; sshpass -V
3. Buat Inventory & Playbook
inventory.ini
[jira]
jiral01 ansible_host=10.220.80.125
jiral02 ansible_host=10.220.80.12
jiral03 ansible_host=10.220.82.26
[all:vars]
ansible_user=user
ansible_password=passw0rd
ansible_become=true
ansible_become_method=sudo
ansible_become_password=passw0rd
ansible_python_interpreter=auto
ansible_ssh_common_args='-o ControlMaster=no -o ControlPersist=no -o PreferredAuthentications=password -o PubkeyAuthentication=no -o GSSAPIAuthentication=no -o KbdInteractiveAuthentication=no -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -o ConnectTimeout=8'
ansible_transfer_method=scp
playbook.yml
---
- name: Run command serentak pada semua server
hosts: all
gather_facts: false
strategy: free
tasks:
- name: Get OS & Java version
ansible.builtin.shell: "uname -a; java --version"
changed_when: false
4. Isu & Penyelesaian yang Aku Hadapi
Isu 1: ModuleNotFoundError: No module named 'grp'
- Punca: Cuba install Ansible dalam Python Windows → tak jalan sebab Python Windows tak ada modul POSIX.
- Penyelesaian: Guna Cygwin Portable untuk dapat environment POSIX.
Isu 2: Ansible lambat connect / stuck
- Punca: Ansible cuba detect Python interpreter di host (python discovery) & SSH negotiation guna GSSAPI.
- Penyelesaian:
- Lock
ansible_python_interpreter=/usr/bin/python3
dalam inventory. - Disable GSSAPI, ControlMaster, dan host key check melalui
ansible_ssh_common_args
. - Guna
scp
(ansible_transfer_method=scp
) untuk transfer file.
- Lock
Isu 3: CHANGED
walaupun command cuma baca info
- Punca:
shell
module akan sentiasa markCHANGED
. - Penyelesaian: Guna
changed_when: false
dalam task.
Isu 4: mux_client_request_session: read from master failed
- Punca: SSH ControlMaster mati → client tak dapat attach.
- Penyelesaian: Disable ControlMaster & ControlPersist.
Isu 5: Lambat sebab MOTD/banner & reverse DNS
- Penyelesaian: Disable reverse DNS di server (
UseDNS no
dalamsshd_config
) & skip host key prompt.
5. Cara Run
Ad-hoc test:
ansible jira -i inventory.ini -m shell -a 'uname -a' -f 10
Run playbook:
ansible-playbook -i inventory.ini playbook.yml -f 10
6. Tips Penting
- Simpan creds di
[all:vars]
kalau semua host guna login yang sama. - Kalau group ada creds berbeza, guna
[group:vars]
. - Convert file Windows → Linux line ending (
dos2unix inventory.ini playbook.yml
). - Kalau nak output jadi
OK
instead ofCHANGED
, setchanged_when: false
.
Kesimpulan
Walaupun Ansible tak rasmi support Windows, gabungan Cygwin Portable + sshpass + OpenSSH membolehkan kita automate server Linux terus dari Windows tanpa install global.
Proses ini memang ada banyak isu kecil, tapi lepas tweak SSH args, lock Python interpreter, dan disable feature tertentu, performance dia jadi laju & stabil.