DevOps in Python: Infrastructure as Python
By Moshe Zadka
()
About this ebook
You'll start by writing command-line scripts and automating simple DevOps-style tasks. You'll then move on to more advanced cases, like using Jupyter as an auditable remote-control panel, and writing Ansible and Salt extensions. This work also covers how to use the AWS API to manage cloud infrastructure, and how to manage Python programs and environments on remote machines.
Python was invented as a systems management language for distributed operating systems, which makes it an ideal tool for DevOps. Assuming a basic understanding of Python concepts, this book is perfect for engineers who want to move from operations/system administration into coding.
What You'll Learn
- Use third party packages and create new packages
- Create operating system management and automation code in Python
- Write testable code, and testing best practices
- Work with REST APIs for web clients
Who This Book Is For
Junior or intermediate sysadmin who has picked up some bash and Python basics.
Related to DevOps in Python
Related ebooks
Building REST APIs with Flask: Create Python Web Services with MySQL Rating: 0 out of 5 stars0 ratingsOpa Application Development Rating: 0 out of 5 stars0 ratingsCentOS High Performance Rating: 0 out of 5 stars0 ratingsLearning Puppet for Windows Server Rating: 0 out of 5 stars0 ratingsFlask Blueprints Rating: 0 out of 5 stars0 ratingsBeginning App Development with Flutter: Create Cross-Platform Mobile Apps Rating: 0 out of 5 stars0 ratingsNW.js Essentials Rating: 0 out of 5 stars0 ratingsLearn Data Analysis with Python: Lessons in Coding Rating: 0 out of 5 stars0 ratingsExtending Docker Rating: 0 out of 5 stars0 ratingsThe Business of iOS App Development: For iPhone, iPad and iPod touch Rating: 0 out of 5 stars0 ratingsPractical API Architecture and Development with Azure and AWS: Design and Implementation of APIs for the Cloud Rating: 0 out of 5 stars0 ratingsAWS Key Management Service and AWS CloudHSM Third Edition Rating: 0 out of 5 stars0 ratingsAdvanced Platform Development with Kubernetes: Enabling Data Management, the Internet of Things, Blockchain, and Machine Learning Rating: 0 out of 5 stars0 ratingsMastering PostgreSQL: From Basics to Expert Proficiency Rating: 0 out of 5 stars0 ratingsUnderstanding Azure Data Factory: Operationalizing Big Data and Advanced Analytics Solutions Rating: 0 out of 5 stars0 ratingsAWS CloudFormation A Complete Guide - 2021 Edition Rating: 0 out of 5 stars0 ratingsGoogle Cloud Platform Complete Self-Assessment Guide Rating: 1 out of 5 stars1/5Design Patterns in C#: A Hands-on Guide with Real-world Examples Rating: 0 out of 5 stars0 ratingsVMware vSphere PowerCLI Reference: Automating vSphere Administration Rating: 0 out of 5 stars0 ratingsPodman in Action: Secure, rootless containers for Kubernetes, microservices, and more Rating: 0 out of 5 stars0 ratingsC# Deconstructed: Discover how C# works on the .NET Framework Rating: 0 out of 5 stars0 ratingsDesigning Microservices with Django: An Overview of Tools and Practices Rating: 0 out of 5 stars0 ratingsHTML5 and JavaScript Projects: Build on your Basic Knowledge of HTML5 and JavaScript to Create Substantial HTML5 Applications Rating: 0 out of 5 stars0 ratingsLearn Docker - .NET Core, Java, Node.JS, PHP or Python: Learn Collection Rating: 5 out of 5 stars5/5Mastering Ansible: A Comprehensive Guide Rating: 0 out of 5 stars0 ratingsGitLab Cookbook Rating: 0 out of 5 stars0 ratingsDocker A Complete Guide - 2020 Edition Rating: 0 out of 5 stars0 ratingsGradle Effective Implementation Guide Rating: 3 out of 5 stars3/5Advanced API Security: Securing APIs with OAuth 2.0, OpenID Connect, JWS, and JWE Rating: 4 out of 5 stars4/5
Programming For You
Coding All-in-One For Dummies Rating: 4 out of 5 stars4/5Excel : The Ultimate Comprehensive Step-By-Step Guide to the Basics of Excel Programming: 1 Rating: 5 out of 5 stars5/5Python Programming : How to Code Python Fast In Just 24 Hours With 7 Simple Steps Rating: 4 out of 5 stars4/5SQL QuickStart Guide: The Simplified Beginner's Guide to Managing, Analyzing, and Manipulating Data With SQL Rating: 4 out of 5 stars4/5Learn to Code. Get a Job. The Ultimate Guide to Learning and Getting Hired as a Developer. Rating: 5 out of 5 stars5/5Python: Learn Python in 24 Hours Rating: 4 out of 5 stars4/5Grokking Algorithms: An illustrated guide for programmers and other curious people Rating: 4 out of 5 stars4/5C Programming For Beginners: The Simple Guide to Learning C Programming Language Fast! Rating: 5 out of 5 stars5/5Excel 101: A Beginner's & Intermediate's Guide for Mastering the Quintessence of Microsoft Excel (2010-2019 & 365) in no time! Rating: 0 out of 5 stars0 ratingsC Programming for Beginners: Your Guide to Easily Learn C Programming In 7 Days Rating: 4 out of 5 stars4/5Python: For Beginners A Crash Course Guide To Learn Python in 1 Week Rating: 4 out of 5 stars4/5C All-in-One Desk Reference For Dummies Rating: 5 out of 5 stars5/5Learn PowerShell in a Month of Lunches, Fourth Edition: Covers Windows, Linux, and macOS Rating: 5 out of 5 stars5/5Java: Programming: Your Step by Step Guide to Easily Learn Java in 7 Days Rating: 4 out of 5 stars4/5SQL All-in-One For Dummies Rating: 3 out of 5 stars3/5Ethical Hacking Rating: 4 out of 5 stars4/5HTML in 30 Pages Rating: 5 out of 5 stars5/5Spies, Lies, and Algorithms: The History and Future of American Intelligence Rating: 4 out of 5 stars4/5Algorithms For Dummies Rating: 4 out of 5 stars4/5
Reviews for DevOps in Python
0 ratings0 reviews
Book preview
DevOps in Python - Moshe Zadka
© Moshe Zadka 2019
Moshe ZadkaDevOps in Pythonhttps://doi.org/10.1007/978-1-4842-4433-3_1
1. Installing Python
Moshe Zadka¹
(1)
Belmont, CA, USA
Before we start using Python, we need to install it. Some operating systems, like Mac OS X and some Linux variants, have Python preinstalled. Those versions of Python, colloquially called system Python,
often make poor defaults for people who want to develop in Python.
For one thing, the version of Python installed is often behind latest practices. For another, system integrators will often patch Python in ways that can lead to surprises later. For example, Debian-based Python is often missing modules like venv and ensurepip. Mac OS X Python links against a Mac shim around its native SSL library. What those things means, especially when starting out and consuming FAQs and web resources, is that it is better to install Python from scratch.
We cover a few ways to do so and the pros and cons of each.
1.1 OS Packages
For some of the more popular operating systems , volunteers have built ready-to-install packages.
The most famous of these is the deadsnakes
PPA (Personal Package Archives ). The dead
in the name refers to the fact that those packages are already built – with the metaphor that sources are alive.
Those packages are built for Ubuntu and will usually support all the versions of Ubuntu that are still supported upstream. Getting those packages is done simply:
$ sudo add-apt-repository ppa:deadsnakes/ppa
$ sudo apt update
On Mac OS, the homebrew third-party package manager will have Python packages that are up to date. An introduction to Homebrew is beyond the scope of this book. Since Homebrew is a rolling release, the version of Python will get upgraded from time to time. While this means that it is a useful way to get an up-to-date Python, it makes for a poor target for reliably distributing tools.
It is also a choice with some downsides for doing day-to-day development. Since it upgrades quickly after a new Python releases, this means development environments can break quickly and without warning. It also means that sometimes code can stop working: even if you are careful to watch upcoming Pythons for breaking changes, not all packages will. Homebrew Python is a good fit when needing a well-built, up-to-date Python interpreter for a one-off task. Writing a quick script to analyze data, or automate some APIs, is a good use of Homebrew Python .
Finally, for Windows, it is possible to download an installer from Python.org for any version of Python.
1.2 Using Pyenv
Pyenv tend to be the highest Return on Investment for installing Python for local development. The initial setup does have some subtleties. However, it allows installing as many Python versions side by side as are needed. It allows managing how one will be accessed: on either per-user default or a per-directory default.
Installing pyenv itself depends on the operating system. On a Mac OS X, the easiest way is to install it via Homebrew. Note that in this case, pyenv itself might need to be upgraded to install new versions of Python.
On a UNIX-based operating system, such as Linux or FreeBSD, the easiest way to install pyenv is by using the curl|bash command:
$ PROJECT=https://github.com/pyenv/pyenv-installer \
PATH=raw/master/bin/pyenv-installer \
curl -L $PROJECT/PATH | bash
Of course, this comes with its own security issues and could be replaced with a two-step process:
$ git clone https://github.com/pyenv/pyenv-installer
$ cd pyenv-installer
$ bash pyenv-installer
where one can inspect the shell script before running, or even use git checkout to pin to a specific revision.
Sadly, pyenv does not work on Windows.
After installing pyenv, it is useful to integrate it with the running shell. We do this by adding to the shell initialization file (for example, .bash_profile):
export PATH=~/.pyenv/bin:$PATH
eval $(pyenv init -)
eval $(pyenv virtualenv-init -)
This will allow pyenv to properly intercept all needed commands.
Pyenv separates the notion of installed interpreters from available interpreters. In order to install a version,
$ pyenv install
For CPython,
An installed version is distinct from an available version . Versions can be available either globally
(for a user) by using
$ pyenv global 3.7.0
or locally by using
$ pyenv local 3.7.0
Local means they will be available in a given directory. This is done by putting a file python-version.txt in this directory. This is important for version-controlled repositories, but there are a few different strategies to manage those. One is to add this file to the ignored
list. This is useful for heterogenous teams of open source projects. Another is to check this file in, so that the same version of Python is used in this repository.
Note that pyenv, since it is designed to install versions of Python side by side, has no concept of upgrading
Python. In order to use a newer Python, it needs to be installed with pyenv and then set as the default.
By default, pyenv installs non-optimized versions of Python. If optimized versions are needed,
env PYTHON_CONFIGURE_OPTS="--enable-shared
--enable-optimizations
--with-computed-gotos
--with-lto
--enable-ipv6" pyenv install
will build a version that is pretty similar to binary versions from python.org.
1.3 Building Python from Source
The main challenge in building Python from source is that, in some sense, it is too forgiving. It is all too easy to build it with one of the built-in modules disabled because its dependency was not detected. This is why it is important to know what dependencies are that fragile, and how to make sure a local installation is good.
The first fragile dependency is ssl. It is disabled by default and must be enabled in Modules/Setup.dist. Carefully follow the instructions there about the location of the OpenSSL library. If you have installed OpenSSL via system packages, it will usually be in /usr/. If you have installed it from source, it will usually be in /usr/local.
The most important thing is to know how to test for it. When Python is done building, run ./python.exe -c 'import _ssl'. That .exe is not a mistake – this is how the build process calls the just-built executable, which is renamed to python during installation. If this succeeds, the ssl module was built correctly.
Another extension that can fail to build is sqlite . Since it is a built-in, a lot of third-party packages depend on it, even if you are not using it yourself. This means a Python installation without the sqlite module is pretty broken. Test by running ./python.exe -c 'import sqlite3'.
In a Debian-based system (such as Ubuntu), libsqlite3-dev is required for this to succeed. In a Red Hat-based system (such as Fedora or CentOS), libsqlite3-dev is required for this to succeed.
Next, check for _ctypes with ./python.exe -c 'import _ctypes'. If this fails, it is likely that the libffi headers are not installed.
Finally, remember to run the built-in regression test suite after building from source. This is there to ensure that there have been no silly mistakes while building the package.
1.4 PyPy
The usual
implementation of Python is sometimes known as CPython,
to distinguish it from the language proper. The most popular alternative implementation is PyPy. PyPy is a Python-based JIT implementation of Python in Python . Because it has a dynamic JIT (Just in Time) compilation to assembly, it can sometimes achieve phenomenal speed-ups (3x or even 10x) over regular Python.
There are sometimes challenges in using PyPy. Many tools and packages are tested only with CPython. However, sometimes spending the effort to check if PyPy is compatible with the environment is worth it if performance matters.
There are a few subtleties in installing Python from source. While it is theoretically possible to translate
using CPython, in practice the optimizations in PyPy mean that translating using PyPy works on more reasonable machines. Even when installing from source, it is better to first install a binary version to bootstrap.
The bootstrapping version should be PyPy, not PyPy3. PyPy is written in the Python 2 dialect. It is one of the only cases where worrying about the deprecation is not relevant, since PyPy is a Python 2 dialect interpreter. PyPy3 is the Python 3 dialect implementation, which is usually better to use in production as most packages are slowly dropping support for Python 2.
The latest PyPy3 supports 3.5 features of Python, as well as f-strings. However, the latest async features, added in Python 3.6, do not work.
1.5 Anaconda
The closest to a system Python
that is still reasonable for use as a development platform is the Anaconda Python . Anaconda is a so-called meta-distribution.
It is, in essence, an operating system on top of the operating system. Anaconda has its grounding in the scientific computing community, and so its Python comes with easy-to-install modules for many scientific applications. Many of these modules are nontrivial to install from PyPI, requiring a complicated build environment.
It is possible to install multiple Anaconda environments on the same machine. This is handy when needing different Python versions or different versions of PyPI modules.
In order to bootstrap Anaconda, we can use the bash installer, available from https://conda.io/miniconda.html . The installer will also modify ~/.bash_profile to add the path to conda, the installer.
Conda environments are created using conda create --name
1.6 Summary
Running Python program requires an interpreter installed on the system. Depending on the operating system, and needed versions, there are several different ways to install Python. Using the system Python is a problematic option. On Mac and UNIX systems, using pyenv is almost always the preferred option. On Windows, using the prepackaged installers from python.org is often a good idea.
© Moshe Zadka 2019
Moshe ZadkaDevOps in Pythonhttps://doi.org/10.1007/978-1-4842-4433-3_2
2. Packaging
Moshe Zadka¹
(1)
Belmont, CA, USA
Much of dealing with Python in the real world is dealing with third-party packages. For a long time, the situation was not good. Things have improved dramatically, however. It is important to understand which best practices
are antiquated rituals, which ones are based on faulty assumptions but have some merit, and which are actually good ideas.
When dealing with packaging, there are two ways to interact. One is to be a consumer,
wanting to use the functionality from a package. Another is to be the producer,
publishing a package. These describe, usually, different development tasks, not different people.
It is important to have a solid understanding of the consumer
side of packages before moving to producing.
If the goal of a package publisher is to be useful to the package user, it is crucial to imagine the last mile
before starting to write a single line of code.
2.1 Pip
The basic packaging tool for Python is pip . By default, installations of Python do not come with pip. This allows pip to move faster than core Python – and work with alternative Python implementations, like PyPy. However, they do come with the useful ensurepip module. This allows getting pip via python -m ensurepip. This is usually the easiest way to bootstrap pip.
Some Python installations, especially system ones, disable ensurepip. When lacking ensurepip, there is a way of manually getting it: get-pip.py. This is a downloadable single file that, when executed, will unpack pip.
Luckily, pip is the only package that needs these weird gyrations to install. All other packages can, and should, be installed using pip. This includes upgrading pip itself, which can be done with pip install --upgrade pip.
Depending on how Python was installed, its real environment
might or might not be modifiable by our user. Many instructions in various README files and blogs might encourage doing sudo pip install. This is almost always the wrong thing to do: it will install the packages in the global environment.
It is almost always better to install in virtual environments – those will be covered later. As a temporary measure, perhaps to install things needed to create a virtual environment, we can install to our user area. This is done with pip install --user.
The pip install command will download and install all dependencies. However, it can fail to downgrade incompatible packages. It is always possible to install explicit versions: pip install package-name==
If wheel is installed, pip will build, and usually cache, wheels for packages. This is especially useful when dealing with a high virtual environment churn, since installing a cached wheel is a fast operation. This is also especially useful when dealing with so-called native,
or binary,
packages – those that need to be compiled with a C compiler. A wheel cache will eliminate the need to build it again.
pip does allow uninstalling, with pip uninstall. This command, by default, requires manual confirmation. Except for exotic circumstances, this command is not used. If an unintended package has snuck in, the usual response is to destroy the environment and rebuild it. For similar reasons, pip install --ugprade is not often needed: the common response is to destroy and re-create the environment. There is one situation where it is a good idea: pip install --upgrade pip. This is the best way to get a new version of pip with bug fixes and new features.
pip install supports a requirements file,
pip install --requirements or pip