{"id":6381,"date":"2019-12-08T13:40:32","date_gmt":"2019-12-08T11:40:32","guid":{"rendered":"https:\/\/u-labs.de\/portal\/?p=6381"},"modified":"2019-12-08T13:40:34","modified_gmt":"2019-12-08T11:40:34","slug":"path-in-ansible-veraendern","status":"publish","type":"post","link":"https:\/\/u-labs.de\/portal\/path-in-ansible-veraendern\/","title":{"rendered":"$PATH in Ansible ver\u00e4ndern"},"content":{"rendered":"<p>M\u00f6chte man Anwendungen (Binaries) oder Skripte global aus jedem Verzeichnis heraus aufrufen k\u00f6nnen, gibt es grunds\u00e4tzlich zwei M\u00f6glichkeiten:<\/p>\n<ol class=\"wp-block-list\">\n<li>Ablegen in einem Ordner, der in $PATH bereits hinterlegt ist. Hier gibt es verschiedene M\u00f6glichkeiten. \/usr\/local\/bin ist explizit f\u00fcr Programme ausgelegt, die nicht \u00fcber die Paketverwaltung installiert wurden.<\/li>\n<li>Man erstellt einen eigenen Ordner, der wiederum an die $PATH Variable angeh\u00e4ngt wird.<\/li>\n<\/ol>\n<p>#1 ist der bevorzugte Weg, wenn die Anwendung systemweit genutzt werden soll und root-Rechte zur Verf\u00fcgung stehen. Im folgenden Artikel m\u00f6chten wir uns Szenario 2 anschauen. H\u00e4ndisch w\u00fcrde man die mit einer Zeile wie <\/p>\n<div class=\"wp-block-syntaxhighlighter-code \">\n<pre class=\"brush: plain; title: ; notranslate\" title=\"\">\nexport PATH=&quot;$PATH:\/home\/vagrant\/bin&quot;\n<\/pre>\n<\/div>\n<p>in der .bashrc l\u00f6sen und anschlie\u00dfend die Datei mit source neu laden. Oder alternativ  \/etc\/environment, falls der Pfad global verf\u00fcgbar sein soll. In Ansible gestaltet sich dies etwas komplexer. <\/p>\n<h2 class=\"wp-block-heading\">$PATH f\u00fcr manuelle Nutzung anpassen<\/h2>\n<p>Soll $PATH f\u00fcr nachfolgende Anwendungen oder Nutzer ver\u00e4ndert werden, kann man den Pfad einfach in der jeweiligen Datei (z.B. \/etc\/environment) ersetzen. Hier verwenden wir daf\u00fcr die Ansible-Variable &#8222;bin&#8220;, die entsprechend gesetzt sein muss:<\/p>\n<pre class=\"wp-block-prismatic-blocks\"><code class=\"language-yaml\" data-line=\"\">  - name: Add {{bin}} to path\n    become: yes\n    lineinfile: &gt;\n        dest=\/etc\/environment\n        state=present\n        backrefs=yes\n        regexp=&#039;PATH=([&quot;]*)((?!.*?{{bin}}).*?)([&quot;]*)$&#039;\n        line=&quot;PATH=\\1\\2:{{bin}}\\3&quot;<\/code><\/pre>\n<h2 class=\"wp-block-heading\">Ver\u00e4nderten $PATH in Ansible nutzen<\/h2>\n<p>Wenn wir uns danach per SSH auf der Maschine einloggen, sehen wir \/home\/vagrant\/bin in der Ausgabe von echo $PATH. Doch in Ansible findet dies leider keine Anwendung f\u00fcr die darauffolgenden Befehle, wie folgendes Beispiel zeigt:<\/p>\n<pre class=\"wp-block-prismatic-blocks\"><code class=\"\" data-line=\"\">  vars:\n    - bin: \/home\/vagrant\/bin\n\n  tasks: \n  - name: Test task\n    file: \n      path: &quot;{{bin}}&quot;\n      state: directory\n\n  - name: Add {{bin}} to path\n    become: yes\n    lineinfile: &gt;\n        dest=\/etc\/environment\n        state=present\n        backrefs=yes\n        regexp=&#039;PATH=([&quot;]*)((?!.*?{{bin}}).*?)([&quot;]*)$&#039;\n        line=&quot;PATH=\\1\\2:{{bin}}\\3&quot;\n\n  - name: Check path\n    shell: echo $PATH\n\n  - name: Download exa\n    unarchive:\n      src: https:\/\/github.com\/ogham\/exa\/releases\/download\/v0.8.0\/exa-linux-x86_64-0.8.0.zip\n      dest: &quot;{{bin}}&quot;\n      remote_src: yes\n\n  - name: Test exa from PATH\n    shell: exa-linux-x86_64 --version<\/code><\/pre>\n<p>Das zu erwartende Ergebnis w\u00e4re: Die Binary &#8222;exa&#8220; wird heruntergeladen, in \/home\/vagrant\/bin entpackt und zeigt uns am Schluss die Version 0.8.0 an, da der Pfad zuvor global in $PATH hinterlegt wurde. Stattdessen ist eine Fehlermeldung zu sehen:<\/p>\n<div class=\"wp-block-syntaxhighlighter-code \">\n<pre class=\"brush: plain; title: ; notranslate\" title=\"\">\nfatal: &#x5B;default]: FAILED! =&gt; {&quot;changed&quot;: false, &quot;cmd&quot;: &quot;&#039;\/bin\/bash -l&#039; -c &#039;exa-linux-x86_64 --version&#039;&quot;, &quot;msg&quot;: &quot;&#x5B;Errno 2] No such file or directory&quot;, &quot;rc&quot;: 2}\n<\/pre>\n<\/div>\n<p>L\u00e4sst man sich $PATH ausgeben, fehlt der Ordner. Dies liegt daran, dass Ansible eine eigene Shell startet. Dar\u00fcber hinaus handelt es sich um keine interaktive Login-Shell, die sich anders verh\u00e4lt. Beispielsweise wird die .bashrc nicht ausgef\u00fchrt. <\/p>\n<h3 class=\"wp-block-heading\">L\u00f6sung f\u00fcr Ansible<\/h3>\n<p>Um dieses Problem zu l\u00f6sen, gibt es zwei M\u00f6glichkeiten. Die wohl beste ist, einfach den vollen Pfad anzugeben. Das hei\u00dft: Zu beginn definiert man eine Variable, legt den Ordner an und l\u00e4dt darin die jeweiligen Binaries. In diesem Beispiel ist das die Variable &#8222;bin&#8220; aus obigem Beispiel. Sie wird dem exa-Beispielaufruf vorangestellt: <\/p>\n<pre class=\"wp-block-prismatic-blocks\"><code class=\"\" data-line=\"\">- name: Test exa from PATH\n  shell: &quot;{{ bin }}\/exa-linux-x86_64 --version&quot;<\/code><\/pre>\n<p>Nun erhalten wir die Version der Applikation:<\/p>\n<div class=\"wp-block-syntaxhighlighter-code \">\n<pre class=\"brush: plain; title: ; notranslate\" title=\"\">\n&quot;stdout_lines&quot;: &#x5B;&quot;exa v0.8.0&quot;]\n<\/pre>\n<\/div>\n<p><strong>Alternativ<\/strong> k\u00f6nnte man auch die Variable \u00fcber Ansibles eigene Umgebungsvariablen setzen:<\/p>\n<pre class=\"wp-block-prismatic-blocks\"><code class=\"\" data-line=\"\">- name: Test exa from PATH\n  shell: exa-linux-x86_64 --version\n  environment:\n    PATH: &quot;{{ ansible_env.PATH }}:{{bin}}&quot;<\/code><\/pre>\n<p>Dies gilt allerdings nur f\u00fcr den jeweiligen Task. M\u00f6chte man den Pfad in mehreren Tasks verwenden, m\u00fcsste er jeweils erneut gesetzt werden. Das Angeben eines absoluten Pfades erscheint mir daher einfacher. <\/p>\n","protected":false},"excerpt":{"rendered":"<p>M\u00f6chte man Anwendungen (Binaries) oder Skripte global aus jedem Verzeichnis heraus aufrufen k\u00f6nnen, gibt es grunds\u00e4tzlich zwei M\u00f6glichkeiten: Ablegen in einem Ordner, der in $PATH bereits hinterlegt ist. Hier gibt es verschiedene M\u00f6glichkeiten. \/usr\/local\/bin ist explizit f\u00fcr Programme ausgelegt, die nicht \u00fcber die Paketverwaltung installiert wurden. Man erstellt einen eigenen Ordner, der wiederum an die &#8230;<\/p>\n","protected":false},"author":5,"featured_media":6387,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[74,78],"tags":[755,75],"class_list":["post-6381","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-linux","category-software","tag-ansible","tag-linux"],"_links":{"self":[{"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/posts\/6381","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/users\/5"}],"replies":[{"embeddable":true,"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/comments?post=6381"}],"version-history":[{"count":3,"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/posts\/6381\/revisions"}],"predecessor-version":[{"id":6523,"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/posts\/6381\/revisions\/6523"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/media\/6387"}],"wp:attachment":[{"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/media?parent=6381"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/categories?post=6381"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/tags?post=6381"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}