Skip to content

Instantly share code, notes, and snippets.

@maurizi
Last active December 16, 2022 11:34
Show Gist options
  • Star 27 You must be signed in to star a gist
  • Fork 5 You must be signed in to fork a gist
  • Save maurizi/325387aee9ea94fbf903 to your computer and use it in GitHub Desktop.
Save maurizi/325387aee9ea94fbf903 to your computer and use it in GitHub Desktop.
Running Ansible on Windows
@echo off
cygwin-shim.bat /bin/ansible-galaxy %*
@echo off
cygwin-shim.bat /bin/ansible-playbook %*
@echo off
set COMMAND=%1
REM If you used the standard Cygwin installer this will be C:\cygwin
set CYGWIN=%USERPROFILE%\.babun\cygwin
REM You can switch this to work with bash with %CYGWIN%\bin\bash.exe
set SH=%CYGWIN%\bin\zsh.exe
if not exist "%SH%" (
echo cygwin's sh.exe not found. Did you delete %CYGWIN% ?
exit /b 255
)
"%SH%" -c "[[ -x "%COMMAND%" ]]"
if not errorlevel 0 (
echo %COMMAND% not found. Did you uninstall it ?
exit /b 255
)
"%SH%" -c "%*"
@jonathanhle
Copy link

@woodcoder, this post really helped me out and I ended up handling the private_keys somewhat differently: https://gist.github.com/jonathanhle/ff41bafb7c66efd72f78

Seems to work for me just fine - I'm not sure why I have to cd to specific directory to chmod/setfacl the private_key, but it does work on my Windows machine. Hope it works for you.

@echo off

REM This is the default Babun install location.
set CYGWIN=%USERPROFILE%\.babun\cygwin

REM This is the default Babun shell, changed to bash if you need to
set SH=%CYGWIN%\bin\zsh.exe

REM You'll need to adjust the sed command below in order for this shim to work for your installation.  
REM Below the Babun install directory was C:\Users\Admin\.babun\ for the "Admin" user; if your user is FooUsername, change "Admin" to "FooUsername" in the sed commands

REM Setup a temp file where the default Vagrant private_key path is stored $HOME; if there's a previous entry in there, let's clear it
"%SH%" -c "cd $HOME && touch .babun_shim_vars && sed -i '/.*VAGRANT_PRIV_KEY_DIR.*/d' .babun_shim_vars"

REM Put the private_key path directory into the temp vars file we just setup: $HOME/.babun_shim_vars
"%SH%" -c "VAGRANT_PRIV_KEY_DIR=`echo %* | sed '0,/C:\/Users\/Admin\/\.babun\/cygwin/s///' | awk '{print $1}' | sed '0,/--private-key=/s///' | sed '0,/private_key/s///'` && echo export VAGRANT_PRIV_KEY_DIRECTORY=$VAGRANT_PRIV_KEY_DIR >> $HOME/.babun_shim_vars"

REM Change directory to where the private key is stored and set permissions
"%SH%" -c "source $HOME/.babun_shim_vars && cd $VAGRANT_PRIV_KEY_DIRECTORY && setfacl -s user::r--,group::---,other::--- private_key && ls -l private_key && pwd"

REM Run the playbook commands, except change the private_key location to the Cygwin path, instead of using the Windows file location reference.
"%SH%" -c "export ANSIBLE_SSH_ARGS='-o ControlMaster=no' && $HOME/ansible/bin/ansible-playbook `echo %* | sed '0,/C:\/Users\/Admin\/\.babun\/cygwin/s///'`"

@dannyim
Copy link

dannyim commented Jul 21, 2015

Thanks everyone, this post really helped me out.

The private key configuration got moved inside the auto-generated inventory file in vagrant 1.7.3.
Here is an updated version that works for me, I've only tested this on vagrant 1.7.4:

@echo off

REM If you used the stand Cygwin installer this will be C:\cygwin
set CYGWIN=%USERPROFILE%\.babun\cygwin

REM You can switch this to work with bash with %CYGWIN%\bin\bash.exe
set SH=%CYGWIN%\bin\zsh.exe

REM extract the location of the inventory file into an env variable.  Next, update the contents of the inventory file with the path to the private key file, relative to the cygwin root directory.  extract the private key path and change the permissions of the private key.

"%SH%" -c "export INV_FILE=`echo %* | sed -E 's/.*--inventory-file=([^ ]*).*/\1\/vagrant_ansible_inventory/'` && cat $INV_FILE | sed -E 's/(ansible_ssh_private_key_file=).*(\/home\/'$USER')([^ ]*)/\1\2\3/' > new_file; cp new_file $INV_FILE; rm new_file && export PRIV_KEY=`cat $INV_FILE | tr '\n' ' ' | sed -E 's/.*ansible_ssh_private_key_file=([^ ]*)/\1/'` && chmod 600 $PRIV_KEY; ls -la $PRIV_KEY"

"%SH%" -c "export ANSIBLE_SSH_ARGS='-o ControlMaster=no' && ansible-playbook %*"

@rivaros
Copy link

rivaros commented Jul 31, 2015

Here is a working solution for Vagrant 1.7.3+ on Windows, supports multiple hosts in inventory with multiple keys.
https://github.com/rivaros/ansible-playbook-shim

@yubrshen
Copy link

Problem of repeated project root path with ansible/vars/app with ansible-playbook.bat

Copied ansible-playbook.bat from
http://www.azavea.com/blogs/labs/2014/10/running-vagrant-with-ansible-provisioning-on-windows/

I got the following command expression, it's executable with vagrant/Windows/babun:

"d:\yushen\bin\.babun\cygwin\bin\bash.exe" -c "/bin/ansible-playbook --user=vagrant --connection=ssh --timeout=30 --limit=all --inventory-file=D:/yushen/dev/clojure/cas-reports/ansible/dev D:/yushen/dev/clojure/cas-reports/ansible/provision.yml"
ERROR: file could not read: /cygdrive/d/yushen/dev/clojure/cas-reports/D:/yushen/dev/clojure/cas-reports/ansible/vars/app

The error above seems that in the path for ansible/vars/app the path for my project d:/yushen/dev/clojure/cas-reports was repeated in front of it as /cygdrive/d/yushen/dev/clojure/cas-reports (typical cygwin expression!)

I examed the ansible/provision.yml but could not find any clue. Please help to give me some pointer. Thanks,

Here is the content of ansible/provision.yml portion related to app:


---
- hosts: app
  sudo: true
  vars_files:
    - vars/app

  tasks:
  - name: Create the project directory.
    file: state=directory path={{project_root}}

  - name: Install required system packages.
    apt: pkg={{item}} state=installed update-cache=yes
    with_items: "{{system_packages}}"

  - name: Get leiningen
    get_url: url=https://raw.github.com/technomancy/leiningen/stable/bin/lein dest="{{lein_dir}}"

  - name: Leiningen permissions
    file: path={{lein_dir}} mode=0755

  - name: Download project dependencies
    shell: su - vagrant -c 'cd /var/projects/{{project_name}}; lein deps'

  - name: Upload nREPL upstart config file
    copy: src=files/nrepl-upstart.conf dest=/etc/init/nrepl.conf

  - name: Start nREPL server
    service: name=nrepl state=started

  - name: Make app log directory
    file: state=directory path=/var/log/{{project_name}} owner=vagrant group=vagrant

@artcoder87
Copy link

where should i place the ansible-playbook.bat file?

@pwyoung
Copy link

pwyoung commented May 7, 2020

FWIW, I use this sort of command since I want to mimic logging in.

c:\cygwin64\bin\bash.exe -l -c "echo 'the above is from my login script'"
JAVA_HOME is C:\Java\jdk1.8.0_241
the above is from my login script

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment