174 lines
7.6 KiB
Text
174 lines
7.6 KiB
Text
|
[[!meta title="cdist: Why we require Python 3.2 on the source host"]]
|
||
|
|
||
|
## Introduction
|
||
|
|
||
|
As [[cdist|software/cdist]] is getting more popular, more people are using
|
||
|
cdist and some questions arrive more often from newbies than others.
|
||
|
One of them is why we require having Python 3.2 on the source host.
|
||
|
If you are also wondering about the motivation, or you're screaming because
|
||
|
you only have Python 2.x or Python 3.1 available in your distribution, this
|
||
|
article is for you.
|
||
|
|
||
|
Note: Cdist does *not* require Python on the target hosts!
|
||
|
Note: Cdist requires only ssh and a posix shell on the targets.
|
||
|
|
||
|
|
||
|
## History of cdist
|
||
|
|
||
|
Because you may be one of the people who are screaming, I'm giving you
|
||
|
an overview about the whole development history of cdist, which will
|
||
|
make things more clear for you.
|
||
|
|
||
|
At the end of 2010 [I was claiming that most current configuration management
|
||
|
(***CM***) tools are not only overly complex designed, but also that their
|
||
|
implementations are way too
|
||
|
complex](http://www.usenix.org/event/lisa10/tech/slides/snyder_bof2.pdf).
|
||
|
This is definitely a strong statement, which I
|
||
|
also used to provoke people to thing about the current situation of CM.
|
||
|
|
||
|
The logical consequence of my statement was to try out, whether it's
|
||
|
actually possible to write a CM tool completly in a very simple manner.
|
||
|
For instance in posix shell script. This led to the first commit to the
|
||
|
newly born cdist repository:
|
||
|
|
||
|
commit 28a9807fe5e6bfa95015fe72456d63cbb2a5821f
|
||
|
Date: Thu Sep 16 02:20:35 2010 +0200
|
||
|
|
||
|
After a lot of discussions, design ideas, pictures on the whiteboard,
|
||
|
trying out different implementations, weighting up advantages of
|
||
|
each one, the first official release of cdist was put into public,
|
||
|
cdist 1.0.0:
|
||
|
|
||
|
tag 1.0.0
|
||
|
Date: Mon Mar 7 18:21:18 2011 +0100
|
||
|
|
||
|
Cdist 1.0.0 is completly implemented in posix shell and had almost all
|
||
|
features of the current cdist implementation. With one major drawback:
|
||
|
Performance. When running cdist 1.0.0 in parallel mode, the source host
|
||
|
easily became the bottleneck. A typical run of cdist 1.0.0 caused around
|
||
|
3500 - 5000 forks. Running in parallel mode with about 10-15 target hosts,
|
||
|
most time of a cdist run was spent in kernel space to handle the forks.
|
||
|
|
||
|
The logical sequence again was to search for the reason for the huge amount
|
||
|
of forks, which was easily detected: Every routine was a shell script on its
|
||
|
own, that required a new launch of the shell. Now, for some operations,
|
||
|
like working on the dependency tree, a lot of sub-routines were called, leading
|
||
|
to the huge number of forks.
|
||
|
|
||
|
We tried to minimise the number of forks by migrating from shell scripts to
|
||
|
shell functions, which was a big pain, when we realised that posix shell
|
||
|
does not have **local** variable support anymore. Posix states that you should
|
||
|
use shell scripts instead of shell functions, if you need distinct environments.
|
||
|
Which is exactly were we came from...
|
||
|
|
||
|
Thus we decided to switch to a different programming language for cdist's core,
|
||
|
but only for the core. For us it is very important to minimise the dependencies
|
||
|
on the target hosts: We do not want to install Ruby, Python, Java, libfoo or
|
||
|
anything that is not usually available on a freshly installed base system.
|
||
|
Cdist should be able to take over, as soon as the system is setup in a very
|
||
|
basic state.
|
||
|
|
||
|
The choice felt on Python, because it felt very mature and easy to use.
|
||
|
Additionally, Python 3 already provides a lot of functionality in its
|
||
|
base installation: Everything we were used to do in shell, could easily be
|
||
|
rewritten in plain Python 3. After **exactly** one year after
|
||
|
the initial commit, ***cdist 2.0.0***, a complete rewrite in Python 3
|
||
|
was finished and released:
|
||
|
|
||
|
tag 2.0.0
|
||
|
Date: Fri Sep 16 12:11:28 2011 +0200
|
||
|
|
||
|
|
||
|
## Now, why Python 3.2?
|
||
|
|
||
|
During the development of cdist 2.0, we had a lot of discussions
|
||
|
about clean design, pythonic ways of doing stuff (versus using the
|
||
|
shell approach in python) and which functions to use. In the beginning,
|
||
|
we were discussing about whether to settle for Python 2 or Python 3.
|
||
|
As we did not have any dependencies or old code that relies on Python 2,
|
||
|
the choice for the current stable tree, Python 3, was easy to make.
|
||
|
|
||
|
Python 3.2, in contrast to Python 3.1, includes the very good usable
|
||
|
[argparse module](http://docs.python.org/py3k/library/argparse.html),
|
||
|
as well as an enhanced variant of the
|
||
|
[os.makedirs](http://docs.python.org/py3k/library/os.html#os.makedirs)
|
||
|
method that supports the ***exist_ok*** parameter.
|
||
|
|
||
|
The argparse module is also available for Python 3.1, but not the
|
||
|
enhanced **os.makedirs** method. So we had to decide: Should we
|
||
|
integrate a simple workaround to support the previous Python 3 release,
|
||
|
Python 3.1, or shall we upset users with old Python installations?
|
||
|
|
||
|
To answer this question, we had a look at the current situation of
|
||
|
Python in various distributions.
|
||
|
|
||
|
## Python support in Linux/BSD
|
||
|
|
||
|
A very quick research showed the following results:
|
||
|
|
||
|
[[!table data="""
|
||
|
Distro | Version | Python version | Python 3? | Usable as cdist source host?
|
||
|
Archlinux | rolling release | 3.2.2 | yes | yes
|
||
|
CentOS | 6 | 2.6.6 | no | no
|
||
|
Debian | squeeze | 3.1.3 | yes | no
|
||
|
Debian | wheezy | 3.2.2 | yes | yes
|
||
|
Fedora | 14 | 3.1.2 | yes | no
|
||
|
Fedora | 15-17 | 3.2 - 3.2.2 | yes | yes
|
||
|
FreeBSD | Ports | 3.2.2 | yes | yes
|
||
|
Gentoo | rolling release | 3.2.2 | yes | yes
|
||
|
NetBSD | Ports | 3.1.4 | yes | no
|
||
|
OpenBSD: | -current | 2.7.1 | no | no
|
||
|
OpenBSD: | Ports | 3.2.2 | yes | yes
|
||
|
OpenSuse | 11.4 | 3.1.3 | yes | no
|
||
|
OpenSuse | 12.1 | 3.2.1 | yes | yes
|
||
|
Redhat | 6 | 2.6.6 | no | no
|
||
|
Slackware | 13.37 | 2.6.6 | no | no
|
||
|
Ubuntu | maverick (10.10) | 3.1.3 | yes | no
|
||
|
Ubuntu | natty (11.04) - precise (12.04) | 3.2 - 3.2.2 | yes | yes
|
||
|
"""]]
|
||
|
|
||
|
So we have the following situations:
|
||
|
|
||
|
* There are a lot of distros with Python 3.2 available (Archlinux,
|
||
|
Debian >= Wheezy, Fedora >= 15, FreeBSD, Gentoo, OpenBSD, OpenSuse,
|
||
|
Ubuntu >= 11.04)
|
||
|
* There are distros which do not have Python 3 at all (Centos, Redhat, Slackware)
|
||
|
* Python 3 is definitely needed, so requiring 3.1 or 3.2
|
||
|
does not make a difference
|
||
|
* There are only two cases, which would make it interesting to support
|
||
|
Python 3.1: Debian Squeeze (currently stable) and NetBSD.
|
||
|
* As I've been a long time Debian user, I understand this may be a bit
|
||
|
annoying, because it's unclear, when wheezy will become stable.
|
||
|
On the other hand, you can easily install python 3.2 from source to
|
||
|
anywhere, like you'd do in the situation, when you wouldn't have
|
||
|
python 3 at all.
|
||
|
* Another point speaking against 3.1 support for Debian is the fact that
|
||
|
distributions should support the user and not developers should support
|
||
|
distributions that ship old software (there's nothing against supporting
|
||
|
old **and** new versions, though). That's by the way one of the reasons
|
||
|
why I moved away from Debian...
|
||
|
* I am short on experience regarding NetBSD, but installing via source
|
||
|
shouldn't be an issue either.
|
||
|
|
||
|
To summarise: Support for Python 3.1 only makes sense for Debian Squeeze
|
||
|
and NetBSD at the moment. This requirement will soon [tm] be superseeded
|
||
|
and can easily be worked around by selecting one of many distributions
|
||
|
with more recent software packages. And that's the reason, why we settled
|
||
|
for Python 3.2.
|
||
|
|
||
|
## Btw, who is we?
|
||
|
|
||
|
You mave have noticed that I am often referring to **we** in this article.
|
||
|
The second main developer for cdist is
|
||
|
[Steven Armstrong](https://github.com/asteven), a sysadmin at
|
||
|
ETH Zurich and good friend of mine.
|
||
|
The discussions and development time we spent together was very valuable
|
||
|
for me as well for the whole cdist project and thus I wanted to use this
|
||
|
article to say
|
||
|
|
||
|
Thank you, Steven.
|
||
|
|
||
|
[Disclaimer: I do not work for ETH Zurich anymore, but for [local.ch](http://www.local.ch)]
|
||
|
|
||
|
[[!tag config sysadmin unix]]
|