Package: aircraft
AircraftA collection ofpyinfrapackaged deploys that can be used
to declaratively configure services such as dnsmasq, apache2, and others. For now
only a few services are supported but more services such as GitLab or Jenkins
will become available in the future.Video IntroductionView on YouTubeConfigure PXE on a PiProject RationaleI work with infrastructure. The kind of infrastructure where you have a bunch
of baremetal machines that don't have an OS installed. Where the only access
you have at the onset are their BMC IPs. In that case, I need some sort of
machine provisioning tool that is agentless. Truly agentless, not just Ansible
agentless.In other situations, I might need to set up a CI/CD cluster. Now if you're like
me, you'd prefer to configure this cluster on top of as thin a technology stack
as possible (read: just bare OSes). The reason for this is because if you want
to deploy your CI/CD cluster on top of the best whiz-bang technology stack,
such as Kubernetes, you have to ensure that you have a CI/CD infrastructure in
place before you do...but that's exactly what's missing and what we're trying
to deploy! Again, what's needed here is an agentless infrastructure automation
tool.In both situations, I've found Ansible usable for a time. However, after years
of using it, I've come to find it cumbersome. With its supposed-declarative
YAML-based DSL slowly transforming into a turing-complete language. At this point
one wonders why we don't just use an already proper language itself like, oh
I don't know, Python?This is what brought be topyinfra. This project builds
on top of pyinfra's good-enough implementation. It is an attempt at replicating
the Ansible project structure that I've been using for years as exemplified in
another project calledrelaxdiego/cicd.Why Didn't You Just Use Terraform?I have ample experience with Terraform in the past too and I've maintained the
"Terraform for provisioning, Ansible for configuration" dichotomy for some time.
I maintain that stand for this project but have changed it to "Terraform for
provisioning, Aircraft for configuration."UsageThis project doesn't add wrappers around pyinfra, so once you get the hang
ofhow to use pyinfra,
then you can easily move on to some of the stuff I do in theexamples/dir
of this project.Once you're comfortable with pyinfra and you start browsing theexamples/dir, you'll see that all I'm doing is addingpyinfra packaged deploysthat you can use in your operations files. I've also created somepydanticmodels that go with the packaged deploys to help with validating inventory
data. Anyway, check out theexamples/directory before I keep blabbering
for ages.Developer's GuidePrerequisitesPython 3MakePrepare Your Python Environment (pyenv style; one-time only)You will need two additional dependencies for this style:pyenvpyenv-virtualenvOnce the above dependencies are installed, do the following:Install an isolated environment for your preferred Python version.python_version=<YOUR-PREFERRED-PYTHON-VERSION>
pyenv install --enable-shared $python_versionNOTE: For more available versions, runpyenv install --listCreate a virtualenv for this projectpyenv virtualenv $python_version aircraftAdd a.python-versionfile to this project dircat >.python-version<<EOF
aircrat
$python_version
EOFYour newly created virtualenv should now be automatically activated if your
prompt changed to the following:(aircraft) ubuntu@dev...or, should you happen to be usingdotfiles.relaxdiego.com,
if it changed to the following... via 🐍 <YOUR-PREFERRED-PYTHON-VERSION> (aircraft)Notice the things in parentheses that corresponds to the virtualenv you created
in the previous step. This is thanks to the coordination of pyenv-virtualenv and
the.python-versionfile in the rootdir of this project.If youcd ..orcdanywhere else outside your project directory, the virtualenv
will automatically be deactivated. When youcdback into the project dir, the
virtualenv will automatically be activated.Prepare Your Python Environment (venv style)If you'd rather manage your virtualenv manually, this section is for you.
Create your virtual environment:python3 -m venv ./venvActivate it in every shell session where you intend to run make or
the unit testssource ./venv/bin/activateInstall The DependenciesInstall all development and runtime dependencies.WARNING: Make sure you are using a virtualenv before running this command. Since it
uses pip-sync to install dependencies, it will remove any package that is not
listed in eitherrequirements-dev.inorsetup.py. If you followed the steps
in any of the Prepare Your Development Environment sections above, then you
should be in good shape.make dependenciesAdding A Development DependencyAdd it torequirements-dev.inand then run make:echo "foo" >> requirements-dev.in
make dependenciesThis will createrequirements-dev.txtand then install all dependenciesCommitrequirements-dev.inandrequirements-dev.txt. Both
files should now be updated and thefoopackage installed in your
local machine. Make sure to commit both files to the repo to let your
teammates know of the new dependency.git add requirements-dev.*
git commit -m "Add foo to requirements-dev.txt"
git push originAdding A Runtime DependencyAdd it toruntime_requirementslist in setup.py and then run:make dependenciesThis will createrequirements.txtand then install all dependenciesCommitsetup.pyand ignorerequirements.txt. We ignore the latter
since this is a library project which may be used with different versions
of its dependencues at development and run time.git add setup.py
git commit -m "Add bar to requirements"
git push originTesting and Building the CharmAfter any change in the library, you want to ensure that all unit tests
pass before building it. This can be easily done by running:make test buildViewing the Coverage ReportTo view the coverage report, run the tests first and then run:make coverage-serverThis will run a simple web server on port 5000 that will serve the files
in the auto-generatedhtmlcov/directory. You may leave this server running
in a separate session as you run the tests so that you can just switch back
to the browser and hit refresh to see the changes to your coverage down to
the line of code.Other Make GoalsRunmake helpor check out the contents ofMakefile.Running the Tests in Multiple Python VersionsMore often than not you want to be able to support more than one version of
Python. This is where tox comes in. Just run the following to get test
results for all Python versions listed in tox.ini's envlist config optiontoxReferencesSecureBoot-Compatible UEFI netbootdnsmasqFully Automated Ubuntu 20.04 InstallConfiguring PXE Network Boot Server on Ubuntu 18.04 LTSUbuntu Network installation with PXE