I was going to setup Ansible to talk to one of my Windows servers. According to the Ansible page on Windows, the easiest way to install the windows side is to download the powershell script ConfigureRemotingForAnsible.ps1 and blindly run it on the windows server. It supposedly does all the magic to install and set things up. Should I run it? I don't know, but let's try to get it. We can inspect its code once we have the file.
NOTE: Setting up Ansible on windows is not the topic of this thread. All I want to show is a way to download a single file from a github repo.
Since I do not know how to do it, let's do some searching. And then we try each method out and see what's what.
Attempt I
There is a thread in stackoverflow called How to pull a single file from a server repository in Git? whichsuggested using the git clone command as in
git clone https://github.com/igniterealtime/Openfire.git \ Openfire/src/java/org/apache/mina/management/MINAStatCollector.java
Let's try it out:
raub@desktop:/tmp/rmoo$ git clone https://github.com/igniterealtime/Openfire.git \ Openfire/src/java/org/apache/mina/management/MINAStatCollector.java Cloning into 'Openfire/src/java/org/apache/mina/management/MINAStatCollector.java'... remote: Counting objects: 107450, done. remote: Compressing objects: 100% (53/53), done. Receiving objects: 14% (15868/107450), 61.11 MiB | 209.00 KiB/s [...] remote: Total 107450 (delta 32), reused 31 (delta 16), pack-reused 107380 Receiving objects: 100% (107450/107450), 802.60 MiB | 8.23 MiB/s, done. Resolving deltas: 100% (63893/63893), done. Checking connectivity... done. raub@desktop:/tmp/rmoo$ ls Openfire/src/java/org/apache/mina/management/MINAStatCollector.java build/ i18n/ webadmin/ LICENSE.txt README.md dbutil/ src/ webadmintld/ Makefile documentation/ starter/ xmppserver/ pom.xml raub@desktop:/tmp/rmoo$
Er, does that look like it grabbed the right thing? For some reason I thought the .java file was, well, a file and not a bunch of files and directories. At least I could swear writing .java files in vi so they were text files. Maybe I am wrong, so let's see if we can get the file I really want:
raub@desktop:/tmp/rmoo$ git clone https://github.com/ansible/ansible.git ansible /blob/devel/examples/scripts/ConfigureRemotingForAnsible.ps1 Cloning into 'ansible/blob/devel/examples/scripts/ConfigureRemotingForAnsible.ps 1'... remote: Counting objects: 236787, done. remote: Compressing objects: 100% (66/66), done. remote: Total 236787 (delta 33), reused 25 (delta 6), pack-reused 236712 Receiving objects: 100% (236787/236787), 73.53 MiB | 8.23 MiB/s, done. Resolving deltas: 100% (152234/152234), done. Checking connectivity... done. raub@desktop:/tmp/rmoo$ ls ansible/ raub@desktop:/tmp/rmoo$ ls ansible/blob/devel/examples/scripts/ConfigureRemotin$ForAnsible.ps1/ ansible-core-sitemap.xml .gitattributes RELEASES.txt bin/ .github/ requirements.txt CHANGELOG.md .gitignore ROADMAP.rst CODING_GUIDELINES.md .gitmodules setup.py contrib/ hacking/ shippable.yml CONTRIBUTING.md lib/ test/ COPYING .mailmap ticket_stubs/ .coveragerc Makefile tox.ini docs/ MANIFEST.in VERSION docsite_requirements.txt MODULE_GUIDELINES.md .yamllint examples/ packaging/ .git/ README.md raub@desktop:/tmp/rmoo$ ls ansible/blob/devel/examples/scripts/ConfigureRemotin$ForAnsible.ps1/ bin/ test/ docsite_requirements.txt ROADMAP.rst contrib/ ticket_stubs/ Makefile setup.py docs/ ansible-core-sitemap.xml MANIFEST.in shippable.yml examples/ CHANGELOG.md MODULE_GUIDELINES.md tox.ini hacking/ CODING_GUIDELINES.md README.md VERSION lib/ CONTRIBUTING.md RELEASES.txt packaging/ COPYING requirements.txt raub@desktop:/tmp/rmoo$
I do not know about you, but that not look like what I really wanted: a single file. On a second thought, that sure looks like the root for the ansible git repo:
I don't know about you but the files and directories sure look familiar.
I guess it is time to try something else.
Attempt II
Let's try something else: in StackOverflow there is a thread called Retrieve a single file from a repository, which suggests
git clone --no-checkout --depth 1 git@github.com:foo/bar.git && cd bar && git show HEAD:path/to/file.txt
For this attempt, we will try to get the file ConfigureRemotingForAnsible.ps1 I want:
git clone --no-checkout --depth 1 https://github.com/ansible/ansible.git && cd ansible && \ git show HEAD:examples/scripts/ConfigureRemotingForAnsible.ps1
Thing is that will just spit the file to the screen, literally:
raub@desktop:/tmp/rmoo$ git clone --no-checkout --depth 1 https://github.com/ansible/ansible.git && \ cd ansible && git show HEAD:examples/scripts/ConfigureRemotingForAnsible.ps1 Cloning into 'ansible'... remote: Counting objects: 5873, done. remote: Compressing objects: 100% (4282/4282), done. remote: Total 5873 (delta 962), reused 3652 (delta 660), pack-reused 0 Receiving objects: 100% (5873/5873), 7.13 MiB | 8.09 MiB/s, done. Resolving deltas: 100% (962/962), done. Checking connectivity... done. #Requires -Version 3.0 # Configure a Windows host for remote management with Ansible # ----------------------------------------------------------- # # This script checks the current WinRM (PS Remoting) configuration and makes # the necessary changes to allow Ansible to connect, authenticate and # execute PowerShell commands. # [...]
We could improve that by saving the file into a file. But how? The quickest solution I can think of is to pipe it to a file:
file="ConfigureRemotingForAnsible.ps1" ; git clone --no-checkout --depth 1 https://github.com/ansible/ansible.git && cd ansible && $(git show HEAD:examples/scripts/$file > $file)
will put $file inside the ansible dir:
raub@desktop:/tmp/rmoo/ansible$ ls ConfigureRemotingForAnsible.ps1 raub@desktop:/tmp/rmoo/ansible$
Of course we can do better, like placing it on the original pwd and delete the (now temporary) ansible dir. Something like
file="ConfigureRemotingForAnsible.ps1" ; git clone --no-checkout --depth 1 https://github.com/ansible/ansible.git && cd ansible && $(git show HEAD:examples/scripts/$file > ../$file) && cd .. && rm -rf ansible
should do just fine. But you do not have to believe on me; here's it in action:
raub@desktop:/tmp/rmoo$ file="ConfigureRemotingForAnsible.ps1" ; \ git clone --no-checkout --depth 1 https://github.com/ansible/ansible.git && \ cd ansible && $(git show HEAD:examples/scripts/$file > ../$file) && cd .. && rm -rf ansible Cloning into 'ansible'... remote: Counting objects: 5873, done. remote: Compressing objects: 100% (4282/4282), done. remote: Total 5873 (delta 962), reused 3652 (delta 660), pack-reused 0 Receiving objects: 100% (5873/5873), 7.13 MiB | 758.00 KiB/s, done. Resolving deltas: 100% (962/962), done. Checking connectivity... done. raub@desktop:/tmp/rmoo$ ls ConfigureRemotingForAnsible.ps1 raub@desktop:/tmp/rmoo$
Just to show this is not an accident, let's validate it by applying it to get the java source file we tried to get earlier.
raub@desktop:/tmp/rmoo$ file="MINAStatCollector.java" ; git clone --no-checkout --depth 1 https://github.com/igniterealtime/Openfire.git && cd Openfire && $(git show HEAD:src/java/org/apache/mina/management/$file > $file) Cloning into 'Openfire'... remote: Counting objects: 5291, done. remote: Compressing objects: 100% (4433/4433), done. remote: Total 5291 (delta 807), reused 3394 (delta 479), pack-reused 0 Receiving objects: 100% (5291/5291), 92.80 MiB | 8.24 MiB/s, done. Resolving deltas: 100% (807/807), done. Checking connectivity... done. raub@desktop:/tmp/rmoo/Openfire/Openfire$ head MINAStatCollector.java package org.apache.mina.management; import static org.jivesoftware.openfire.spi.ConnectionManagerImpl.EXECUTOR_FILTER_NAME; import org.apache.mina.core.service.IoService; import org.apache.mina.core.service.IoServiceListener; import org.apache.mina.core.session.IdleStatus; import org.apache.mina.core.session.IoSession; import org.apache.mina.filter.executor.ExecutorFilter; import org.apache.mina.filter.executor.OrderedThreadPoolExecutor; raub@desktop:/tmp/rmoo/Openfire$
I think we can improve it by making it more generic, which might be the subject of another post. Or something; I've been dragging on finishing this article for a few weeks now so I just want it gone.
Now what about something completely Ansible-ly?
Er, this Article is getting way longer than I originally planned. I will put the ansible side on another. How about that for raising your expectations and then expertly crushing them?