Package: concierge
conciergeis a small utility/daemon which is intended to help humans
to maintain their SSH configs.ContentsIntroductionDemoInstallationTemplatersconcierge-checkconciergeSyntax descriptionExamplesIntroductionThere is not problems with SSH config format: it works for decades and
is going to work for my children I guess. This utility will die, but one
will update his~/.ssh/configto access some network server.The problem with SSH that it really hard to scale. I am not quite sure
about other people jobs, but on my current and previous jobs I was
used to maintain quite large sets of records in SSH configs. Usual
deployment of some modern app consist several machines (let’s sayX)
and during development we are using several stage environments (let’s
sayY). So, frankly, you need to haveX * Yrecords in your~/.ssh/config. Only for work.Sometimes you need to jugle with jump hosts. Sometimes your stage is
moving to another set of IPs. Sometimes life happens and it is quite
irritating to manage these configuration manually.I did a lot of CSS stylesheets and SSH config management is pretty close
to that. I want to haveSASSfor SSH config. The main goal of this
tool is to provide user with some templating and clutter-free config
management in SASS way.DemoInstallationInstallation is quite trivial:$pipinstallconciergeor if you want to install it manually, do following:$gitclonehttps://github.com/9seconds/concierge.git$cdconcierge$pythonsetup.pyinstallBy default, no template support is going to be installed. If you want to
useMakoorJinja2, please refer toTemplaterssection.Also, it is possible to install support oflibnotify. Please install tool like
this:$pipinstallconcierge[libnotify]In that case, you will have a desktop notifications about any problem
with parsing of your~/.conciergerc. Yep, these Ubuntu popups on the
right top of the screen.If you have a problems with Pip installation (with modifiers, for
example), please update your pip and setuptools first.$pipinstall--upgradepipsetuptoolsEventually there will be no such problem anywhere.Please be noticed, thatconciergeisPython 3only tool. It
should work oncPython >= 3.3without any problems. Come on, Python
3.4 is bundled even with CentOS 7!After installation, 2 utilities will be available:concierge-checkconciergeTemplatersconciergecomes with support of additional templaters, you may plug
them in installing the packages from PyPI. At the time of writing,
support of following templaters was done:concierge-mako-
support ofMakotemplatesconcierge-jinja-
support ofJinja2templatesTo install them just do$pipinstallconcierge-makoAndconciergewill automatically recognizes support of Mako and now
one may useconcierge-umakofor her~/.conciergerc.concierge-checkconcierge-checkis a tool to verify syntax of your~/.conciergercfile. Please checkSyntax descriptionto get on
speed.Also, it supports a number of options but they are pretty trivial.Please remember, that bothconcierge-checkandconciergeuse syslog for logging data in process. Options like--debugor--verbosewill affect only stderr logging, syslog will have only
errors.conciergeconciergeis intended to work in daemon mode. It converts between
your~/.conciergercand destination~/.ssh/config(soInstallationmagic work in that way).I use systemd soconciergeis bundled to support it. To get an
instructions of how to use the tool with systemd, please run following:$concierge--systemdIt will printout an instructions. If you do not care, please run following:$eval"$(concierge--systemd--curlsh)"It will install systemd user unit and run concierge daemon automatically.conciergesupports the same options and behavior asconcierge-checkso please track your syslog for problems.Syntax descriptionWell, there is no big difference between plain oldssh_config(5)andconciergestyle. Base is the same so please check the table with
examples to understand what is going to be converted and how.Syntax came from the way I structure my SSH configs for a long time    .
Basically I am trying to keep it in the way it looks like hierarchical .Let’s grow the syntax. Consider following configHost m
    HostName 127.0.0.1

Host me0
    HostName 10.10.0.0

Host me1
    HostName 10.10.0.1

Host m me0 me1
    Compression no
    ProxyCommand ssh -W %h:%p env1
    User nineseconds

Host *
    Compression yes
    CompressionLevel 9So far so good. Now let’s… indent!Host m
    HostName 127.0.0.1

    Host me0
        HostName 10.10.0.0
        ProxyCommand ssh -W %h:%p env1

    Host me1
        HostName 10.10.0.1
        ProxyCommand ssh -W %h:%p env1

    Host m me0 me1
        Compression no
        User nineseconds

Host *
    Compression yes
    CompressionLevel 9It is still valid SSH config. And validconciergeconfig. Probably
you already do similar indentation to visually differ different server
groups. Let’s check what do we have here: we have prefixes, right. And
most of options are quite common to the server groups (environments).Now let’s eliminateHost m me0 me1block. This would be invalid SSH
config but validconciergercconfig. Also I am going to get rid of
useless prefixes and use hierarchy to determine full name (fullname = name + parent_name).Please be noticed that all operations maintain effectively the sameconciergercconfig.Host m
    Compression no
    HostName 127.0.0.1
    User nineseconds

    Host e0
        HostName 10.10.0.0
        ProxyCommand ssh -W %h:%p env1

    Host e1
        HostName 10.10.0.1
        ProxyCommand ssh -W %h:%p env1

Host *
    Compression yes
    CompressionLevel 9Okay. Do we need rudimentHost *section? No, let’s move everything
on the top. Idea is the same, empty prefix is*.Compression yes
CompressionLevel 9

Host m
    Compression no
    HostName 127.0.0.1
    User nineseconds

    Host e0
        HostName 10.10.0.0
        ProxyCommand ssh -W %h:%p env1

    Host e1
        HostName 10.10.0.1
        ProxyCommand ssh -W %h:%p env1By the way, you may see, that indentation defines parent is the same
way as Python syntax is organized. So following config is absolutely
equivalent.Compression yes

Host m
    Compression no
    HostName 127.0.0.1
    User nineseconds

    Host e0
        HostName 10.10.0.0
        ProxyCommand ssh -W %h:%p env1

    Host e1
        HostName 10.10.0.1
        ProxyCommand ssh -W %h:%p env1

CompressionLevel 9This is a basic. But if you installconciergewith support of Mako or
Jinja2 templates, you may use them in your~/.conciergerc.Compression yes
CompressionLevel 9

Host m
    Compression no
    HostName 127.0.0.1
    User nineseconds

    % for i in range(2):
    Host e${i}
        HostName 10.10.0.${i}
        ProxyCommand ssh -W %h:%p env1
    % endforThis is a Mako template I use. Please referMakoandJinja2documentation for details.By the way, if you want to hide some host you are using for grouping only,
please prefix it with-(-Host).ExamplesHere are some examples. Please do not hesitate to checkDemo, pause it,
look around.Source, converted from (~/.concierge)Destination, converted to (~/.ssh/config)Host name
    HostName 127.0.0.1Host name
    HostName 127.0.0.1Compression yes

Host name
    HostName 127.0.0.1Host name
    HostName 127.0.0.1

Host *
    Compression yesCompression yes

Host name
    HostName 127.0.0.1

Host *
    CompressionLevel 9Host name
    HostName 127.0.0.1

Host *
    Compression yes
    CompressionLevel 9Compression yes

Host name
    HostName 127.0.0.1

    Host q
        ViaJumpHost env1
        HostName node-1Host name
    HostName 127.0.0.1

Host nameq
    HostName node-1
    ProxyCommand ssh -W %h:%p env1

Host *
    Compression yesCompression yes

-Host name
    HostName 127.0.0.1

    Host q
        ViaJumpHost env1
        HostName node-1Host nameq
    HostName node-1
    ProxyCommand ssh -W %h:%p env1

Host *
    Compression yesCompression yes

Host m
    User nineseconds

    % for i in range(2):
    Host e${i}
        HostName 10.10.0.${i}
        ViaJumpHost gw2
    % endfor

    Protocol 2

Host blog
    User saHost blog
    User sa

Host me0
    HostName 10.10.0.0
    Protocol 2
    ProxyCommand ssh -W %h:%p gw2
    User nineseconds

Host me1
    HostName 10.10.0.1
    Protocol 2
    ProxyCommand ssh -W %h:%p gw2
    User nineseconds

Host *
    Compression yes