{"id":2271,"date":"2019-08-02T07:00:31","date_gmt":"2019-08-02T05:00:31","guid":{"rendered":"https:\/\/www.my-it-brain.de\/wordpress\/?p=2271"},"modified":"2021-02-20T12:49:17","modified_gmt":"2021-02-20T11:49:17","slug":"dns-konfiguration-mit-ansible","status":"publish","type":"post","link":"https:\/\/www.my-it-brain.de\/wordpress\/dns-konfiguration-mit-ansible\/","title":{"rendered":"DNS-Konfiguration mit Ansible"},"content":{"rendered":"\n<p>Um neue Linux-VMs mit einer funktionierenden und zu unserer Umgebung passenden DNS-Konfiguration zu provisionieren, habe ich mir eine kleine <a href=\"https:\/\/docs.ansible.com\/ansible\/latest\/user_guide\/playbooks_reuse_roles.html\" target=\"_blank\" rel=\"noreferrer noopener\" aria-label=\"Ansible-Rolle (\u00f6ffnet in neuem Tab)\">Ansible-Rolle<\/a> namens <em>resolv.conf<\/em> erstellt, welche ich im Folgenden vorstellen m\u00f6chte.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Die Rolle resolv.conf<\/h2>\n\n\n\n<pre class=\"wp-block-code\"><code># tree roles\/resolv.conf\nroles\/resolv.conf\n\u251c\u2500\u2500 handlers\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 main.yml\n\u251c\u2500\u2500 tasks\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 main.yml\n\u2514\u2500\u2500 templates\n    \u2514\u2500\u2500 resolv.conf.j2<\/code><\/pre>\n\n\n\n<p>Die Rolle kommt sehr minimalistisch daher und umfasst nur die zwingend erforderlichen Verzeichnisse und Dateien.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">tasks\/main.yml<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>---\n- name: make sure line 'dns=none' is set in \/etc\/NetworkManager\/NetworkManager.conf\n  ini_file:\n    path: \/etc\/NetworkManager\/NetworkManager.conf\n    state: present\n    no_extra_spaces: yes\n    section: main\n    option: dns\n    value: none\n    owner: root\n    group: root\n    mode: 0644\n    backup: yes\n  notify:\n  - reload NetworkManager\n\n- name: deploy resolv.conf template\n  template:\n    src: roles\/resolv.conf\/templates\/resolv.conf.j2\n    dest: \/etc\/resolv.conf\n    owner: root\n    group: root\n    mode: 0644\n    backup: yes\n  notify:\n  - reload NetworkManager<\/code><\/pre>\n\n\n\n<p>Um die Datei <em>\/etc\/resolv.conf<\/em> mit Ansible verwalten zu k\u00f6nnen, habe ich zuerst dem <a rel=\"noreferrer noopener\" aria-label=\" (\u00f6ffnet in neuem Tab)\" href=\"https:\/\/de.wikipedia.org\/wiki\/NetworkManager\" target=\"_blank\">NetworkManager<\/a> abgew\u00f6hnt, diese Datei zu anzufassen. Dazu habe ich das <a rel=\"noreferrer noopener\" aria-label=\" (\u00f6ffnet in neuem Tab)\" href=\"https:\/\/docs.ansible.com\/ansible\/latest\/user_guide\/modules.html\" target=\"_blank\">Ansible-Modul<\/a> <a rel=\"noreferrer noopener\" label=\" (\u00f6ffnet in neuem Tab)\" href=\"https:\/\/docs.ansible.com\/ansible\/2.9\/modules\/ini_file_module.html#ini-file-module\" target=\"_blank\">ini_file<\/a> verwendet, welche die ben\u00f6tigte Option <code>dns=none<\/code> in der Sektion <code>[main]<\/code> setzt.<\/p>\n\n\n\n<p>Der zweite Task nutzt das Modul <a rel=\"noreferrer noopener\" label=\"template (\u00f6ffnet in neuem Tab)\" href=\"https:\/\/docs.ansible.com\/ansible\/2.9\/modules\/template_module.html\" target=\"_blank\">template<\/a>, um aus der Datei unter <em>roles\/resolv.conf\/templates\/resolv.conf.j2<\/em> die Zielkonfiguration in der Datei <em>\/etc\/resolv.conf<\/em> auf dem Zielsystem zu erstellen. Aktuell enth\u00e4lt mein Template statischen Text und ich h\u00e4tte auch das Modul <a rel=\"noreferrer noopener\" label=\"copy (\u00f6ffnet in neuem Tab)\" href=\"https:\/\/docs.ansible.com\/ansible\/2.9\/modules\/copy_module.html\" target=\"_blank\">copy<\/a> nutzen k\u00f6nnen, um diese Datei auf das Zielsystem zu bringen. Ich verwende jedoch das template-Modul, um mir die M\u00f6glichkeit offen zu halten, durch Verwendung von <a rel=\"noreferrer noopener\" aria-label=\"Variablen (\u00f6ffnet in neuem Tab)\" href=\"https:\/\/docs.ansible.com\/ansible\/latest\/user_guide\/playbooks_variables.html\" target=\"_blank\">Variablen<\/a> den Inhalt dynamisch erstellen zu lassen.<\/p>\n\n\n\n<p>Mit dem Parameter <code>notify:<\/code> wird an zwei Stellen ein Handler namens &#8218;reload NetworkManager&#8216; benachrichtigt. Auf diesen gehe ich im n\u00e4chsten Abschnitt ein.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">handlers\/main.yml<\/h3>\n\n\n\n<p>Mit den <a rel=\"noreferrer noopener\" aria-label=\"Ansible Handlers (\u00f6ffnet in neuem Tab)\" href=\"https:\/\/docs.ansible.com\/ansible\/latest\/user_guide\/playbooks_intro.html#handlers-running-operations-on-change\" target=\"_blank\">Ansible Handlers<\/a> lassen sich Aktionen ausl\u00f6sen, welche nur dann ausgef\u00fchrt werden sollen, wenn durch einen Task \u00c4nderungen auf dem Zielsystem durchgef\u00fchrt wurden. Die Handler werden erst am Ende eines Playbooks abgearbeitet und nur einmal ausgef\u00fchrt, auch wenn Sie von mehreren Tasks \u00fcber \u00c4nderungen benachrichtigt wurden.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># cat resolv.conf\/handlers\/main.yml \n---\n  - name: reload NetworkManager\n    service:\n      name: NetworkManager\n      state: reloaded<\/code><\/pre>\n\n\n\n<p>Bei dem in diesem Text beschriebenen Beispiel f\u00fchrt der Handler mit dem Namen &#8218;reload NetworkManager&#8216; den darunter definierten Task aus. Jedoch nur dann wenn einer der beiden Tasks (oder beide) aus <em>tasks\/main.yml<\/em> zu einer \u00c4nderung auf dem Zielsystem gef\u00fchrt hat.<\/p>\n\n\n\n<p><strong>Es gilt zu beachten<\/strong>, dass Handler erst dann ausgef\u00fchrt werden, wenn alle Tasks erfolgreich ausgef\u00fchrt wurden. Dies kann in einigen F\u00e4llen die Fehlersuche etwas erschweren. Ich habe dazu ein Beispiel in <a rel=\"noreferrer noopener\" aria-label=\"Ansible: Up and Running (\u00f6ffnet in neuem Tab)\" href=\"https:\/\/www.oreilly.com\/library\/view\/ansible-up-and\/9781491979792\/\" target=\"_blank\">Ansible: Up and Running<\/a> von Rene Moser und Lorin Hochstein gefunden, welches ich hier gerne wiedergeben m\u00f6chte. Stellt euch vor, euer Playbook hat folgenden Ablauf:<\/p>\n\n\n\n<ol class=\"wp-block-list\"><li>Ihr f\u00fchrt ein Playbook aus<\/li><li>Einer der Tasks verwendet <code>notify<\/code> bei \u00c4nderungen<\/li><li>In einem folgenden Tasks tritt ein Fehler auf, welcher zum Abbruch der Verarbeitung f\u00fchrt<\/li><li>Ihr behebt das Problem und f\u00fchrt das Playbook erneut aus<\/li><\/ol>\n\n\n\n<p>Der Task aus Schritt 2 hat seine \u00c4nderungen bereits erfolgreich durchgef\u00fchrt. Bei der erneuten Ausf\u00fchrung des Playbooks wird sein Status daher OK und nicht CHANGED sein. Der Handler wurde jedoch nicht ausgef\u00fchrt, da die Verarbeitung zuvor abgebrochen wurde. Auch bei der erneuten Ausf\u00fchrung des Playbooks wird der Handler nicht mehr ausgef\u00fchrt, da der dazu erforderliche Task zu keiner \u00c4nderung im Zielsystem mehr f\u00fchrt.<\/p>\n\n\n\n<p>Hochstein schreibt, dass Handler meist genutzt werden, um Dienste neuzustarten oder deren Konfiguration neu zu laden. Dies kann selbstverst\u00e4ndlich auch erreicht werden, wenn man auf den Einsatz von Handlern verzichtet und einen Dienst am Ende des Playbooks explizit neustartet. Welches der bessere Weg ist, m\u00f6ge jeder f\u00fcr sich selbst entscheiden.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Fazit<\/h2>\n\n\n\n<p>Dies war eine meiner ersten Ansible-Rollen \u00fcberhaupt. Ob dies der geschickteste Weg ist, die DNS-Konfiguration herzustellen, oder ob es noch elegantere Ans\u00e4tze gibt, mag ich nicht abschlie\u00dfend beurteilen. Zumindest scheint auch diese L\u00f6sung robust zu sein und hat mich bisher nicht im Stich gelassen.<\/p>\n\n\n\n<p>Falls ihr Fragen oder Anregungen habt, hinterlasst gern einen Kommentar. Ich freue mich stets neue L\u00f6sungswege kennen zu lernen.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Um neue Linux-VMs mit einer funktionierenden und zu unserer Umgebung passenden DNS-Konfiguration zu provisionieren, habe ich mir eine kleine Ansible-Rolle namens resolv.conf erstellt, welche ich im Folgenden vorstellen m\u00f6chte. Die Rolle resolv.conf Die Rolle kommt sehr minimalistisch daher und umfasst nur die zwingend erforderlichen Verzeichnisse und Dateien. tasks\/main.yml Um die Datei \/etc\/resolv.conf mit Ansible verwalten<span class=\"continue-reading\"> <a href=\"https:\/\/www.my-it-brain.de\/wordpress\/dns-konfiguration-mit-ansible\/\">[Weiterlesen&#8230;]<\/a><\/span><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_metis_text_type":"","_metis_text_length":0,"_post_count":0,"footnotes":""},"categories":[532],"tags":[85,543,542,430,305,541,545],"class_list":["post-2271","post","type-post","status-publish","format-standard","hentry","category-ansible","tag-dns","tag-handlers","tag-ini_file","tag-osbn","tag-planet","tag-resolv-conf","tag-template"],"_links":{"self":[{"href":"https:\/\/www.my-it-brain.de\/wordpress\/wp-json\/wp\/v2\/posts\/2271","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.my-it-brain.de\/wordpress\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.my-it-brain.de\/wordpress\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.my-it-brain.de\/wordpress\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.my-it-brain.de\/wordpress\/wp-json\/wp\/v2\/comments?post=2271"}],"version-history":[{"count":5,"href":"https:\/\/www.my-it-brain.de\/wordpress\/wp-json\/wp\/v2\/posts\/2271\/revisions"}],"predecessor-version":[{"id":2772,"href":"https:\/\/www.my-it-brain.de\/wordpress\/wp-json\/wp\/v2\/posts\/2271\/revisions\/2772"}],"wp:attachment":[{"href":"https:\/\/www.my-it-brain.de\/wordpress\/wp-json\/wp\/v2\/media?parent=2271"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.my-it-brain.de\/wordpress\/wp-json\/wp\/v2\/categories?post=2271"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.my-it-brain.de\/wordpress\/wp-json\/wp\/v2\/tags?post=2271"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}