Setup & Guna Ansible di Windows Menggunakan Cygwin Portable

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

  1. Download Cygwin Portable Installer
  2. Edit .cmd file untuk tambah package yang aku nak, contoh: cmdCopyEditset CYGWIN_PACKAGES=ansible,openssh,sshpass,dos2unix
    • ansible → core Ansible
    • openssh → untuk SSH connection
    • sshpass → untuk password-based auth
    • dos2unix → elak masalah line ending Windows
  3. Run .cmd file → installer download semua dan setup dalam folder cygwin-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.

Isu 3: CHANGED walaupun command cuma baca info

  • Punca: shell module akan sentiasa mark CHANGED.
  • 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 dalam sshd_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 of CHANGED, set changed_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.

Leave a Comment