Saltstack script testing using docker

There are literally thousands of ways for a saltstack  script to go awry! One simple way to test these scripts is to create a single salt-master many salt-minions autmated testing rig.

First one needs a build script


 

#!/bin/bash
#
# build the docker images and start the test environment
# angelos@unix.gr
#
echo "Cleaning Up"
docker rm -f salt-master
for minion in 1 2 3
do
 docker rm -f salt-minion${minion}
done
echo "Building Master Image"
echo "Copying my ssh credentials to be used for git"
mkdir -p creds 2> /dev/null
cp $HOME/.ssh/id_rsa creds/
cp $HOME/.ssh/known_hosts creds/
cp $HOME/.gitconfig creds/gitconfig
docker build . 2>&1 | tee master.log
id=`grep 'Successfully built' master.log | cut -d" " -f 3`
if [ "X${id}" == "X" ]
then
 echo "Salt Master build failed"
 exit 1
fi
docker run -d \
 -h salt-master --name salt-master \
 -v $PWD/bath:/srv/salt \
 -v $PWD/pillar:/srv/pillar \
 --memory-swappiness=1 $id
docker tag -f ${id} salt-master
echo "Building Minion image"
docker build -f Dockerfile.minion . 2>&1 | tee minion.log
id=`grep 'Successfully built' minion.log | cut -d" " -f 3`
if [ "X${id}" == "X" ]
then
 echo "Salt Minion build failed"
 exit 1
fi
for minion in 1 2 3
do
 hash=`docker run -d \
 -h salt-minion${minion} --name=salt-minion${minion} \
 --link salt-master \
 --memory-swappiness=1 $id`
 docker tag -f ${id} salt-minion${minion}
done
docker ps

The big trick now is not so much the Dockerfiles that create the relevant docker images as much as each image’s startup script

Here is the salt-master’s docker CMD script


~/saltstack (master *% u=)$ cat master-start.sh 
#!/bin/bash

service rsyslog start
service salt-minion start
service salt-master start
service sshd start
echo "Sleeping a bit: 15 secs"
sleep 15
Echo "Auto-accepting All minion keys"
salt-key -A -y
echo "Going into infinity"
sleep infinity;true

Here is the salt-minions’ docker CMD script


 

~/saltstack (master *% u=)$ cat minion-start.sh 
#!/bin/bash
service rsyslog start
salt-minion --daemon --log-level debug
echo "Going into infinity"
sleep infinity;true

 

The above couple of almost brain dead scripts  will allow you to create an automated test platform for saltstack scripts.

 

 

 

 

Advertisements

SaltStack: encrypted VSphere Credentials

I got the idea from  https://clinta.github.io/random-local-passwords/

It integrates GPG GIT and SALT for relatively secure centralized credentials storage
You mileage will vary

Here is the diff to allow for storage of credentials in encrypted form for cloud.providers


*** /usr/lib/python2.6/site-packages/salt/cloud/clouds/vmware.py.old 2015-12-15 11:47:05.703214983 +0000
--- /usr/lib/python2.6/site-packages/salt/cloud/clouds/vmware.py 2015-12-15 12:56:18.067154711 +0000
***************
*** 67,72 ****
--- 67,73 ----
 import time
 import os.path
 import subprocess
+ import re
 
 # Import salt libs
 import salt.utils
***************
*** 197,202 ****
--- 198,212 ----
 port = config.get_cloud_config_value(
 'port', get_configured_provider(), __opts__, search_global=False, default=443
 )
+ ext_auth_method = config.get_cloud_config_value(
+ 'password_program', get_configured_provider(), __opts__, search_global=False, default=''
+ )
+ pw_store = config.get_cloud_config_value(
+ 'pw_store', get_configured_provider(), __opts__, search_global=False, default='/opt/passdb'
+ )
+ 
+ if ext_auth_method=='pass':
+ password=_get_pw_from_pass(username,pw_store)
 
 return salt.utils.vmware.get_service_instance(url,
 username,
***************
*** 3569,3571 ****
--- 3579,3605 ----
 return False
 
 return {datastore_cluster_name: 'created'}
+ 
+ 
+ 
+ def _get_pw_from_pass(pw_name, pw_store):
+     '''
+     Get a password, from pass utility ( GPG must be active) remember to patch pass with gpg secret
+     '''
+     my_env = os.environ
+     my_env["PASSWORD_STORE_DIR"] = pw_store
+ 
+     # synchonize first
+     devnull = open(os.devnull, 'w')
+     subprocess.call(['/usr/bin/pass','git', 'pull'],env=my_env,cwd=pw_store,stdout=devnull, stderr=devnull)
+ 
+     pw_file = '{0}/{1}.gpg'.format(pw_store, pw_name)
+     log.info("trying to get pass from '{0}'".format(pw_file))
+     if os.path.isfile(pw_file):
+         log.info("trying to get pass for '{0}'".format(pw_name))
+         proc = subprocess.Popen(["/usr/bin/pass",  pw_name], env=my_env,cwd=pw_store,stdout=subprocess.PIPE)
+         pass_plaintext = proc.stdout.readline().rstrip()
+         return pass_plaintext
+     else:
+         log.info("GPGed password file not found '{0}'".format(pw_file))
+ 
+     return 'Pass Not Found'
+ 

ΣΚΟΡΠΙΕΣ ΣΚΕΨΕΙΣ ΓΙΑ ΤΗΝ ΟΙΚΟΝΟΜΙΑ ΤΩΝ ΕΛΛΗΝΩΝ

Οικονομικα 101

Κατ´ αρχήν ένα μάθημα οικονομικών:Οι κυβερνησεις πρεπει να δημιουργουν δουλειες κανοντας και λιγο πλατες σε επιχειρηματιες. Οi Αντιπολιτευσεις πρεπει να ελεγχουν τους προηγούμενους να μην ξεφεύγουν. η στιγμη που κυβερνηση/αντιπολιτευση μπορει να αλλαξουν θεση οποιαδηποτε στιγμη, _ΠΡΕΠΕΙ_ ολοι τους
να εχουν μια ηθικη βαση πανω στην οποια να μπορουν να στηριχτουν. Εκει ειναι η συγχρονη Ελληνικη ελλειψη. Βαφτιστε τωρα δεξια/αριστερα οτι θετε, δεν εχει νόημα πλέον.

Τώρα το μεγάλο ζήτημα στην Ελλάδα ειναι οι δουλειες.

Τη στιγμή που η Ελληνική οικονομία δεν μπορεί να τις δημιουργήσει μόνη της, χρειάζεται επενδύσεις απο έξω. Με τη τρέχουσα πολιτική κατάσταση και ανεξάρτητα απο την έκβαση του δημοψηφίσματος, αυτες οι επενδύσεις δεν θα έρθουν.

Κανένας λογικός άνθρωπος δεν πρόκειται να ρήξει τα λεφτά του στην Ελλάδα τη στιγμή που ποτέ δεν θα ξέρει σε τι νόμους περι εφορίας θα ξυπνησει ουτε τι θα έχει να αντιμετωπίσει ως αντιπάλους, βλέπε το κτήνος της λαϊκής γραφειοκρατιας. Ergo, οι μόνες επνδύσεις που θα γίνουν θα είναι απο το δημόσιο για δημόσιους λόγους.  Αυτος ειναι και ο αργος θανατος του ιδιωτικου τομεα τον οποίο και θα ζήσουμε. Οποιος δεν εχει βολευτει με κάποια ρύθμιση θα ζει απο κρατική ελεημοσύνη / ταμείο ανεργείας.

Κατ’ αυτην την έννοια οι κρατιστές νίκησαν κατά κράτος και ολοι εμείς και τα παιδιά μας χάσαμε… Και ο τουρισμος να ξανανθίσει, η ζημια που έγινε ειναι εξοντωτική για μια ολοκληρη γενια τουλαχιστον.
Το μονο στο οποιο εχουν να ελπιζουν τα παιδια μας ειναι μια ηρωϊκή έξοδος απο την χώρα.
Τελικα ας παραδεχτουμε επιτελους πως ο Λαος μας ειναι ανατολιτης.

Ψηφιζει τους σεϊχηδες του, τους φιλάει το χέρι, δουλευει δια του μπακσισίου και του φταίει πάντα η Δύση. Δεν υπαρχει περιπτωση με τις εκλογες να αλλαξουν οι πολιτικοι, ειδικα αφου ειναι μελη στον ιδιο συλλογο αλληλοεκτιμησης (Βουλη).

Η δημοκρατια μας, δηλαδη η βασικη παιδεία μας, ο εαυτός μας τελικά  χρειαζεται μια ριζικη επανεξεταση.

A shroud over the mind

On the knowledge economy of the Internet era.

Whereas I am a great proponent of technology and the internet as a collaboration medium I have come to realize that its effect is that of a shroud over the mind.

The sheer amount of data / quotes / papers available, makes us think that we indeed live in the knowledge era but this is not so. The data presented are only skin deep and there is rarely any way to breach the surface tension of the shroud and dive into the deep associations that make this data surface.

As such I am more apt to declare that the true knowledge based society was that of the Renaissance when people really tried to understand the mechanics of the world, whereas nowadays any fake authority drives people to make un-researched assumptions. I therefore propose a balanced approach to the so called “knowledge” economy: let’s delve back into simple things such as fine literature which teaches subtly and more deeply than any projector presentation.

Then we can use the Internet to its true and full potential, already armed with a critical mind: The Net is a powerful yet ultimately dangerous weapon, it is a substitute for what makes us truly human: our thinking. It is not accidental that there is an synchronous raise in number of PhDs   who are functional illiterates at the same time.

Harq’ al’Ada

I have been listening and reading all sorts of proposals on what Greece needs so that it can recover from its endemic recession. Many politicians and economics scientists, including the notorious Varoufakis, propose this recipe and that playbook that has worked in the past in this country or that region.

Quite frankly everything is going to fail for a single reason: Greece refuses to change the habits that are pushing towards the same fate as Atlantis. The country is rife with cronyism and sub educated supernumerary public sector employees to point out the most glaring problems.

What Greece needs is what the venerated Frank Herbert wrote throughout his work: the “Harq al’Ada”: the breaking of the habit. It is the same meme that Marvin Minsky denotes when he says: “Try to surprise yourself by the way you think today”. The old ways and the stale ancestor worshiping must end.

All that we Greeks knew, all that we know, is useless. We have to adapt or we will be overcome by our very own deficiencies  that is the gist of the 20th century and we are already treading water in the 21st. Adapting means changing fundamentally, in habits as well as values and I am calling on all intelligent people to get involved or Atlantis will no longer by an ancient myth.

Running ansible-playbook on a bastion host

Running ansible playbooks against AWS servers can be glacially slow because of the many SSH connections, even when using Bilbie’s recipe for an ssh proxy setup. What follows is a code snippet that replaces the local ansible-playbook command with a bash function that calls a remote script Run_ansible.sh. Run_ansible in turn massages the parameters in an edible-format creates a temp bash script and launches it.

Time savings for a largish deployment: down to 24 mins from 1hr 58Mins with exactly the same scripts!

Note: ansible-ssh-host is used in the inventory to denote the final target system


# if just local
ANSIBLE_PLAYBOOK=ansible-playbook

#
# Running the playbooks on the jump box
#
if [[ "$USE_JUMPBOX" == true ]]; then
    if [[ -n "$ANSIBLE_SSH_HOST" ]] && [[ -n "$JUMP_USER" ]] && [[ -n "$JUMP_BOX" ]]; then
        extra_vars=ansible_ssh_host=${ANSIBLE_SSH_HOST}

        # Now we need to pass parameters to the jump box
        ANSIBLE_PLAYBOOK=remote_ansible

        # massage the remote env
        # copy the playbooks over   
        ssh ${JUMP_USER}@${JUMP_BOX}  mkdir -p /tmp/deployment-ansible
        rsync -avuh --delete $WORKSPACE/ansible  ${JUMP_USER}@${JUMP_BOX}:/tmp/deployment-ansible/
        # copy the dispatcher script
        scp $WORKSPACE/Run_ansible.sh  ${JUMP_USER}@${JUMP_BOX}:
    else
        echo "ANSIBLE_SSH_HOST,JUMP_USER,JUMP_BOX must be set when USE_JUMPBOX is true" exit 1
    fi
fi
# --extra-vars must be the last parameter to ansible-playbook 
# or this hack will not work
function remote_ansible {
 ssh -t ${JUMP_USER}@${JUMP_BOX} /bin/bash -l ./Run_ansible.sh -vvv $@
}

And the helper script that runs on the bastion host. People with experience in quoting quotes over BASH driver SSH scripts will nod in understanding.


cat Run_ansible.sh
#/bin/bash

# quoting across SSH is a nightmare
params="$@"

params=`echo $params | sed -e "s/extra-vars/extra-vars \"/g"`
params="$params\""

echo "cd /tmp/deployment-ansible/ansible" > t
echo "ansible-playbook $params" >> t
bash t

Backup woes

Dirvish is a relatively nice disk backup program for linux and under certain conditions windows too. Unfortunately it likes to default to SSH to do the file transfers. It is not its fault directly because it is using RSYNC and RSYNC likes to use RSH/SSH unless one tweaks it.

But how do you actually tweak dirvish to use a native rsync protocol, that is without SSH as transport and without altering the code ? It only took me 1/2 a day to find out. Here is how

In every vault’s default.conf file there is the tree: line that specifies the top level the backup should start with. Plug there the rsync server’s module name prepended by colon like so

tree: :root

And of course you have to make sure that the rsync server contains a [root] stanza.

Done.

Δεν ελπιζω τιποτα ουτε και ειμαι λεφτερος

Ειμαι ενας πολίτης Β’ κατηγορίας που ζεί σε μια σχιζοειδή χώρα με Ανατολίτικες παραδόσεις αλλά Δυτική κουλτούρα. Β’ κατηγορίας γιατί δουλεύω ως κύνας ενώ ο πολίτης Α’ κατηγορίας που σκύβει το κεφάλι του στο εκάστοτε κόμμα πάντα έχει μια καβάντζα. Δεν είμαι λέφτερος γιατί η μία κυβέρνηση της Δεξιας αφησε εντελώς ανεξέλεγκτο το μεγάλο κεφάλαιο ενώ η άλλη κυβέρνηση της Αριστεράς άφησε ανεξέλεγκτους τους παρασιτο-συνδικαλιστές.

Δεν φταίει ο Συριζα ουτε η ΝΔ ουτε το ΠΑΣΟΚ. Φταίμε όλοι όσοι ανεχτήκαμε να βλέπουμε πολιτικάντηδες να τρώμε δίπλα μας και να μην τους μπουγελωνουμε με τη γαριδομακαρανόδα τους. Αλλά που να τους φτάσεις, ντουζίνες παρατρεχάμενοι και γλύφτες τους προστατεύουν.

Φταίμε όλοι εμείς που αντί των δυτικών παραδόσεων της αριστείας νοιώθουμε καλύτερα με τις ανατολίτικες παραδόσεις της οικογενειοκρατίας ακόμη και σε ιδρύματα όπως τα πανεπιστήμια. Πληρώνω τους φόρους για το γυιο/κορη του εκάστοτε καθηγητή να κάνει το παιδί του καθηγητή, αλλά ο γείτονας μου κολλάει στην τηλεόραση όταν εκθειάζεται κάποια τέτοια δυναστία στην TV λές και το δεν είναι και το δικό του παιδί που έχει αποκλειστεί απο την θέση αυτήν.

Φταίμε όλοι εμείς γιατί δεν μαστιγώνουμε τους δημοτικούς υπαλλήλους εκ’ δεξιών και ευωνύμων όταν τους βλέπουμε να λιάζονται εν ώρα εργασίας εν είδη αραβικής ευδαιμονίας καθώς η χώρα φλέγεται τριγύρω τους.

Δεν ελπίζω σε τίποτα, φοβάμαι για το παιδί μου, και το δικό σας.

Debugging

Staring at one’s code should be considered one of the most obscure and low yield methods of debugging computer programs. Furthermore it should considered downright dangerous to the tender psyche of programmers, especially when particularly virulent snippets of code stare back with vengeance,mayhem and just plain malevolence clearly observable in their glyphs.

Troglodytes vs Spacemen

There is a little urban legend that when the Americans went to space they invested $1M to create a space pen whereas the Soviets used pencils, because simplicity is best!

Apart from the fallacy of the premise because sharpening a carbon based pencil within very sensitive electrical equipment is more or less a recipe for disaster, there is another very important reason why I do not buy the simplicity clause.

The Americans and through immigration to the USA the whole world, are dreamers. They dreamt of a new frontier to explore, new science to be imagined and new technology to be had. On the other hand the Soviet mentality has never been the exploration of new frontiers. It has been the establishment of a new world order via a degenerative downward spiral to cave dwelling times. That is why it was the troglodytes’ pencil vs the spacemen’s pen.