
At Logilab, we've been using Salt for one year to manage our own infrastructure. I wanted to use it to manage a specific configuration: C++ development. When I instantiate a Virtual Machine with a Debian image, I don't want to spend time to install and configure a system which fits my needs as a C++ developer:
- an editor such as Vim or Emacs ;
- compilers of course (GCC and Clang) ;
- tools for compiling and debugging (GDB, lldb, ccache, CMake, autotools, etc.) ;
- a decentralized version control system (DVCS) such as Mercurial ;
- several extensions for Mercurial (Evolve, rebase and others).
This article is a very simple recipe to get a C++ development environment, ready to use, ready to hack.
Give Me an Editor and a DVCS
Quite simple: I use the YAML file format used by Salt to describe what I want. To install these two editors, I just need to write:
vim-nox: pkg.installed emacs23-nox: pkg.installed
For Mercurial, you'll guess:
mercurial: pkg.installed
You can write these lines in the same init.sls file, but you can also decide to split your configuration into different subdirectories: one place for each thing. I decided to create a dev and editor directories at the root of my salt config with two init.sls inside.
That's all for the editors. Next step: specific C++ development packages.
Install Several "C++" Packages
In a cpp folder, I write a file init.sls with this content:
gcc: pkg.installed g++: pkg.installed gdb: pkg.installed cmake: pkg.installed automake: pkg.installed libtool: pkg.installed pkg-config: pkg.installed colorgcc: pkg.installed
The choice of these packages is arbitrary. You add or remove some as you need. There is not a unique right solution. But I want more. I want some LLVM packages. In a cpp/llvm.sls, I write:
llvm: pkg.installed clang: pkg.installed libclang-dev: pkg.installed {% if not grains['oscodename'] == 'wheezy' %} lldb-3.3: pkg.installed {% endif %}
The last line specifies that you install the lldb package if your Debian release is not the stable one, i.e. jessie/testing or sid in my case. Now, just include this file in the init.sls one:
# ... # at the end of 'cpp/init.sls' include: - .llvm
Organize your sls files according to your needs. That's all for packages installation. You Salt configuration now looks like this:
. |-- cpp | |-- init.sls | `-- llvm.sls |-- dev | `-- init.sls |-- edit | `-- init.sls `-- top.sls
Launching Salt
Start your VM and install a masterless Salt on it (e.g. apt-get install salt-minion). For launching Salt locally on your naked VM, you need to copy your configuration (through scp or a DVCS) into /srv/salt/ directory and to write the file top.sls:
base: '*': - dev - edit - cpp
Then just launch:
> salt-call --local state.highstate
as root.
And What About Configuration Files?
You're right. At the beginning of the post, I talked about a "ready to use" Mercurial with some HG extensions. So I use and copy the default /etc/mercurial/hgrc.d/hgext.rc file into the dev directory of my Salt configuration. Then, I edit it to set some extensions such as color, rebase, pager. As I also need Evolve, I have to clone the source code from https://bitbucket.org/marmoute/mutable-history. With Salt, I can tell "clone this repo and copy this file" to specific places.
So, I add some lines to dev/init.sls.
https://bitbucket.org/marmoute/mutable-history: hg.latest: - rev: tip - target: /opt/local/mutable-history - require: - pkg: mercurial /etc/mercurial/hgrc.d/hgext.rc: file.managed: - source: salt://dev/hgext.rc - user: root - group: root - mode: 644
The require keyword means "install (if necessary) this target before cloning". The other lines are quite self-explanatory.
In the end, you have just six files with a few lines. Your configuration now looks like:
. |-- cpp | |-- init.sls | `-- llvm.sls |-- dev | |-- hgext.rc | `-- init.sls |-- edit | `-- init.sls `-- top.sls
You can customize it and share it with your teammates. A step further would be to add some configuration files for your favorite editor. You can also imagine to install extra packages that your library depends on. Quite simply add a subdirectory amazing_lib and write your own init.sls. I know I often need Boost libraries for example. When your Salt configuration has changed, just type: salt-call --local state.highstate.
As you can see, setting up your environment on a fresh system will take you only a couple commands at the shell before you are ready to compile your C++ library, debug it, fix it and commit your modifications to your repository.
Comments
A more concise syntax to install a list of packages: