<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" xml:lang="de"><generator uri="https://gohugo.io/" version="0.99.0">Hugo</generator><title>Krausmueller.de</title><link href="https://www.krausmueller.de/" rel="alternate" type="text/html" title="HTML"/><link href="https://www.krausmueller.de/index.xml" rel="self" type="application/atom+xml" title="Atom"/><updated>2024-01-31T18:31:42+01:00</updated><id>https://www.krausmueller.de/</id><entry><title>Ansible Rolle hass für die Installation von Home Assistant</title><link href="https://www.krausmueller.de/2018/11/20/ansible-rolle-hass/" rel="alternate" type="text/html" hreflang="de"/><id>https://www.krausmueller.de/2018/11/20/ansible-rolle-hass/</id><published>2018-11-20T00:00:00+00:00</published><updated>2018-11-20T00:00:00+00:00</updated><content type="html">
&lt;p>Wie im letzten &lt;a
class="gblog-markdown__link"
href="/de/vorstellung-home-assistant-und-installationsvarianten"
title="Vorstellung Home Assistant und Installationsvarianten"
>Artikel&lt;/a> beschrieben verwende ich die manuelle Installation von Home Assistant. Um ein System schnell wieder herstellen zu können kann Ansible verwendet werden. Dazu habe ich eine &lt;a
class="gblog-markdown__link"
href="https://docs.ansible.com/ansible/2.7/user_guide/playbooks_reuse_roles.html"
title="Erklärung von Rollen in der Ansible Dokumentation"
>Rolle&lt;/a> erstellt. Diese ist als &lt;a
class="gblog-markdown__link"
href="https://github.com/Joe-Public/ansible-roles/tree/master/hass"
title="Rolle hass bei Github"
>Github Repository&lt;/a> verfügbar. Im gleichen Repository finden sich (in naher Zukunft) noch andere Rollen die für eine Home Assistant Installation sinnvoll sein können. Eine Beschreibung der Variablen befindet sich in der &lt;a
class="gblog-markdown__link"
href="https://github.com/Joe-Public/ansible-roles/blob/master/hass/README.md"
title="README bei Github"
>README&lt;/a>.&lt;/p>
&lt;p>Der grobe Ablauf lässt sich mit diesen Schritten zusammenfassen:&lt;/p>
&lt;ul>
&lt;li>benötigte Pakete installieren (abhängig von der Linux Distribution)&lt;/li>
&lt;li>Benutzer für Home Assistant anlegen&lt;/li>
&lt;li>Home Assistant in Virtual Environment installieren&lt;/li>
&lt;li>systemd Startscript erstellen und aktivieren&lt;/li>
&lt;/ul>
&lt;p>Ein Playbook das die Rolle nutzt könnte z.B. so aussehen:
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;span class="lnt">3
&lt;/span>&lt;span class="lnt">4
&lt;/span>&lt;span class="lnt">5
&lt;/span>&lt;span class="lnt">6
&lt;/span>&lt;span class="lnt">7
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-yaml" data-lang="yaml">&lt;span class="line">&lt;span class="cl">- &lt;span class="nt">hosts&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">hass&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">vars&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">hass_version&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;0.81.6&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">hass_user&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;pi&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">hass_virtualenv&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;/srv/hass&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">roles&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">hass&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;/p>
&lt;p>Dieses Playbook würde die Version 0.81.6 von Home Assistant in das Verzeichnis /srv/hass installieren. Diese Installation läuft unter dem User &amp;ldquo;pi&amp;rdquo;.&lt;/p>
&lt;p>Die Rolle wurde mit Hilfe von &lt;a
class="gblog-markdown__link"
href="https://molecule.readthedocs.io/en/latest/"
title="Molecule Webseite"
>Molecule&lt;/a> für folgende Distributionen getestet:&lt;/p>
&lt;ul>
&lt;li>Debian 9 Stretch&lt;/li>
&lt;li>Debian 10 Buster&lt;/li>
&lt;li>Ubuntu 18.04&lt;/li>
&lt;li>Ubuntu 18.10&lt;/li>
&lt;li>Fedora 28&lt;/li>
&lt;li>Centos 7&lt;/li>
&lt;/ul>
&lt;p>Produktiv genutzt habe ich die Rolle lediglich um eine Installation unter Raspbian (Debian 9 Stretch) durchzuführen. Auf den anderen erwähnten Distributionen sollte es aber ebenfalls funktionieren.&lt;/p></content><category scheme="https://www.krausmueller.de/tags/home-assistant" term="home-assistant" label="home assistant"/><category scheme="https://www.krausmueller.de/tags/ansible" term="ansible" label="ansible"/></entry><entry><title>Vorstellung Home Assistant und Installationsvarianten</title><link href="https://www.krausmueller.de/2018/10/30/vorstellung-home-assistant-und-installationsvarianten/" rel="alternate" type="text/html" hreflang="de"/><id>https://www.krausmueller.de/2018/10/30/vorstellung-home-assistant-und-installationsvarianten/</id><published>2018-10-30T00:00:00+00:00</published><updated>2018-10-30T00:00:00+00:00</updated><content type="html">
&lt;p>Mein Einstieg in die Heimautomatisierung war die Messung von Temperaturen und später die Schaltung von Steckdosen per 433 MHz Funk (&lt;a
class="gblog-markdown__link"
href="https://www.amazon.de/dp/B0087VS4H0/ref=twister_B06WGWBJTJ?_encoding=UTF8&amp;amp;psc=1"
title="Funksteckdosen bei Amazon"
>diese&lt;/a> und &lt;a
class="gblog-markdown__link"
href="https://www.amazon.de/Funksteckdosen-Funksteckdose-Fernbedienung-Selbstlern-Funktion-Haushaltsger%C3%A4te/dp/B016I3TZ58/ref=sr_1_6?s=diy&amp;amp;ie=UTF8&amp;amp;qid=1535724722&amp;amp;sr=1-6&amp;amp;keywords=funksteckdosen&amp;#43;433"
title="Funksteckdosen bei Amazon"
>diese&lt;/a>). Um die Werte zu betrachten und die Steckdosen zu schalten habe ich mit Python einen eigenen kleinen Webserver geschrieben. Für richtige Automatisierungen bietet es sich jedoch an ein bereits bestehendes System zu benutzen. Meine Wahl fiel auf &lt;a
class="gblog-markdown__link"
href="https://www.home-assistant.io/"
title="Webseite von Home Assistant"
>Home Assistant&lt;/a>.&lt;/p>
&lt;p>&lt;img
src="/images/home_assistant.jpg"
alt="Screenshot meiner Home Assistant Installation"
/>&lt;/p>
&lt;p>Home Assistant ist ein auf Python basierendes Open Source System mit dem viele Produkte zur Heimautomatisierung unterschiedlicher Hersteller in einem System zentral gesteuert werden können. Die verschiedenen Produkte werden als &lt;a
class="gblog-markdown__link"
href="https://www.home-assistant.io/components/"
>Components&lt;/a> eingebunden. Für diese können dann z.B. &lt;a
class="gblog-markdown__link"
href="https://www.home-assistant.io/components/automation/"
title="Automation"
>Automatisierungen&lt;/a> erstellt werden. Beim Eintreten von Bedingungen (&lt;a
class="gblog-markdown__link"
href="https://www.home-assistant.io/docs/automation/trigger/"
title="Automation Trigger"
>Trigger&lt;/a>) können diese automatisch ausgeführt werden. So kann z.B. automatisch Musik gestartet werden, wenn man nach Hause kommt. Die Seite &lt;a
class="gblog-markdown__link"
href="https://www.home-assistant.io/components/"
>Components&lt;/a> gibt einen Überblick über die Geräte die eingebunden werden können. Mit der Suche kann man schauen ob bereits vorhandene Produkte unterstützt werden und erhält die passende Dokumentation (z.B. &lt;a
class="gblog-markdown__link"
href="https://www.home-assistant.io/components/sonos/"
>Sonos&lt;/a>). Ähnliche Systeme sind z.B. &lt;a
class="gblog-markdown__link"
href="https://www.openhab.org/"
>openHAB&lt;/a>, &lt;a
class="gblog-markdown__link"
href="http://iobroker.net/"
>ioBroker&lt;/a> oder &lt;a
class="gblog-markdown__link"
href="https://fhem.de/"
>FHEM&lt;/a>.&lt;/p>
&lt;p>Es gibt verschiedene Varianten um Home Assistant zu &lt;a
class="gblog-markdown__link"
href="https://www.home-assistant.io/docs/installation/"
>installieren&lt;/a>. Es ist sehr beliebt Home Assistant auf einem Raspberry Pi (möglichst Raspberry Pi 3 Model B+) zu installieren. Zumindest zum Testen ist dies absolut ausreichend. Sollten die Ressourcen nicht ausreichen kann später immer noch auf ein leistungsfähigeres System gewechselt werden. Für die Installation auf einem Raspberry Pi stehen 3 (unterschiedlich komplexe) Möglichkeiten zur Auswahl:&lt;/p>
&lt;ol>
&lt;li>
&lt;p>&lt;a
class="gblog-markdown__link"
href="https://www.home-assistant.io/getting-started/"
>Hass.io&lt;/a>
Ein Image wird auf die SD-Karte geschrieben und der Raspberry Pi kann direkt davon gebootet werden. &lt;a
class="gblog-markdown__link"
href="https://www.home-assistant.io/hassio"
>Hass.io&lt;/a> verwendet Docker und kann durch Addons (weitere Docker Container) erweitert werden.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;a
class="gblog-markdown__link"
href="https://www.home-assistant.io/getting-started/"
>Hassbian&lt;/a>
Auch hier wird lediglich ein Image auf die SD-Karte geschrieben. Hassbian ist ein Raspian auf dem beim ersten Booten automatisch Home Assistant installiert wird.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;a
class="gblog-markdown__link"
href="https://www.home-assistant.io/docs/installation/raspberry-pi/"
>Manuelle Installation&lt;/a>
Die manuelle Installation kann theoretisch auf einem beliebigen Linux System erfolgen. Die verlinkte Anleitung zeigt wie auf einem Raspberry Pi vorgegangen werden kann.&lt;/p>
&lt;/li>
&lt;/ol>
&lt;p>Ich habe mich für Varainte 3, die manuelle Installation, entschieden. Mit dieser ist man am flexibelsten und kann z.B. auch die Komponente &lt;a
class="gblog-markdown__link"
href="https://www.home-assistant.io/components/lirc/"
>LIRC&lt;/a> verwenden, wofür ich mit Variante 1 keine Lösung gefunden habe.&lt;/p>
&lt;p>Um den Vorgang weitestgehend zu automatisieren habe ich &lt;a
class="gblog-markdown__link"
href="https://www.ansible.com/"
>Ansible&lt;/a> verwendet. Es gibt bereits eine fertige &lt;a
class="gblog-markdown__link"
href="https://github.com/fabaff/home-assistant-ansible"
>Rolle&lt;/a> für Home Assistant (untertstützt Debian/Raspbian und Fedora). Allerdings habe ich diese erst gefunden, nachdem ich bereits eine eigene Rolle angefangen hatte. Meine Rolle unterstützt lediglich Debian/Raspbian und ergibt im Zusammenspiel mit weiteren Rollen meine fertige Home Assistant Installation (weitere Rollen sind z.B. mosquitto oder lirc). Für die einzelnen Rollen sollen noch weitere erklärende Artikel folgen.&lt;/p></content><category scheme="https://www.krausmueller.de/tags/home-assistant" term="home-assistant" label="home assistant"/></entry><entry><title>Dynamischer DNS Client für IPv6</title><link href="https://www.krausmueller.de/2017/07/04/dynamischer-dns-client-fuer-ipv6/" rel="alternate" type="text/html" hreflang="de"/><id>https://www.krausmueller.de/2017/07/04/dynamischer-dns-client-fuer-ipv6/</id><published>2017-07-04T00:00:00+00:00</published><updated>2017-07-04T00:00:00+00:00</updated><content type="html">
&lt;p>&lt;a
class="gblog-markdown__link"
href="https://de.wikipedia.org/wiki/Dynamisches_DNS"
title="Wikipedia"
>Dynamisches DNS&lt;/a> wird genutzt um den DNS Eintrag für einen Host dessen IP sich regelmäßig und häufig ändert zu aktualisieren. Dies ermöglicht z.B. das Bereitstellen von Diensten hinter einem (V)DSL-Anschluss unter einem gleich bleibenden Namen. Es gibt mehrere Anbieter die einen solchen Dienst anbieten. Ich nutze z.B. &lt;a
class="gblog-markdown__link"
href="https://www.spdyn.de/"
title="Webseite von SPDyn"
>SPDyn&lt;/a>. Die Aktualisierung des DNS-Eintrags kann durch einen Client wie z.B. &lt;a
class="gblog-markdown__link"
href="https://sourceforge.net/p/ddclient/wiki/Home/"
title="ddclient bei sourceforge.net"
>ddclient&lt;/a> oder auch direkt über eine Fritzbox erfolgen. Für IPv4 Hosts ist das Verfahren einfach, die IP ist immer die des Routers der dann bestimmte Ports an interne Hosts weiterleitet (&lt;a
class="gblog-markdown__link"
href="https://de.wikipedia.org/wiki/Portweiterleitung"
title="Wikipedia"
>Portforwarding&lt;/a>). Da ich von meinem Provider einen &lt;a
class="gblog-markdown__link"
href="https://de.wikipedia.org/wiki/IPv6#Dual-Stack"
title="Wikipedia"
>Dual-Stack&lt;/a> Anschluss erhalten habe, hatte ich in der Vergangenheit auch einen &lt;a
class="gblog-markdown__link"
href="https://de.wikipedia.org/wiki/AAAA_Resource_Record"
title="Wikipedia"
>AAAA-Record&lt;/a> für IPv6 bei SPDyn angelegt. Worauf ich allerdings nicht achtete: mein Provider vergibt bei jedem Neuverbinden ein anderes IPv6 Präfix. Dadurch ändert sich also auch jedes mal die IPv6-Adresse meines internen Hosts. Aufmerksam auf diese Problematik wurde ich durch einen Fehler beim Erneuern meines Let&amp;rsquo;s Encrypt Zertifikats (vgl. &lt;a
class="gblog-markdown__link"
href="/de/alternativer-client-fuer-letsencrypt"
title="Alternativer Client für Let&amp;#39;s Encrypt"
>Artikel zu acme-tiny&lt;/a>).&lt;/p>
&lt;p>Wenn ein AAAA-Record vorhanden ist bevorzugt Let&amp;rsquo;s Encrypt seit kurzem diesen um die Domain zu verifizieren (&lt;a
class="gblog-markdown__link"
href="https://community.letsencrypt.org/t/preferring-ipv6-for-challenge-validation-of-dual-homed-hosts/34774"
title="Preferring IPv6 for challenge validation of dual-homed hosts"
>API Announcements&lt;/a>). Da mein vor langer Zeit angelegter AAAA-Record sich mittlerweile (schon oft) geändert hat, schlug das Erneuern des Zertifikats also fehl.&lt;/p>
&lt;pre class="shell">
Parsing account key...
Parsing CSR...
Registering account...
Already registered!
Verifying domain.com...
Traceback (most recent call last):
File "acme_tiny.py", line 199, in &lt;module>
main(sys.argv[1:])
File "acme_tiny.py", line 195, in main
signed_crt = get_crt(args.account_key, args.csr, args.acme_dir, log=LOGGER, CA=args.ca)
File "acme_tiny.py", line 150, in get_crt
domain, challenge_status))
ValueError: domain.com challenge did not pass: {u'status': u'invalid', u'validationRecord': [{u'addressesResolved': [u'217.251.47.207', u'2003:86:2455:9c00:d1:3ff:fe81:bd3f'], u'url': u'http://domain.com/.well-known/acme-challenge/PDUNtwiHq5dncDrvs4V2NE9nSR9vLF2WhnAbX1jQ7f0', u'hostname': u'domain.com', u'addressesTried': [], u'addressUsed': u'2003:86:2455:9c00:d1:3ff:fe81:b46f', u'port': u'80'}], u'keyAuthorization': u'PDUNtwiHq5dncDrvs4V2NE9nSR9vLF2WhnAbX1jQ7f0.YW7Ac9LxjjuWvWzD542ZzSKxcFKDIdehVVzAuYA0vHI', u'uri': u'https://acme-v01.api.letsencrypt.org/acme/challenge/-yjij3RP1r4YC_TkQrUemgjhfWI17pQZSjMZ8kr-Lps/1441804350', u'token': u'PDUNtwiHq5dncDrvs4V2NE9nSR9vLF2WhnAbX1jQ7f0', u'error': {u'status': 400, u'type': u'urn:acme:error:connection', u'detail': u'Fetching http://domain.com/.well-known/acme-challenge/PDUNtwiHq5dncDrvs4V2NE9nSR9vLF2WhnAbX1jQ7f0: Timeout'}, u'type': u'http-01'}
&lt;/pre>
&lt;p>In der Fehlerausgabe ist bei &lt;em>&lt;strong>addressUsed&lt;/strong>&lt;/em> zu sehen, dass eine IPv6-Adresse zur Überprüfung verwendet wird. Da die Adresse falsch ist kommt es zu einem Timeout.&lt;/p>
&lt;p>Um diesen Fehler zu beheben und in Zukunft auch per IPv6 auf meinen Host zu Hause zugreifen zu können muss nicht nur der A-Record für IPv4 sondern eben auch der AAAA-Record für IPv6 bei einer Änderung aktualisiert werden.&lt;/p>
&lt;p>Im &lt;a
class="gblog-markdown__link"
href="http://wiki.securepoint.de/index.php/SPDyn/Hostverwenden#FRITZ.21BOX"
title="Securepoint Dynamic DNS Host verwenden"
>Wiki von SPDyn&lt;/a> wird beschrieben wie eine Fritzbox konfiguriert werden kann um IPv4 und IPv6 Einträge zu aktualisieren. Allerdings wird dann der AAAA-Record auf die IPv6-Adresse der Fritzbox aktualisiert und nicht auf die Adresse des eigentlichen Ziel-Hosts. Ich verwende die Fritzbox also nur um den A-Record für IPv4 zu aktualisieren. SPDyn ermöglicht das Aktualisieren der DNS-Einträge auch durch den Aufruf einer URL, z.B. mit wget. Für IPv6 habe ich mir deshalb ein kleines Script geschrieben, dass per Cronjob regelmäßig auf dem Host ausgeführt wird, auf den ich per IPv6 zugreifen möchte.&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;span class="lnt">11
&lt;/span>&lt;span class="lnt">12
&lt;/span>&lt;span class="lnt">13
&lt;/span>&lt;span class="lnt">14
&lt;/span>&lt;span class="lnt">15
&lt;/span>&lt;span class="lnt">16
&lt;/span>&lt;span class="lnt">17
&lt;/span>&lt;span class="lnt">18
&lt;/span>&lt;span class="lnt">19
&lt;/span>&lt;span class="lnt">20
&lt;/span>&lt;span class="lnt">21
&lt;/span>&lt;span class="lnt">22
&lt;/span>&lt;span class="lnt">23
&lt;/span>&lt;span class="lnt">24
&lt;/span>&lt;span class="lnt">25
&lt;/span>&lt;span class="lnt">26
&lt;/span>&lt;span class="lnt">27
&lt;/span>&lt;span class="lnt">28
&lt;/span>&lt;span class="lnt">29
&lt;/span>&lt;span class="lnt">30
&lt;/span>&lt;span class="lnt">31
&lt;/span>&lt;span class="lnt">32
&lt;/span>&lt;span class="lnt">33
&lt;/span>&lt;span class="lnt">34
&lt;/span>&lt;span class="lnt">35
&lt;/span>&lt;span class="lnt">36
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="cp">#!/bin/bash
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">USER&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s2">&amp;#34;user&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">PASSWORD&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s2">&amp;#34;password&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">HOSTNAME&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s2">&amp;#34;subdomain.spdns.org&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">CACHE_FILE&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s2">&amp;#34;/tmp/update_ipv6_cache&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">while&lt;/span> &lt;span class="nb">getopts&lt;/span> &lt;span class="s2">&amp;#34;:d&amp;#34;&lt;/span> opt&lt;span class="p">;&lt;/span> &lt;span class="k">do&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">case&lt;/span> &lt;span class="nv">$opt&lt;/span> in
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> d&lt;span class="o">)&lt;/span> &lt;span class="nv">DEBUG&lt;/span>&lt;span class="o">=&lt;/span>1&lt;span class="p">;;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">esac&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">done&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">IPV6&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="sb">`&lt;/span>ip addr show eth0 &lt;span class="p">|&lt;/span> grep &lt;span class="s1">&amp;#39;scope global dynamic&amp;#39;&lt;/span> &lt;span class="p">|&lt;/span> grep -Po &lt;span class="s1">&amp;#39;inet6 \K[0-9a-fA-F:]+&amp;#39;&lt;/span> &lt;span class="p">|&lt;/span> grep -v fd00&lt;span class="sb">`&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">URL&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s2">&amp;#34;https://update.spdyn.de/nic/update?hostname=&lt;/span>&lt;span class="nv">$HOSTNAME&lt;/span>&lt;span class="s2">&amp;amp;myip=&lt;/span>&lt;span class="nv">$IPV6&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">if&lt;/span> &lt;span class="o">[&lt;/span> -f &lt;span class="nv">$CACHE_FILE&lt;/span> &lt;span class="o">]&lt;/span>&lt;span class="p">;&lt;/span> &lt;span class="k">then&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nv">IPV6_CACHE&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="sb">`&lt;/span>cat &lt;span class="nv">$CACHE_FILE&lt;/span>&lt;span class="sb">`&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">else&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nv">IPV6_CACHE&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s2">&amp;#34;&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">fi&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">if&lt;/span> &lt;span class="o">[[&lt;/span> &lt;span class="nv">$IPV6&lt;/span> &lt;span class="o">==&lt;/span> &lt;span class="nv">$IPV6_CACHE&lt;/span> &lt;span class="o">]]&lt;/span>&lt;span class="p">;&lt;/span> &lt;span class="k">then&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="o">[[&lt;/span> &lt;span class="nv">$DEBUG&lt;/span> -eq &lt;span class="m">1&lt;/span> &lt;span class="o">]]&lt;/span>&lt;span class="p">;&lt;/span> &lt;span class="k">then&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">echo&lt;/span> &lt;span class="s2">&amp;#34;IP not changed&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">fi&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">exit&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">else&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">echo&lt;/span> &lt;span class="nv">$IPV6&lt;/span> &amp;gt; &lt;span class="nv">$CACHE_FILE&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="o">[[&lt;/span> &lt;span class="nv">$DEBUG&lt;/span> -eq &lt;span class="m">1&lt;/span> &lt;span class="o">]]&lt;/span>&lt;span class="p">;&lt;/span> &lt;span class="k">then&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">echo&lt;/span> wget -q -O - &lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="nv">$URL&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span> --http-user&lt;span class="o">=&lt;/span>&lt;span class="nv">$USER&lt;/span> --http-password&lt;span class="o">=&lt;/span>&lt;span class="nv">$PASSWORD&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> wget -q -O - &lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="nv">$URL&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span> --http-user&lt;span class="o">=&lt;/span>&lt;span class="nv">$USER&lt;/span> --http-password&lt;span class="o">=&lt;/span>&lt;span class="nv">$PASSWORD&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">else&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> wget -q -O - &lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="nv">$URL&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span> --http-user&lt;span class="o">=&lt;/span>&lt;span class="nv">$USER&lt;/span> --http-password&lt;span class="o">=&lt;/span>&lt;span class="nv">$PASSWORD&lt;/span> &amp;gt;/dev/null 2&amp;gt;&lt;span class="p">&amp;amp;&lt;/span>&lt;span class="m">1&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">fi&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">fi&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>
&lt;p>Durch Variablen werden die notwendigen Daten für den URL-Aufruf (z.B. User und Passwort) definiert. Im ersten Schritt wird die aktuelle IPv6-Adresse ermittelt (Zeile 15). In meinem Fall wird aus allen IPv6 Adressen für das Device eth0 die Adresse herausgefiltert die &amp;ldquo;global dynamisch&amp;rdquo; und keine lokale Adresse (fd00) ist. Unter Umständen muss das Ermitteln der richtigen IP angepasst werden. Danach wird die ermittelte IPv6-Adresse mit einem evtl. vorhandenen gecachten Wert verglichen (Zeile 23). Ergibt der Vergleich, dass sich die Adresse nicht geändert hat wird das Script beendet. Es ist keine Aktualisierung des DNS-Eintrags notwendig. Sind die beiden Adressen nicht identisch bzw. keine gecachte Adresse vorhanden wird die URL zum Aktualisieren des DNS-Eintrags mit wget aufgerufen (Zeile 34). Beim Start des Script mit dem Parameter -d (für Debug) wird zusätzlich der wget-Aufruf (Zeile 31) bzw. eine Info wenn sich die Adresse nicht geändert hat (Zeile 25) ausgegeben.&lt;/p>
&lt;p>Per Cronjob wird das Script bei mir alle 15 Minuten gestartet und aktualisiert somit bei Bedarf den DNS-Eintrag bei SPDyn. Um mit dem Host kommunizieren zu können sind zusätzlich noch &lt;a
class="gblog-markdown__link"
href="https://avm.de/service/fritzbox/fritzbox-7390/wissensdatenbank/publication/show/893_Statische-Portfreigaben-einrichten/"
title="Statische Portfreigaben einrichten"
>Portfreigaben&lt;/a> für IPv6 in der Fritzbox notwendig. Nach dieser Änderung kann auf den Host nun per IPv6 zugegriffen werden und auch die Erneuerung des Let&amp;rsquo;s Encrypt Zertifikats funktioniert wieder.&lt;/p></content><category scheme="https://www.krausmueller.de/tags/web" term="web" label="web"/><category scheme="https://www.krausmueller.de/tags/linux" term="linux" label="linux"/></entry><entry><title>Geschwindigkeit bei Zugriff von Mac OS X auf Samba Share</title><link href="https://www.krausmueller.de/2016/09/07/mac-geschwindigkeit-samba-share/" rel="alternate" type="text/html" hreflang="de"/><id>https://www.krausmueller.de/2016/09/07/mac-geschwindigkeit-samba-share/</id><published>2016-09-07T00:00:00+00:00</published><updated>2016-09-07T00:00:00+00:00</updated><content type="html">
&lt;p>Ich nutze meinen &lt;a
class="gblog-markdown__link"
href="/tags/cubietruck/"
title="bisherige Artikel zu Cubietruck"
>Cubietruck&lt;/a> als &lt;a
class="gblog-markdown__link"
href="https://www.samba.org/"
title="Samba Webseite"
>Samba&lt;/a> Server. Irgendwann fiel mir auf, dass die Geschwindigkeit beim Kopieren von meinem Mac mit &lt;a
class="gblog-markdown__link"
href="https://de.wikipedia.org/wiki/OS_X_El_Capitan"
title="Eintrag in der Wikipedia"
>OS X El Capitan&lt;/a> nur knapp über 10 MB/s lag. Da der Cubietruck eine Gigabit-Netzwerkkarte hat, sollte das um einiges schneller gehen. Außerdem war ich der Meinung früher schon Werte um die 30 MB/s gesehen zu haben. Der Gigabit-Anschluss wäre damit zwar auch noch nicht ausgelastet, aber immerhin.&lt;/p>
&lt;p>Nach etwas Recherche im Internet habe ich eine Einstellung (&lt;a
class="gblog-markdown__link"
href="http://www.heise.de/mac-and-i/meldung/OS-X-10-11-5-Abhilfe-fuer-SMB-Probleme-3222725.html"
title="Artikel bei heise.de"
>Heise Artikel&lt;/a>) gefunden mit der die Geschwindigkeit wieder auf bis zu 30 MB/s steigt. OS X verwendet wohl seit Version 10.11.5 standardmäßig &lt;a
class="gblog-markdown__link"
href="https://blogs.technet.microsoft.com/josebda/2010/12/01/the-basics-of-smb-signing-covering-both-smb1-and-smb2/"
title="SMB Signing Overview"
>SMB Signing&lt;/a>. Das Tool &lt;em>&lt;strong>smbutil&lt;/strong>&lt;/em> zeigt die Samba Version und Optionen für aktuell verbundene Freigaben an:&lt;/p>
&lt;pre class="shell">
Mini:~ johannes$ &lt;b>smbutil statshares -a&lt;/b>
==================================================================================================
SHARE ATTRIBUTE TYPE VALUE
==================================================================================================
media
SERVER_NAME cubie
USER_ID 502
SMB_NEGOTIATE AUTO_NEGOTIATE
SMB_VERSION SMB_3.0
SMB_SHARE_TYPE DISK
SIGNING_SUPPORTED TRUE
EXTENDED_SECURITY_SUPPORTED TRUE
LARGE_FILE_SUPPORTED TRUE
CLIENT_REQUIRES_SIGNING TRUE
FILE_IDS_SUPPORTED TRUE
DFS_SUPPORTED TRUE
MULTI_CREDIT_SUPPORTED TRUE
ENCRYPTION_SUPPORTED TRUE
SIGNING_ON TRUE
--------------------------------------------------------------------------------------------------
&lt;/pre>
&lt;p>Die Zeile &amp;ldquo;SIGNING_ON TRUE&amp;rdquo; zeigt, dass SMB Signing aktiviert ist. Diese Konfiguration kann in der Datei &lt;em>&lt;strong>~/Library/Preferences/nsmb.conf&lt;/strong>&lt;/em> geändert werden:&lt;/p>
&lt;pre class="shell">
Mini:~ johannes$ &lt;b>echo "[default]" >> ~/Library/Preferences/nsmb.conf; echo "signing_required=no" >> ~/Library/Preferences/nsmb.conf&lt;/b>
Mini:~ johannes$ &lt;b>cat ~/Library/Preferences/nsmb.conf&lt;/b>
[default]
signing_required=no
&lt;/pre>
&lt;p>Nach einem Neustart oder dem Trennen aller Verbindungen zum Samba Server und erneuten Verbinden sollte SMB Signing deaktiviert sein (SIGNING_ON wird nicht aufgeführt):&lt;/p>
&lt;pre class="shell">
Mini:~ johannes$ &lt;b>smbutil statshares -a&lt;/b>
==================================================================================================
SHARE ATTRIBUTE TYPE VALUE
==================================================================================================
media
SERVER_NAME cubie
USER_ID 502
SMB_NEGOTIATE AUTO_NEGOTIATE
SMB_VERSION SMB_3.0
SMB_SHARE_TYPE DISK
SIGNING_SUPPORTED TRUE
EXTENDED_SECURITY_SUPPORTED TRUE
LARGE_FILE_SUPPORTED TRUE
FILE_IDS_SUPPORTED TRUE
DFS_SUPPORTED TRUE
MULTI_CREDIT_SUPPORTED TRUE
ENCRYPTION_SUPPORTED TRUE
--------------------------------------------------------------------------------------------------
&lt;/pre>
&lt;p>Um wieder auf den Standard zurück zu wechseln reicht es die Datei &lt;em>&lt;strong>~/Library/Preferences/nsmb.conf&lt;/strong>&lt;/em> zu löschen.&lt;/p>
&lt;p>Um SMB Signing über &lt;em>&lt;strong>~/Library/Preferences/nsmb.conf&lt;/strong>&lt;/em> nicht global zu deaktivieren, kann der Share auch mit &lt;em>&lt;strong>cifs://Hostname&lt;/strong>&lt;/em> statt mit &lt;em>&lt;strong>smb://Hostname&lt;/strong>&lt;/em> verbunden werden. Dadurch wird automatisch Samba Version 1 ohne SMB Signing verwendet:&lt;/p>
&lt;pre class="shell">
Mini:~ johannes$ &lt;b>smbutil statshares -a&lt;/b>
==================================================================================================
SHARE ATTRIBUTE TYPE VALUE
==================================================================================================
pyload
SERVER_NAME cubie
USER_ID 502
SMB_NEGOTIATE SMBV_NEG_SMB1_ONLY
SMB_VERSION SMB_1
SMB_SHARE_TYPE UNKNOWN
EXTENDED_SECURITY_SUPPORTED TRUE
UNIX_SUPPORT TRUE
LARGE_FILE_SUPPORTED TRUE
CLIENT_REQUIRES_SIGNING TRUE
--------------------------------------------------------------------------------------------------
&lt;/pre></content><category scheme="https://www.krausmueller.de/tags/mac" term="mac" label="mac"/><category scheme="https://www.krausmueller.de/tags/linux" term="linux" label="linux"/></entry><entry><title>PowerShell Scripte mit WhatIf</title><link href="https://www.krausmueller.de/2016/08/04/powershell-scripte-mit-whatif/" rel="alternate" type="text/html" hreflang="de"/><id>https://www.krausmueller.de/2016/08/04/powershell-scripte-mit-whatif/</id><published>2016-08-04T00:00:00+00:00</published><updated>2016-08-04T00:00:00+00:00</updated><content type="html">
&lt;p>Manchmal ist es sinnvoll den Aufruf eines eigenen PowerShell Scripts nur zu simulieren. Statt die Aktionen wirklich auszuführen möchte man lediglich sehen was passieren würde. Viele Cmdlets unterstützen den Parameter &lt;em>&lt;strong>-WhatIf&lt;/strong>&lt;/em>. Benutzt man diesen z.B. beim Anlegen eines Verzeichnis wird dieses nicht erstellt, sondern lediglich die im Beispiel angezeigte Meldung ausgegeben:&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-powershell" data-lang="powershell">&lt;span class="line">&lt;span class="cl">&lt;span class="nb">New-Item&lt;/span> &lt;span class="n">-ItemType&lt;/span> &lt;span class="n">Directory&lt;/span> &lt;span class="n">-Name&lt;/span> &lt;span class="s2">&amp;#34;test&amp;#34;&lt;/span> &lt;span class="n">-Path&lt;/span> &lt;span class="s2">&amp;#34;c:\temp&amp;#34;&lt;/span> &lt;span class="n">-WhatIf&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>
&lt;pre class="psconsole">
PS C:\> New-Item -ItemType Directory -Name "test" -Path "c:\temp" -WhatIf
What if: Performing the operation "Create Directory" on target "Destination: C:\temp\test".
&lt;/pre>
&lt;p>In einem eigenen Script kann die Option -WhatIf durch &lt;em>&lt;strong>&lt;a
class="gblog-markdown__link"
href="https://www.itprotoday.com/powershell/what-does-powershells-cmdletbinding-do"
title="What does PowerShell&amp;#39;s CmdletBinding Do?"
>CmdletBinding&lt;/a>&lt;/strong>&lt;/em> verwendet werden.&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;span class="lnt">3
&lt;/span>&lt;span class="lnt">4
&lt;/span>&lt;span class="lnt">5
&lt;/span>&lt;span class="lnt">6
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-powershell" data-lang="powershell">&lt;span class="line">&lt;span class="cl">&lt;span class="p">[&lt;/span>&lt;span class="k">CmdletBinding&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">SupportsShouldProcess&lt;/span>&lt;span class="p">=&lt;/span>&lt;span class="nv">$True&lt;/span>&lt;span class="p">)]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">Param&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">Get-ChildItem&lt;/span> &lt;span class="n">-Directory&lt;/span> &lt;span class="s2">&amp;#34;c:\temp&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">Out-File&lt;/span> &lt;span class="n">-FilePath&lt;/span> &lt;span class="s2">&amp;#34;c:\temp\Test-WhatIf.log&amp;#34;&lt;/span> &lt;span class="n">-InputObject&lt;/span> &lt;span class="s2">&amp;#34;Text&amp;#34;&lt;/span> &lt;span class="n">-Encoding&lt;/span> &lt;span class="n">ASCII&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">New-Item&lt;/span> &lt;span class="n">-ItemType&lt;/span> &lt;span class="n">Directory&lt;/span> &lt;span class="n">-Name&lt;/span> &lt;span class="s2">&amp;#34;test&amp;#34;&lt;/span> &lt;span class="n">-Path&lt;/span> &lt;span class="s2">&amp;#34;c:\temp&amp;#34;&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>
&lt;p>Das Script lautet Test-WhatIf.ps1. Gibt man beim Aufruf den Parameter WhatIf an, werden alle Cmdlets die WhatIf unterstützen ausgeführt als wäre der Parameter im Code selbst angegeben. Das Cmdlet Get-ChildItem z.B. unterstützt WhatIf nicht, der Inhalt wird also aufgelistet.&lt;/p>
&lt;pre class="psconsole">
PS C:\> ./Test-WhatIf.ps1 -WhatIf
Directory: C:\temp
Mode LastWriteTime Length Name
---- ------------- ------ ----
d---- 19.05.2016 14:58 directory1
d---- 11.07.2016 10:22 directory2
d---- 06.07.2016 15:56 directory3
d---- 19.05.2016 15:12 directory4
What if: Performing the operation "Output to File" on target "c:\temp\Test-WhatIf.log".
What if: Performing the operation "Create Directory" on target "Destination: C:\temp\test".
&lt;/pre>
&lt;p>Evtl. möchte man aber auch Teile des Scripts trotzdem ausführen. In diesem Fall kann man -WhatIf manuell auf $False setzen:&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;span class="lnt">3
&lt;/span>&lt;span class="lnt">4
&lt;/span>&lt;span class="lnt">5
&lt;/span>&lt;span class="lnt">6
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-powershell" data-lang="powershell">&lt;span class="line">&lt;span class="cl">&lt;span class="p">[&lt;/span>&lt;span class="k">CmdletBinding&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">SupportsShouldProcess&lt;/span>&lt;span class="p">=&lt;/span>&lt;span class="nv">$True&lt;/span>&lt;span class="p">)]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">Param&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">Get-ChildItem&lt;/span> &lt;span class="n">-Directory&lt;/span> &lt;span class="s2">&amp;#34;c:\temp&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">Out-File&lt;/span> &lt;span class="n">-FilePath&lt;/span> &lt;span class="s2">&amp;#34;c:\temp\Test-WhatIf.log&amp;#34;&lt;/span> &lt;span class="n">-InputObject&lt;/span> &lt;span class="s2">&amp;#34;Text&amp;#34;&lt;/span> &lt;span class="n">-Encoding&lt;/span> &lt;span class="n">ASCII&lt;/span> &lt;span class="n">-WhatIf&lt;/span>&lt;span class="err">:&lt;/span>&lt;span class="nv">$False&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">New-Item&lt;/span> &lt;span class="n">-ItemType&lt;/span> &lt;span class="n">Directory&lt;/span> &lt;span class="n">-Name&lt;/span> &lt;span class="s2">&amp;#34;test&amp;#34;&lt;/span> &lt;span class="n">-Path&lt;/span> &lt;span class="s2">&amp;#34;c:\temp&amp;#34;&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>
&lt;p>Das Script schreibt den Text in die Datei, erstellt das Verzeichnis aber nicht.&lt;/p>
&lt;pre class="psconsole">
PS C:\> ./Test-WhatIf.ps1 -WhatIf
Directory: C:\temp
Mode LastWriteTime Length Name
---- ------------- ------ ----
d---- 19.05.2016 14:58 directory1
d---- 11.07.2016 10:22 directory2
d---- 06.07.2016 15:56 directory3
d---- 19.05.2016 15:12 directory4
What if: Performing the operation "Create Directory" on target "Destination: C:\temp\test".
PS C:\> Get-Content "c:\temp\Test-WhatIf.log"
Text
&lt;/pre>
&lt;p>Ausserdem kann es sinnvoll sein im Script zu unterscheiden, ob es mit -WhatIf augerufen wurde oder nicht. Dafür kann die Variable $WhatIfPreference genutzt werden:&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;span class="lnt">3
&lt;/span>&lt;span class="lnt">4
&lt;/span>&lt;span class="lnt">5
&lt;/span>&lt;span class="lnt">6
&lt;/span>&lt;span class="lnt">7
&lt;/span>&lt;span class="lnt">8
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-powershell" data-lang="powershell">&lt;span class="line">&lt;span class="cl">&lt;span class="p">[&lt;/span>&lt;span class="k">CmdletBinding&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">SupportsShouldProcess&lt;/span>&lt;span class="p">=&lt;/span>&lt;span class="nv">$True&lt;/span>&lt;span class="p">)]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">Param&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">If&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="nv">$WhatIfPreference&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">Write-Host&lt;/span> &lt;span class="s2">&amp;#34;aufgerufen mit WhatIf&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span> &lt;span class="k">Else&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">Write-Host&lt;/span> &lt;span class="s2">&amp;#34;aufgerufen ohne WhatIf&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>
&lt;pre class="psconsole">
PS C:\> ./Test-WhatIf.ps1 -WhatIf
aufgerufen mit WhatIf
PS C:\> ./Test-WhatIf.ps1
aufgerufen ohne WhatIf
&lt;/pre></content><category scheme="https://www.krausmueller.de/tags/powershell" term="powershell" label="powershell"/></entry><entry><title>Infrarot Fernbedienung (z.B. Logitech Harmony) mit WeTek OpenELEC</title><link href="https://www.krausmueller.de/2016/07/27/infrarot-fernbedienung-wetek-openelec/" rel="alternate" type="text/html" hreflang="de"/><id>https://www.krausmueller.de/2016/07/27/infrarot-fernbedienung-wetek-openelec/</id><published>2016-07-27T00:00:00+00:00</published><updated>2016-07-27T00:00:00+00:00</updated><content type="html">
&lt;p>&lt;a
class="gblog-markdown__link"
href="http://openelec.tv/openelec-box"
title="WeTek OpenELEC"
>WeTek OpenELEC&lt;/a> ist eine kleine Box mit installiertem &lt;a
class="gblog-markdown__link"
href="http://openelec.tv/"
title="OpenELEC"
>OpenELEC&lt;/a>, welches wiederum auf &lt;a
class="gblog-markdown__link"
href="https://kodi.tv/"
title="Kodi"
>Kodi&lt;/a> basiert. WeTek OpenELEC enthält je nach Variante bereits einen Tuner (DVB-C/T, DVB-S oder ATSC). Bei mir hat die Box einen Raspberry Pi ersetzt. Zum Lieferumfang gehört eine AirMouse. Das ist eine Fernbedienung die sich durch Bewegungssensoren auch als Maus verwenden lässt. Da ich aber bereits eine Logitech Harmony als Universalfernbedienung verwende, soll diese die Steuerung übernehmen. Bei WeTek OpenELEC handelt es sich um eine Sonderedition von WeTek Play (&lt;a
class="gblog-markdown__link"
href="http://www.wetekforums.com/v/index.php?p=/discussion/12598/wetek-openelec"
title="Unterschiede zwischen WeTek Play und WeTek OpenELEC"
>Unterschiede&lt;/a> zwischen WeTek Play und WeTek OpenELEC). Die Einrichtung einer Fernbedienung sollte für WeTek Play also ähnlich sein.&lt;/p>
&lt;p>WeTek OpenELEC hat einen Infrarotempfänger eingebaut. Standardmäßig wird dieser jedoch nur zum Ein- und Ausschalten des Geräts verwendet. Die Steuerung der anderen Funktionen ist etwas komplizierter einzurichten. Ich werde zuerst erklären wie man (um sich Arbeit zu sparen) meine Konfiguration übernehmen kann. Danach gibt es mehr Details wie die Vorgehensweise war und die Konfiguration auch für andere Fernbedienungen selbst angepasst werden kann. Die verwendete Fernbedienung muss das &lt;a
class="gblog-markdown__link"
href="http://www.elv.de/elektronikwissen/die-wichtigsten-infrarot-codeverfahren.html"
title="Die wichtigsten Infrarot-Codeverfahren"
>NEC Protokoll&lt;/a> verwenden.&lt;/p>
&lt;div class="gblog-post__anchorwrap flex align-center">
&lt;h3 id="steuerung-mit-logitech-harmony-als-mutnt-hd2400-konfiguriert">
Steuerung mit Logitech Harmony als Mut@nt HD2400 konfiguriert
&lt;/h3>
&lt;a data-clipboard-text="https://www.krausmueller.de/2016/07/27/infrarot-fernbedienung-wetek-openelec/#steuerung-mit-logitech-harmony-als-mutnt-hd2400-konfiguriert" class="gblog-post__anchor gblog-post__anchor--right clip" aria-label="Anchor Steuerung mit Logitech Harmony als Mut@nt HD2400 konfiguriert" href="#steuerung-mit-logitech-harmony-als-mutnt-hd2400-konfiguriert">
&lt;svg class="gblog-icon gblog_link">&lt;use xlink:href="#gblog_link">&lt;/use>&lt;/svg>
&lt;/a>
&lt;/div>
&lt;p>Um möglichst viele Tasten der Harmony Fernbedienung nutzen zu können habe ich als Gerät &amp;ldquo;Mut@nt HD2400&amp;rdquo; konfiguriert. Wählt man als Gerät WeTek Play aus bleiben leider viele Tasten der Harmony ohne Funktion.&lt;/p>
&lt;p>&lt;img
src="/images/harmony_mutant_hd2400.png"
alt="Auswahl des Gerätes &amp;amp;ldquo;Mut@nt HD2400&amp;amp;rdquo;"
/>&lt;/p>
&lt;p>Die Tasten und die jeweilige Aktion werden auf WeTek OpenELEC über die Datei remote.conf gesteuert. Für eine möglichst schnelle Konfiguration stelle ich meine Datei &lt;a href="/downloads/remote.conf" target="_blank">hier&lt;/a> bereit.&lt;/p>
&lt;p>Es muss also für die Harmony das Gerät Muta@nt HD2400 hinzugefügt (und in gewünschte Aktionen aufgenommen) werden. Danach per Samba (&lt;em>&lt;strong>&lt;nobr>\&amp;lt;IP_des_Geräts&amp;gt;\Configfiles&lt;/nobr>&lt;/strong>&lt;/em>) auf die Box verbinden, eine Sicherheitskopie der remote.conf anlegen und sie danach durch &lt;a href="/downloads/remote.conf" target="_blank">meine Version&lt;/a> ersetzen. Nach einem Neustart sollte sich WeTek OpenELEC mit der Harmony steuern lassen.&lt;/p>
&lt;p>Zusätzlich habe ich noch einige weitere Tasten konfiguriert:&lt;/p>
&lt;p>&lt;img
src="/images/harmony_extra_keys.png"
alt="Extra Tasten"
/>&lt;/p>
&lt;p>Sie sind in der remote.conf auf die Tasten M, S, L, Z, T und V gemappt. T und L sind in der Standardkonfiguration von Kodi den Aktionen &amp;ldquo;Untertitel umschalten&amp;rdquo; und &amp;ldquo;Videotext&amp;rdquo; zugeordnet. Die anderen Tasten können über eine eigene &lt;a
class="gblog-markdown__link"
href="http://kodi.wiki/view/Keymap#Keyboards"
title="Keymap im Kodi Wiki"
>Keymap&lt;/a> (Datei &lt;a href="/downloads/keymap.xml" target="_blank">keymap.xml&lt;/a>) Aktionen zugeordnet werden. In meinem Fall sind dies M = &amp;ldquo;Ansicht Filme&amp;rdquo;, S = &amp;ldquo;Ansicht Serien&amp;rdquo;, L = &amp;ldquo;Audiospur umschalten&amp;rdquo; und Z = &amp;ldquo;TV&amp;rdquo;. Des Weiteren enthält die Keymap die Tasten zur Navigation im Videotext (red, green, yellow, blue). Die &lt;a href="/downloads/keymap.xml" target="_blank">keymap.xml&lt;/a> wird unter &lt;em>&lt;strong>&lt;nobr>\&amp;lt;IP_des_Geräts&amp;gt;\Userdata\keymaps&lt;/nobr>&lt;/strong>&lt;/em> abgelegt.&lt;/p>
&lt;div class="gblog-post__anchorwrap flex align-center">
&lt;h3 id="codes-für-beliebige-nec-fernbedienung-ermitteln">
Codes für beliebige (NEC) Fernbedienung ermitteln
&lt;/h3>
&lt;a data-clipboard-text="https://www.krausmueller.de/2016/07/27/infrarot-fernbedienung-wetek-openelec/#codes-für-beliebige-nec-fernbedienung-ermitteln" class="gblog-post__anchor gblog-post__anchor--right clip" aria-label="Anchor Codes für beliebige (NEC) Fernbedienung ermitteln" href="#codes-f%c3%bcr-beliebige-nec-fernbedienung-ermitteln">
&lt;svg class="gblog-icon gblog_link">&lt;use xlink:href="#gblog_link">&lt;/use>&lt;/svg>
&lt;/a>
&lt;/div>
&lt;p>Wie kann man selbst eine beliebige Fernbedienung für WeTek OpenELEC konfigurieren? Als erstes muss der SSH Zugang zu der Box in den Einstellungen aktiviert werden. Das Standardpasswort für den Benutzer &lt;em>&lt;strong>root&lt;/strong>&lt;/em> lautet &lt;em>&lt;strong>openelec&lt;/strong>&lt;/em>. Jetzt kann eine beliebige Taste auf der Fernbedienung gedrückt werden. Mit &lt;em>&lt;strong>dmesg -c | grep custom&lt;/strong>&lt;/em> erhält man den Factory Code für seine Fernbedienung:&lt;/p>
&lt;pre class="shell">
OpenELEC:~ # &lt;b>dmesg -c | grep custom&lt;/b>
[ 1657.693666@0] Wrong custom code is 0xe21d1f00
&lt;/pre>
&lt;p>Dieser muss in die Datei remote.conf eingetragen werden. Entweder man editiert die Datei direkt in der SSH Sitzung (z.B. &lt;em>&lt;strong>vi /storage/.config/remote.conf&lt;/strong>&lt;/em>) oder mit einem beliebigen Editor über die Freigabe &lt;em>&lt;strong>&lt;nobr>\&amp;lt;IP_des_Geräts&amp;gt;\Configfiles&lt;/nobr>&lt;/strong>&lt;/em>. In der Datei muss der ermittelte Code in die Zeile die mit &amp;ldquo;factory_code&amp;rdquo; beginnt eingetragen werden. Dabei müssen die ersten 4 Zeichen nach &amp;ldquo;factory_code = 0x&amp;rdquo; mit den letzten 4 Zeichen der Ausgabe mit &amp;ldquo;Wrong custom code&amp;rdquo; ersetzt werden. Aus 0xff000001 (Wert bei Auslieferung) wird bei diesem Beispiel also 0x1f000001.&lt;/p>
&lt;pre class="shell">
OpenELEC:~ # &lt;b>head -n 15 /storage/.config/remote.conf&lt;/b>
# WeTek Play NEC remote
factory_code = 0x1f000001
work_mode = 1
repeat_enable = 1
release_delay = 150
debug_enable = 1
reg_control = 0xfbe40
key_begin
; Code = IR keycode
; Linux = Linux keycode
; Android = Android keycode
; Button = Description button on Logitech remote
; KODI = Action in KODI (focus on video playback)
; Further info: http://kodi.wiki/view/Keyboard_controls
&lt;/pre>
&lt;p>Damit die Änderung an der remote.conf aktiv wird, muss das System entweder neu gestartet oder der Befehl &lt;em>&lt;strong>remotecfg /storage/.config/remote.conf&lt;/strong>&lt;/em> ausgeführt werden. Danach kommt der aufwendige Teil: Für jede Taste muss der Code ermittelt werden. Dafür muss zuerst die gewünschte Taste auf der Fernbedienung gedrückt und danach der empfangene Code ausgelesen werden:&lt;/p>
&lt;pre class="shell">
OpenELEC:~ # &lt;b>dmesg -c | grep scan&lt;/b>
[ 3135.540356@0] scancode is 0x002b, invalid key is 0x0000.
[ 3135.812065@0] scancode is 0x002b, invalid key is 0x0000.
OpenELEC:~ # &lt;b>dmesg -c | grep scan&lt;/b>
[ 3163.433223@0] scancode is 0x0028, invalid key is 0x0000.
[ 3163.702069@0] scancode is 0x0028, invalid key is 0x0000.
&lt;/pre>
&lt;p>Jedem empfangenen Code (scancode) wird ein Keycode zugeordnet, der wiederum eine Aktion in Kodi auslöst. Meine &lt;a href="/downloads/remote.conf" target="_blank">remote.conf&lt;/a> enthält bereits die wichtigsten Keycodes wie z.B. 114 und 115 zum Verändern der Lautstärke (siehe Erklärung der Funktion in der Spalte &amp;ldquo;Kodi&amp;rdquo;). Einige der gültigen Keycodes können &lt;a
class="gblog-markdown__link"
href="http://www.comptechdoc.org/os/linux/howlinuxworks/linux_hlkeycodes.html"
title="Linux Keycode Table"
>dieser Liste&lt;/a> entnommen werden.&lt;/p>
&lt;p>Die Tasten werden im Bereich zwischen &amp;ldquo;key_begin&amp;rdquo; und &amp;ldquo;key_end&amp;rdquo; definiert. Die bereits vorhandenen können einfach geändert werden. Dafür muss der Wert in der ersten Spalte &amp;ldquo;Code&amp;rdquo; auf die Codes der eigenen Fernbedienung angepasst werden. Nicht benötigte Zeilen werden mit ; oder # auskommentiert. Für die Codes aus dem Beispiel könnte das wie folgt aussehen:&lt;/p>
&lt;pre class="shell">
key_begin
0x2b 114 # Vol -
0x28 115 # Vol +
key_end
&lt;/pre>
&lt;p>Wenn alle Codes in der remote.conf eingetragen wurden kann die neue Konfiguration mit &lt;em>&lt;strong>remotecfg /storage/.config/remote.conf&lt;/strong>&lt;/em> aktiviert werden.&lt;/p>
&lt;p>Die Vorgehensweise wird auch in diesem &lt;a
class="gblog-markdown__link"
href="http://wetekforums.com/v/index.php?p=/discussion/12323/ir-remote-control"
title="Eintrag im WeTek Forum"
>Foreneintrag&lt;/a> erläutert.&lt;/p></content><category scheme="https://www.krausmueller.de/tags/openelec" term="openelec" label="openelec"/></entry><entry><title>Intermediate Zertifikat für acme-tiny</title><link href="https://www.krausmueller.de/2016/06/14/intermediate-zertifikat-fuer-acme-tiny/" rel="alternate" type="text/html" hreflang="de"/><id>https://www.krausmueller.de/2016/06/14/intermediate-zertifikat-fuer-acme-tiny/</id><published>2016-06-14T00:00:00+00:00</published><updated>2016-06-14T00:00:00+00:00</updated><content type="html">
&lt;p>Wie im &lt;a
class="gblog-markdown__link"
href="/de/alternativer-client-fuer-letsencrypt"
title="Alternativer Client für Let&amp;#39;s Encrypt"
>Artikel zu acme-tiny&lt;/a> erwähnt muss ein eigenes Script zum regelmäßigen Erneuern der Let&amp;rsquo;s Encrypt Zertifikate erstellt werden. In diesem Script wird das passende Intermediate Zertifikat von Let&amp;rsquo;s Encrypt heruntergeladen, damit dem Besucher die vollständige Zertifizierungs-Kette übermittelt werden kann. Wird das Intermediate Zertifikat vom Webserver nicht ausgeliefert, fällt die Bewertung von SSL Labs auf &amp;ldquo;B&amp;rdquo; zurück.&lt;/p>
&lt;p>&lt;img
src="/images/ssl_labs_intermediate.png"
alt="SSL Labs Rating bei fehlendem Intermediate Zertifikat"
/>&lt;/p>
&lt;p>Das Intermediate Zertifikat von Let&amp;rsquo;s Encrypt hat sich zwischenzeitlich geändert. In der Beschreibung zu acme-tiny bei Github wurde die URL zum Download deshalb &lt;a
class="gblog-markdown__link"
href="https://github.com/diafygi/acme-tiny/commit/be31020b3c063cc2605c16ca483b34fed81690e1"
title="Update README.md"
>angepasst&lt;/a>.&lt;/p>
&lt;p>Um jedoch einen weiteren Wechsel in Zukunft abzufangen kann die URL zum Download des Intermediate Zertifkats aus dem Zertifkat ausgelesen werden. Das vollständige Script könnte so ähnlich aussehen:&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;span class="lnt">3
&lt;/span>&lt;span class="lnt">4
&lt;/span>&lt;span class="lnt">5
&lt;/span>&lt;span class="lnt">6
&lt;/span>&lt;span class="lnt">7
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="cp">#!/bin/bash
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">&lt;/span>python /path/to/acme_tiny.py --account-key /path/to/account.key --csr /path/to/domain.csr --acme-dir /var/www/challenges/ &amp;gt; /tmp/signed.crt &lt;span class="o">||&lt;/span> &lt;span class="nb">exit&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">URL&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="sb">`&lt;/span>openssl x509 -in signed.crt -text -noout &lt;span class="p">|&lt;/span> grep &lt;span class="s2">&amp;#34;CA Issuers - URI:&amp;#34;&lt;/span> &lt;span class="p">|&lt;/span> cut -d&lt;span class="s2">&amp;#34;:&amp;#34;&lt;/span> -f2,3&lt;span class="sb">`&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">wget -O - &lt;span class="nv">$URL&lt;/span> &amp;gt; /tmp/intermediate.der
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">openssl x509 -in /tmp/intermediate.der -inform der -outform pem -out /tmp/intermediate.pem
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">cat /tmp/signed.crt /tmp/intermediate.pem &amp;gt; /path/to/chained.pem
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">service nginx reload&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>
&lt;p>In Zeile 3 wird die URL des Intermediate Zertifikats bestimmt und in Zeile 4 heruntergeladen. Zeile 5 ändert das Format des Intermediate Zertifikats und in Zeile 6 werden das Intermediate Zertifikat und das Zertfikat für die Domain kombiniert in einer Datei gespeichert (je nach Konfiguration und verwendeten Webserver evtl. nicht notwendig).&lt;/p></content><category scheme="https://www.krausmueller.de/tags/web" term="web" label="web"/><category scheme="https://www.krausmueller.de/tags/linux" term="linux" label="linux"/></entry><entry><title>Passwörter in PowerShell</title><link href="https://www.krausmueller.de/2016/06/01/passwoerter-in-powershell/" rel="alternate" type="text/html" hreflang="de"/><id>https://www.krausmueller.de/2016/06/01/passwoerter-in-powershell/</id><published>2016-06-01T00:00:00+00:00</published><updated>2016-06-01T00:00:00+00:00</updated><content type="html">
&lt;p>Bei verschiedenen Gelegenheiten kann es vorkommen, dass man Passwörter in Powershell verwenden muss. Soll z.B. ein anderer Rechner heruntergefahren und für die Authentifizierung ein anderer als der aktuell angemeldete Benutzer verwendet werden, müssen Benutzername und Passwort angegeben werden. Diese können mit &lt;a
class="gblog-markdown__link"
href="https://technet.microsoft.com/en-us/library/hh849815.aspx"
title="Get-Credential"
>&lt;em>&lt;strong>Get-Credential&lt;/strong>&lt;/em>&lt;/a> zur Laufzeit abgefragt werden:&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-powershell" data-lang="powershell">&lt;span class="line">&lt;span class="cl">&lt;span class="nv">$Credential&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="nb">Get-Credential&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">Stop-Computer&lt;/span> &lt;span class="n">-Computer&lt;/span> &lt;span class="n">192&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">168&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">2&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">10&lt;/span> &lt;span class="n">-Credential&lt;/span> &lt;span class="nv">$Credential&lt;/span> &lt;span class="n">-WhatIf&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>
&lt;p>Der Benutzername kann auch vorbelegt werden, so dass statt Benutzernamen &lt;em>&lt;strong>und&lt;/strong>&lt;/em> Passwort nur noch das Passwort eingegeben werden muss:&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-powershell" data-lang="powershell">&lt;span class="line">&lt;span class="cl">&lt;span class="nv">$Credential&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="nb">Get-Credential&lt;/span> &lt;span class="n">-Credential&lt;/span> &lt;span class="s2">&amp;#34;Domain\User&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">Stop-Computer&lt;/span> &lt;span class="n">-Computer&lt;/span> &lt;span class="n">192&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">168&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">2&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">10&lt;/span> &lt;span class="n">-Credential&lt;/span> &lt;span class="nv">$Credential&lt;/span> &lt;span class="n">-WhatIf&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>
&lt;p>Erstellt man ein Script das ohne Benutzereingaben laufen muss (z.B. ein Nagios Plugin oder Scheduled Task), kann das Passwort auch direkt im Script angegeben werden. Dort muss es allerdings in einen SecureString umgewandelt werden.&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;span class="lnt">3
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-powershell" data-lang="powershell">&lt;span class="line">&lt;span class="cl">&lt;span class="nv">$SecurePassword&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="nb">ConvertTo-SecureString&lt;/span> &lt;span class="s2">&amp;#34;SecurePassword&amp;#34;&lt;/span> &lt;span class="n">-AsPlainText&lt;/span> &lt;span class="n">-Force&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">$Credentials&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="nb">New-Object&lt;/span> &lt;span class="n">System&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">Management&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">Automation&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">PSCredential&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;Domain\User&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nv">$SecurePassword&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">Stop-Computer&lt;/span> &lt;span class="n">-Computer&lt;/span> &lt;span class="n">192&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">168&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">2&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">10&lt;/span> &lt;span class="n">-Credential&lt;/span> &lt;span class="nv">$Credential&lt;/span> &lt;span class="n">-WhatIf&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>
&lt;p>Diese Variante ist jedoch ziemlich unsicher und sollte unbedingt vermieden werden. Jeder der Zugriff auf das Script hat kann auch das Passwort auslesen. Ein solches Script in öffentlichen oder halb-öffentlichen Code Repositories (z.B. &lt;a
class="gblog-markdown__link"
href="https://github.com/"
title="GitHub"
>GitHub&lt;/a>) zu verwalten ist ein hohes Sicherheitsrisiko. Eine einfache &lt;a
class="gblog-markdown__link"
href="https://github.com/search?utf8=%E2%9C%93&amp;amp;q=ConvertTo-SecureString&amp;#43;-AsPlainText&amp;#43;language%3APowerShell&amp;amp;type=Code&amp;amp;ref=searchresults"
title="Beispiel für Suche nach Passwörtern bei GitHub"
>Suche&lt;/a> könnte so die Passwörter zurückgeben.&lt;/p>
&lt;p>Man könnte das Passwort als Parameter übergeben. Aber auch so wird evtl. das Passwort im Klartext in einer Datei gespeichert (z.B. bei der Definition eines Nagios Checks) oder ist in der Konfiguration eines Scheduled Tasks zu sehen:&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;span class="lnt">3
&lt;/span>&lt;span class="lnt">4
&lt;/span>&lt;span class="lnt">5
&lt;/span>&lt;span class="lnt">6
&lt;/span>&lt;span class="lnt">7
&lt;/span>&lt;span class="lnt">8
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-powershell" data-lang="powershell">&lt;span class="line">&lt;span class="cl">&lt;span class="k">Param&lt;/span>&lt;span class="p">(&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">[&lt;/span>&lt;span class="k">Parameter&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="k">Mandatory&lt;/span>&lt;span class="p">=&lt;/span>&lt;span class="nv">$True&lt;/span>&lt;span class="p">)]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="no">[string]&lt;/span>&lt;span class="nv">$Password&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">$SecurePassword&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="nb">ConvertTo-SecureString&lt;/span> &lt;span class="nv">$Password&lt;/span> &lt;span class="n">-AsPlainText&lt;/span> &lt;span class="n">-Force&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">$Credentials&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="nb">New-Object&lt;/span> &lt;span class="n">System&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">Management&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">Automation&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">PSCredential&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;Domain\User&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nv">$SecurePassword&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">Stop-Computer&lt;/span> &lt;span class="n">-Computer&lt;/span> &lt;span class="n">192&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">168&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">2&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">10&lt;/span> &lt;span class="n">-Credential&lt;/span> &lt;span class="nv">$Credential&lt;/span> &lt;span class="n">-WhatIf&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>
&lt;p>Das Passwort kann auch als verschlüsselter String in einer Datei gespeichert werden. Dafür wird das Passwort einmalig eingelesen, verschlüsselt und z.B. in der Datei &lt;em>password.txt&lt;/em> abgespeichert.&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;span class="lnt">3
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-powershell" data-lang="powershell">&lt;span class="line">&lt;span class="cl">&lt;span class="nv">$SecurePassword&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="nb">Read-Host&lt;/span> &lt;span class="n">-AsSecureString&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">$EncryptedPassword&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="nb">ConvertFrom-SecureString&lt;/span> &lt;span class="n">-SecureString&lt;/span> &lt;span class="nv">$SecurePassword&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">Set-Content&lt;/span> &lt;span class="n">-Path&lt;/span> &lt;span class="s2">&amp;#34;password.txt&amp;#34;&lt;/span> &lt;span class="n">-Value&lt;/span> &lt;span class="nv">$EncryptedPassword&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>
&lt;p>Danach kann das Passwort immer wieder aus dieser Datei eingelesen werden:&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;span class="lnt">3
&lt;/span>&lt;span class="lnt">4
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-powershell" data-lang="powershell">&lt;span class="line">&lt;span class="cl">&lt;span class="nv">$EncryptedPassword&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="nb">Get-Content&lt;/span> &lt;span class="n">-Path&lt;/span> &lt;span class="s2">&amp;#34;password.txt&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">$SecurePassword&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="nb">ConvertTo-SecureString&lt;/span> &lt;span class="n">-String&lt;/span> &lt;span class="nv">$EncryptedPassword&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">$Credentials&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="nb">New-Object&lt;/span> &lt;span class="n">System&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">Management&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">Automation&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">PSCredential&lt;/span> &lt;span class="s2">&amp;#34;Domain\User&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nv">$SecurePassword&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">Stop-Computer&lt;/span> &lt;span class="n">-Computer&lt;/span> &lt;span class="n">192&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">168&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">2&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">10&lt;/span> &lt;span class="n">-Credential&lt;/span> &lt;span class="nv">$Credential&lt;/span> &lt;span class="n">-WhatIf&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>
&lt;p>Für die Verschlüsselung des Passwortes wird die Windows Data Protection API (&lt;a
class="gblog-markdown__link"
href="https://msdn.microsoft.com/en-us/library/ms995355.aspx"
title="Windows Data Protection"
>DPAPI&lt;/a>) verwendet. Aus diesem Grund ist das verschlüsselte Passwort immer &lt;em>&lt;strong>nur für den bei der Erstellung verwendeten Benutzer und Host&lt;/strong>&lt;/em> gültig. Außerdem ist das abgespeicherte Passwort ungültig sobald sich das &lt;em>&lt;strong>Passwort des Windows-Benutzers ändert&lt;/strong>&lt;/em>. Um das Passwort unabhängig vom angemeldeten Benutzer und verwendeten Host zu machen, kann der Parameter &lt;em>&lt;strong>Key&lt;/strong>&lt;/em> oder &lt;em>&lt;strong>SecureKey&lt;/strong>&lt;/em> beim Erstellen des Passworts verwendet werden. Bei Key wird ein Schlüssel als ByteArray angegeben, bei SecureKey als SecureString. In beiden Fällen wird zusätzlich zur Datei mit dem verschlüsselten Passwort ein weitere Datei, die den verwendeten Key (im Beispiel &lt;em>key.txt&lt;/em>) enthält, abgelegt.&lt;/p>
&lt;div class="gblog-post__anchorwrap flex align-center">
&lt;h3 id="parameter-key">
Parameter Key
&lt;/h3>
&lt;a data-clipboard-text="https://www.krausmueller.de/2016/06/01/passwoerter-in-powershell/#parameter-key" class="gblog-post__anchor gblog-post__anchor--right clip" aria-label="Anchor Parameter Key" href="#parameter-key">
&lt;svg class="gblog-icon gblog_link">&lt;use xlink:href="#gblog_link">&lt;/use>&lt;/svg>
&lt;/a>
&lt;/div>
&lt;p>Einmaliges Erstellen eines zufälligen Keys (&lt;a
class="gblog-markdown__link"
href="https://4sysops.com/archives/powershell-credentials-how-to-encrypt-a-password/#using-the-key-parameter"
title="PowerShell credentials – How to encrypt a password"
>ByteArray&lt;/a>):&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;span class="lnt">11
&lt;/span>&lt;span class="lnt">12
&lt;/span>&lt;span class="lnt">13
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-powershell" data-lang="powershell">&lt;span class="line">&lt;span class="cl">&lt;span class="k">Function&lt;/span> &lt;span class="n">RandomByte&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nv">$RandomByte&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="p">@()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">For&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="nv">$i&lt;/span>&lt;span class="p">=&lt;/span>&lt;span class="n">1&lt;/span>&lt;span class="p">;&lt;/span> &lt;span class="nv">$i&lt;/span> &lt;span class="o">-le&lt;/span> &lt;span class="n">16&lt;/span>&lt;span class="p">;&lt;/span> &lt;span class="nv">$i&lt;/span>&lt;span class="p">++)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="no">[Byte]&lt;/span>&lt;span class="nv">$RByte&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="nb">Get-Random&lt;/span> &lt;span class="n">-Minimum&lt;/span> &lt;span class="n">0&lt;/span> &lt;span class="n">-Maximum&lt;/span> &lt;span class="n">256&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nv">$RandomByte&lt;/span> &lt;span class="p">+=&lt;/span> &lt;span class="nv">$RByte&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nv">$RandomByte&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">$Key&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="n">RandomByte&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">$Key&lt;/span> &lt;span class="p">|&lt;/span> &lt;span class="nb">out-file&lt;/span> &lt;span class="s2">&amp;#34;key.txt&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">$SecurePassword&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="nb">ConvertTo-SecureString&lt;/span> &lt;span class="n">-String&lt;/span> &lt;span class="s2">&amp;#34;SecurePassword&amp;#34;&lt;/span> &lt;span class="n">-AsPlainText&lt;/span> &lt;span class="n">-Force&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">$EncryptedPassword&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="nb">ConvertFrom-SecureString&lt;/span> &lt;span class="n">-SecureString&lt;/span> &lt;span class="nv">$SecurePassword&lt;/span> &lt;span class="n">-Key&lt;/span> &lt;span class="nv">$Key&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">Set-Content&lt;/span> &lt;span class="n">-Path&lt;/span> &lt;span class="s2">&amp;#34;password.txt&amp;#34;&lt;/span> &lt;span class="n">-Value&lt;/span> &lt;span class="nv">$EncryptedPassword&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>
&lt;p>Einlesen des Passwortes und Keys:&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;span class="lnt">3
&lt;/span>&lt;span class="lnt">4
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-powershell" data-lang="powershell">&lt;span class="line">&lt;span class="cl">&lt;span class="nv">$EncryptedPassword&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="nb">Get-Content&lt;/span> &lt;span class="n">-Path&lt;/span> &lt;span class="s2">&amp;#34;password.txt&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">$Key&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="nb">Get-Content&lt;/span> &lt;span class="n">-Path&lt;/span> &lt;span class="s2">&amp;#34;key.txt&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">$SecurePassword&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="nb">ConvertTo-SecureString&lt;/span> &lt;span class="n">-String&lt;/span> &lt;span class="nv">$EncryptedPassword&lt;/span> &lt;span class="n">-Key&lt;/span> &lt;span class="nv">$Key&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">$Credentials&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="nb">New-Object&lt;/span> &lt;span class="n">System&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">Management&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">Automation&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">PSCredential&lt;/span> &lt;span class="s2">&amp;#34;User&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nv">$SecurePassword&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>
&lt;div class="gblog-post__anchorwrap flex align-center">
&lt;h3 id="parameter-securekey">
Parameter SecureKey
&lt;/h3>
&lt;a data-clipboard-text="https://www.krausmueller.de/2016/06/01/passwoerter-in-powershell/#parameter-securekey" class="gblog-post__anchor gblog-post__anchor--right clip" aria-label="Anchor Parameter SecureKey" href="#parameter-securekey">
&lt;svg class="gblog-icon gblog_link">&lt;use xlink:href="#gblog_link">&lt;/use>&lt;/svg>
&lt;/a>
&lt;/div>
&lt;p>Einmaliges Erstellen eines zufälligen Keys (&lt;a
class="gblog-markdown__link"
href="https://4sysops.com/archives/powershell-credentials-how-to-encrypt-a-password/#using-the-securekey-parameter"
title="PowerShell credentials – How to encrypt a password"
>SecureString&lt;/a>):&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;span class="lnt">11
&lt;/span>&lt;span class="lnt">12
&lt;/span>&lt;span class="lnt">13
&lt;/span>&lt;span class="lnt">14
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-powershell" data-lang="powershell">&lt;span class="line">&lt;span class="cl">&lt;span class="k">Function&lt;/span> &lt;span class="n">RandomString&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nv">$RandomString&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="s2">&amp;#34;&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">For&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="nv">$i&lt;/span>&lt;span class="p">=&lt;/span>&lt;span class="n">1&lt;/span>&lt;span class="p">;&lt;/span> &lt;span class="nv">$i&lt;/span> &lt;span class="o">-le&lt;/span> &lt;span class="n">16&lt;/span>&lt;span class="p">;&lt;/span> &lt;span class="nv">$i&lt;/span>&lt;span class="p">++)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="no">[Char]&lt;/span>&lt;span class="nv">$RChar&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="nb">Get-Random&lt;/span> &lt;span class="n">-Minimum&lt;/span> &lt;span class="n">33&lt;/span> &lt;span class="n">-Maximum&lt;/span> &lt;span class="n">127&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nv">$RandomString&lt;/span> &lt;span class="p">+=&lt;/span> &lt;span class="nv">$RChar&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nv">$RandomString&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">$KeyString&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="n">RandomString&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">Set-Content&lt;/span> &lt;span class="n">-Path&lt;/span> &lt;span class="s2">&amp;#34;key.txt&amp;#34;&lt;/span> &lt;span class="n">-Value&lt;/span> &lt;span class="nv">$KeyString&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">$SecurePassword&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="nb">ConvertTo-SecureString&lt;/span> &lt;span class="n">-String&lt;/span> &lt;span class="s2">&amp;#34;SecurePassword&amp;#34;&lt;/span> &lt;span class="n">-AsPlainText&lt;/span> &lt;span class="n">-Force&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">$Key&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="nb">ConvertTo-SecureString&lt;/span> &lt;span class="n">-String&lt;/span> &lt;span class="nv">$KeyString&lt;/span> &lt;span class="n">-AsPlainText&lt;/span> &lt;span class="n">-Force&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">$EncryptedPassword&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="nb">ConvertFrom-SecureString&lt;/span> &lt;span class="n">-SecureString&lt;/span> &lt;span class="nv">$SecurePassword&lt;/span> &lt;span class="n">-SecureKey&lt;/span> &lt;span class="nv">$Key&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">Set-Content&lt;/span> &lt;span class="n">-Path&lt;/span> &lt;span class="s2">&amp;#34;password.txt&amp;#34;&lt;/span> &lt;span class="n">-Value&lt;/span> &lt;span class="nv">$EncryptedPassword&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>
&lt;p>Einlesen des Passwortes und Keys:&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;span class="lnt">3
&lt;/span>&lt;span class="lnt">4
&lt;/span>&lt;span class="lnt">5
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-powershell" data-lang="powershell">&lt;span class="line">&lt;span class="cl">&lt;span class="nv">$EncryptedPassword&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="nb">Get-Content&lt;/span> &lt;span class="n">-Path&lt;/span> &lt;span class="s2">&amp;#34;password.txt&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">$KeyString&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="nb">Get-Content&lt;/span> &lt;span class="n">-Path&lt;/span> &lt;span class="s2">&amp;#34;key.txt&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">$Key&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="nb">ConvertTo-SecureString&lt;/span> &lt;span class="n">-String&lt;/span> &lt;span class="nv">$KeyString&lt;/span> &lt;span class="n">-AsPlainText&lt;/span> &lt;span class="n">-Force&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">$SecurePassword&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="nb">ConvertTo-SecureString&lt;/span> &lt;span class="n">-String&lt;/span> &lt;span class="nv">$EncryptedPassword&lt;/span> &lt;span class="n">-SecureKey&lt;/span> &lt;span class="nv">$Key&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">$Credentials&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="nb">New-Object&lt;/span> &lt;span class="n">System&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">Management&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">Automation&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">PSCredential&lt;/span> &lt;span class="s2">&amp;#34;User&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nv">$SecurePassword&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>
&lt;div class="gblog-post__anchorwrap flex align-center">
&lt;h3 id="fazit">
Fazit
&lt;/h3>
&lt;a data-clipboard-text="https://www.krausmueller.de/2016/06/01/passwoerter-in-powershell/#fazit" class="gblog-post__anchor gblog-post__anchor--right clip" aria-label="Anchor Fazit" href="#fazit">
&lt;svg class="gblog-icon gblog_link">&lt;use xlink:href="#gblog_link">&lt;/use>&lt;/svg>
&lt;/a>
&lt;/div>
&lt;p>Nach Möglichkeit sollte das Passwort zur Laufzeit mit Get-Credential oder Read-Host eingelesen werden. Muss das Script automatisiert werden und wird immer von dem selben Benutzer auf dem selben Host gestartet, kann das Passwort als SecureString in einer Datei abgelegt werden. Ist dies nicht möglich muss der Key zum Verschlüsseln des Passworts ebenfalls entweder mit -Key oder -SecureKey in einer zusätzlichen Datei abgelegt werden.&lt;/p>
&lt;p>Auch wenn das Passwort bei den beschriebenen Verfahren nicht in Klartext gespeichert wird ist es für einen erfahrenen Benutzer unter Umständen möglich das eigentliche Passwort auszulesen. Die Dateie(en) mit den verschlüsselten Daten sollte also zusätzlich durch weitere Maßnahmen (z.B. NTFS Berechtigungen) geschützt werden.&lt;/p></content><category scheme="https://www.krausmueller.de/tags/powershell" term="powershell" label="powershell"/></entry><entry><title>NetApp vFiler DR mit Data ONTAP Simulator Teil 10: Disaster Failover</title><link href="https://www.krausmueller.de/2016/05/14/netapp-vfiler-dr-teil10/" rel="alternate" type="text/html" hreflang="de"/><id>https://www.krausmueller.de/2016/05/14/netapp-vfiler-dr-teil10/</id><published>2016-05-14T00:00:00+00:00</published><updated>2016-05-14T00:00:00+00:00</updated><content type="html">
&lt;p>&lt;em style="font-size:0.8em;">Dies ist Teil einer &lt;a
class="gblog-markdown__link"
href="https://www.krausmueller.de/2016/05/14/netapp-vfiler-dr-teil10/#serienlinks"
title="Alle Artikel der Serie"
>Artikelserie&lt;/a>.&lt;/em>&lt;/p>
&lt;p>Im Prinzip läuft der Disaster Failover ähnlich wie der geplante Failover aus &lt;a
class="gblog-markdown__link"
href="/de/netapp-vfiler-dr-teil9"
title="Teil 9: Geplanter Failover"
>Teil 9&lt;/a> ab. Da der Master überraschend ausfällt, kann allerdings der vFiler nicht gestoppt und auch die temporäre Replikation vom Slave zum Master nicht bereits bei der Aktivierung des Slave eingerichtet werden. Beim Einschalten des Masters muss deshalb sicher gestellt werden, dass der vFiler nicht automatisch startet und somit auf Slave und Master gleichzeitig läuft. Sobald der Master wieder verfügbar ist muss außerdem die Replikation vom Slave zum Master angelegt und abgeschlossen werden, bevor der alte Master wieder den vFiler übernimmt. Im Vergleich zum &lt;a
class="gblog-markdown__link"
href="/de/netapp-vfiler-dr-teil9"
title="Teil 9: Geplanter Failover"
>geplanten Failover&lt;/a> wandern Schritte 1, 4 und 5 vom Failover also in den Rollback.&lt;/p>
&lt;div class="gblog-post__anchorwrap flex align-center">
&lt;h3 id="disaster-failover-von-master-zu-slave">
Disaster Failover von Master zu Slave:
&lt;/h3>
&lt;a data-clipboard-text="https://www.krausmueller.de/2016/05/14/netapp-vfiler-dr-teil10/#disaster-failover-von-master-zu-slave" class="gblog-post__anchor gblog-post__anchor--right clip" aria-label="Anchor Disaster Failover von Master zu Slave:" href="#disaster-failover-von-master-zu-slave">
&lt;svg class="gblog-icon gblog_link">&lt;use xlink:href="#gblog_link">&lt;/use>&lt;/svg>
&lt;/a>
&lt;/div>
&lt;ol>
&lt;li>vFiler DR auf Slave starten =&amp;gt; &amp;ldquo;running&amp;rdquo;&lt;/li>
&lt;/ol>
&lt;pre class="shell">
netapp02> &lt;b>vfiler dr activate vfiler01@netapp01&lt;/b>
CIFS local server is running.
Mon May 9 22:01:06 CEST [vfiler01@netapp02:cifs.startup.local.succeeded:info]: CIFS: CIFS local server is running.
Mon May 9 22:01:06 CEST [netapp02:httpd.config.mime.missing:warning]: /etc/httpd.mimetypes.sample file is missing.
Mon May 9 22:01:06 CEST [vfiler01@netapp02:httpd.config.mime.missing:warning]: /etc/httpd.mimetypes file is missing.
Mon May 9 22:01:06 CEST [vfiler01@netapp02:httpd.config.mime.missing:warning]: /etc/httpd.mimetypes.sample file is missing.
Mon May 9 22:01:06 CEST [netapp02:wafl.scan.ownblocks.done:info]: Completed block ownership calculation on volume vol_vfiler01. The scanner took 0 ms.
Vfiler vfiler01 activated.
e0a: flags=0xe48867&lt;UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.2.67 netmask 0xffffff00 broadcast 192.168.2.255
ether 00:0c:29:61:01:2b (auto-1000t-fd-up) flowcontrol full
netapp02> Mon May 9 22:01:07 CEST [netapp02:cmds.vfiler.dr.activated:info]: Disaster recovery backup vFiler unit: 'vfiler01' of the vFiler unit at remote storage system: 'netapp01' was activated.
Mon May 9 22:01:11 CEST [vfiler01@netapp02:export.host.resolve.timeout:warning]: Trial 1 for the nameservice lookup request timed out.
Mon May 9 22:01:30 CEST [vfiler01@netapp02:nbt.nbns.registrationComplete:info]: NBT: All CIFS name registrations have completed for the local server.
netapp02> &lt;b>vfiler status&lt;/b>
vfiler0 running
vfiler01 running
&lt;/pre>
&lt;ol start="2">
&lt;li>State des SnapMirrors prüfen =&amp;gt; &amp;ldquo;Broken-off&amp;rdquo; auf Slave&lt;/li>
&lt;/ol>
&lt;pre class="shell">
netapp02> &lt;b>snapmirror status&lt;/b>
Snapmirror is on.
Source Destination State Lag Status
netapp01_vfiler01_con:vol_vfiler01 netapp02:vol_vfiler01 Broken-off 00:02:30 Idle
&lt;/pre>
&lt;p>Wie bereits erwähnt sollte der vFiler auf dem Master (netapp01) nicht gestartet werden, solange er noch auf dem Slave (netapp02) läuft. Um dies zu verhindern kann z.B. das automatische Booten von Data ONTAP auf dem Master &lt;a
class="gblog-markdown__link"
href="https://kb.netapp.com/support/index?page=content&amp;amp;id=1010218"
title="How to skip POST, abort booting Data ONTAP and get to the ok&amp;gt; prompt from OFW"
>deaktiviert&lt;/a> werden. Wenn Data ONTAP nicht automatisch bootet, wird auch der vFiler nicht gestartet. Data ONTAP muss dann manuell gebootet (Befehl: &lt;em>&lt;strong>boot_ontap&lt;/strong>&lt;/em>) und sofort danach der vFiler gestoppt werden (&lt;em>&lt;strong>vfiler stop vfiler&lt;/strong>&lt;/em>). Alternativ kann auch vor dem Booten von Data ONTAP die IP Konfiguration des vFilers &lt;a
class="gblog-markdown__link"
href="https://kb.netapp.com/support/index?page=content&amp;amp;id=1010351"
title="How to disable vFiler at filer boot time"
>deaktiviert&lt;/a> werden.&lt;/p>
&lt;div class="gblog-post__anchorwrap flex align-center">
&lt;h3 id="rollback-von-slave-zu-master">
Rollback von Slave zu Master
&lt;/h3>
&lt;a data-clipboard-text="https://www.krausmueller.de/2016/05/14/netapp-vfiler-dr-teil10/#rollback-von-slave-zu-master" class="gblog-post__anchor gblog-post__anchor--right clip" aria-label="Anchor Rollback von Slave zu Master" href="#rollback-von-slave-zu-master">
&lt;svg class="gblog-icon gblog_link">&lt;use xlink:href="#gblog_link">&lt;/use>&lt;/svg>
&lt;/a>
&lt;/div>
&lt;ol>
&lt;li>Resync von Slave auf Master (&lt;em>&lt;strong>-s&lt;/strong>&lt;/em> für synchrone Replizierung)&lt;/li>
&lt;/ol>
&lt;pre class="shell">
netapp01> &lt;b>vfiler dr resync -s vfiler01@netapp02&lt;/b>
One can optionally provide an alternate ip
path for sync snapmirroring
Alternate IP address/Hostname for remote filer netapp02 []:
Alternate IP address/Hostname for local filer netapp01 []:
netapp02's Administrative login: &lt;b>root&lt;/b>
netapp02's Administrative password:
CIFS local server on vFiler vfiler01 is shutting down...
waiting for CIFS shut down (^C aborts)...
CIFS local server on vfiler vfiler01 has shut down...
Mon May 9 22:06:03 CEST [vfiler01@netapp01:telnet_0:notice]: IP address 192.168.2.68 is removed from interface "e0a"
Configuring SnapMirror to mirror vfiler vfiler01's storage units from remote filer netapp02.
Starting snapmirror initialize commands. It
could take a very long time when the source or
destination filers are involved in many
simultaneous transfers. The console will not be
available until all initialize commands are
started successfully. Please use the
"snapmirror status" command on the source
filer to monitor the progress.
Mon May 9 22:06:07 CEST [netapp01:snapmirror.dst.resync.info:notice]: SnapMirror resync of vol_vfiler01 to netapp02:vol_vfiler01 is using netapp02(4082368507)_vol_vfiler01.27 as the base snapshot.
Mon May 9 22:06:07 CEST [netapp01:vFiler.storageUnit.off:warning]: vFiler vfiler01: storage unit /vol/vol_vfiler01 now offline.
Mon May 9 22:06:08 CEST [netapp01:wafl.snaprestore.revert:info]: Reverting volume vol_vfiler01 to a previous snapshot.
Mon May 9 22:06:09 CEST [netapp01:vFiler.storageUnit.On:notice]: vFiler vfiler01: storage unit /vol/vol_vfiler01 now online.
Revert to resync base snapshot was successful.
Mon May 9 22:06:10 CEST [netapp01:replication.dst.resync.success:notice]: SnapMirror resync of vol_vfiler01 to netapp02:vol_vfiler01 was successful.
SnapMirror transfer initiated for vfiler storage units.
&lt;/pre>
&lt;ol start="2">
&lt;li>SnapMirror von netapp02 (Source) auf netapp01 (Destination) prüfen =&amp;gt; zusätzliche Einträge mit State &amp;ldquo;Snapmirrored&amp;rdquo; auf Master und &amp;ldquo;Source&amp;rdquo; auf Slave&lt;/li>
&lt;/ol>
&lt;pre class="shell">
netapp01> &lt;b>snapmirror status&lt;/b>
Snapmirror is on.
Source Destination State Lag Status
netapp02_vfiler01_con:vol_vfiler01 netapp01:vol_vfiler01 Snapmirrored 00:00:39 Idle
netapp01:vol_vfiler01 netapp02:vol_vfiler01 Source 00:06:42 Idle
&lt;/pre>
&lt;pre class="shell">
netapp02> &lt;b>snapmirror status&lt;/b>
Snapmirror is on.
Source Destination State Lag Status
netapp01_vfiler01_con:vol_vfiler01 netapp02:vol_vfiler01 Broken-off 00:07:17 Idle
netapp02:vol_vfiler01 netapp01:vol_vfiler01 Source 00:00:21 Idle
&lt;/pre>
&lt;ol start="3">
&lt;li>Warten bis SnapMirror von netapp02 (Source) auf netapp01 (Destination) &amp;ldquo;In-sync&amp;rdquo;&lt;/li>
&lt;/ol>
&lt;pre class="shell">
netapp01> &lt;b>snapmirror status&lt;/b>
Snapmirror is on.
Source Destination State Lag Status
netapp02_vfiler01_con:vol_vfiler01 netapp01:vol_vfiler01 Snapmirrored 00:00:00 In-sync
netapp01:vol_vfiler01 netapp02:vol_vfiler01 Source 00:08:10 Idle
&lt;/pre>
&lt;pre class="shell">
netapp02> &lt;b>snapmirror status&lt;/b>
Snapmirror is on.
Source Destination State Lag Status
netapp01_vfiler01_con:vol_vfiler01 netapp02:vol_vfiler01 Broken-off 00:08:27 Idle
netapp02:vol_vfiler01 netapp01:vol_vfiler01 Source 00:00:00 In-sync
&lt;/pre>
&lt;ol start="4">
&lt;li>vFiler auf Slave stoppen =&amp;gt; &amp;ldquo;stopped&amp;rdquo;&lt;/li>
&lt;/ol>
&lt;pre class="shell">
netapp02> &lt;b>vfiler stop vfiler01&lt;/b>
vfiler01 stopped
Mon May 9 22:09:45 CEST [netapp02:vf.stopped:warning]: vfiler: 'vfiler01'; stopped
netapp02> &lt;b>vfiler status&lt;/b>
vfiler0 running
vfiler01 stopped
&lt;/pre>
&lt;ol start="5">
&lt;li>vFiler auf Master starten =&amp;gt; &amp;ldquo;running&amp;rdquo;&lt;/li>
&lt;/ol>
&lt;pre class="shell">
netapp01> &lt;b>vfiler dr activate vfiler01@netapp02&lt;/b>
Waiting for "vol_vfiler" to become stable.
Mon May 9 22:10:51 CEST [netapp01:snapmirror.sync.fail:notice]: Synchronous SnapMirror from netapp02_vfiler01_con:vol_vfiler to netapp01:vol_vfiler01 failed.
Mon May 9 22:10:58 CEST [netapp01:wafl.scan.ownblocks.done:info]: Completed block ownership calculation on volume vol_vfiler01. The scanner took 0 ms.
CIFS local server is running.
Mon May 9 22:10:58 CEST [vfiler01@netapp01:cifs.startup.local.succeeded:info]: CIFS: CIFS local server is running.
Mon May 9 22:10:58 CEST [netapp01:httpd.config.mime.missing:warning]: /etc/httpd.mimetypes.sample file is missing.
Mon May 9 22:10:58 CEST [vfiler01@netapp01:httpd.config.mime.missing:warning]: /etc/httpd.mimetypes file is missing.
Mon May 9 22:10:58 CEST [vfiler01@netapp01:httpd.config.mime.missing:warning]: /etc/httpd.mimetypes.sample file is missing.
Vfiler vfiler01 activated.
e0a: flags=0xe48867&lt;UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.2.66 netmask 0xffffff00 broadcast 192.168.2.255
inet 192.168.2.69 netmask 0xffffff00 broadcast 192.168.2.255
ether 00:0c:29:ee:ee:f2 (auto-1000t-fd-up) flowcontrol full
netapp01> Mon May 9 22:10:59 CEST [netapp01:cmds.vfiler.dr.activated:info]: Disaster recovery backup vFiler unit: 'vfiler01' of the vFiler unit at remote storage system: 'netapp02' was activated.
Mon May 9 22:11:22 CEST [vfiler01@netapp01:nbt.nbns.registrationComplete:info]: NBT: All CIFS name registrations have completed for the local server.
netapp01> &lt;b>vfiler status&lt;/b>
vfiler0 running
vfiler01 running
&lt;/pre>
&lt;ol start="6">
&lt;li>Status des SnapMirrors von netapp02 (Source) auf netapp01 (Destination) prüfen =&amp;gt; &amp;ldquo;Source&amp;rdquo; auf netapp02 und &amp;ldquo;Broken-off&amp;rdquo; auf netapp01&lt;/li>
&lt;/ol>
&lt;pre class="shell">
netapp01> &lt;b>snapmirror status&lt;/b>
Snapmirror is on.
Source Destination State Lag Status
netapp02_vfiler01_con:vol_vfiler01 netapp01:vol_vfiler01 Broken-off 00:03:45 Idle
netapp01:vol_vfiler01 netapp02:vol_vfiler01 Source 00:12:19 Idle
&lt;/pre>
&lt;pre class="shell">
netapp02> &lt;b>snapmirror status&lt;/b>
Snapmirror is on.
Source Destination State Lag Status
netapp01_vfiler01_con:vol_vfiler01 netapp02:vol_vfiler01 Broken-off 00:13:03 Idle
netapp02:vol_vfiler 01 netapp01:vol_vfiler01 Source 00:04:29 Idle
&lt;/pre>
&lt;ol start="7">
&lt;li>Resync von Master auf Slave =&amp;gt; Status SnapMirror von netapp01 (Source) auf netapp02 (Destination) &amp;ldquo;In-sync&amp;rdquo; (dauert eine Weile)&lt;/li>
&lt;/ol>
&lt;pre class="shell">
netapp02> &lt;b>vfiler dr resync -s vfiler01@netapp01&lt;/b>
One can optionally provide an alternate ip
path for sync snapmirroring
Alternate IP address/Hostname for remote filer netapp01 []:
Alternate IP address/Hostname for local filer netapp02 []:
netapp01's Administrative login: &lt;b>root&lt;/b>
netapp01's Administrative password:
CIFS local server on vFiler vfiler01 is shutting down...
waiting for CIFS shut down (^C aborts)...
CIFS local server on vfiler vfiler01 has shut down...
Mon May 9 22:14:02 CEST [vfiler01@netapp02:telnet_0:notice]: IP address 192.168.2.68 is removed from interface "e0a"
Configuring SnapMirror to mirror vfiler vfiler01's storage units from remote filer netapp01.
Starting snapmirror initialize commands. It
could take a very long time when the source or
destination filers are involved in many
simultaneous transfers. The console will not be
available until all initialize commands are
started successfully. Please use the
"snapmirror status" command on the source
filer to monitor the progress.
Mon May 9 22:14:06 CEST [netapp02:snapmirror.dst.resync.info:notice]: SnapMirror resync of vol_vfiler01 to netapp01:vol_vfiler01 is using netapp01(4082368508)_vol_vfiler01.4 as the base snapshot.
Mon May 9 22:14:06 CEST [netapp02:vFiler.storageUnit.off:warning]: vFiler vfiler01: storage unit /vol/vol_vfiler01 now offline.
Mon May 9 22:14:07 CEST [netapp02:wafl.snaprestore.revert:info]: Reverting volume vol_vfiler01 to a previous snapshot.
Mon May 9 22:14:08 CEST [netapp02:vFiler.storageUnit.On:notice]: vFiler vfiler01: storage unit /vol/vol_vfiler01 now online.
Revert to resync base snapshot was successful.
Mon May 9 22:14:08 CEST [netapp02:replication.dst.resync.success:notice]: SnapMirror resync of vol_vfiler01 to netapp01:vol_vfiler01 was successful.
SnapMirror transfer initiated for vfiler storage units.
netapp02> &lt;b>snapmirror status&lt;/b>
Snapmirror is on.
Source Destination State Lag Status
netapp01_vfiler01_con:vol_vfiler01 netapp02:vol_vfiler01 Snapmirrored 00:00:00 In-sync
netapp02:vol_vfiler01 netapp01:vol_vfiler01 Source 00:07:31 Idle
&lt;/pre>
&lt;pre class="shell">
netapp01> &lt;b>snapmirror status&lt;/b>
Snapmirror is on.
Source Destination State Lag Status
netapp02_vfiler01_con:vol_vfiler01 netapp01:vol_vfiler01 Broken-off 00:07:56 Idle
netapp01:vol_vfiler01 netapp02:vol_vfiler01 Source 00:00:00 In-sync
&lt;/pre>
&lt;ol start="8">
&lt;li>SnapMirror Beziehungen von Slave zu Master löschen&lt;/li>
&lt;/ol>
&lt;pre class="shell">
netapp02> &lt;b>snapmirror release vol_vfiler01 netapp01:vol_vfiler01&lt;/b>
snapmirror release: vol_vfiler01 netapp01:vol_vfiler01: No release-able destination found that matches those parameters. Use 'snapmirror destinations' to see a list of release-able destinations.
&lt;/pre>
&lt;pre class="shell">
netapp01> &lt;b>snapmirror release vol_vfiler01 netapp01:vol_vfiler01&lt;/b>
snapmirror release: vol_vfiler01 netapp01:vol_vfiler01: No release-able destination found that matches those parameters. Use 'snapmirror destinations' to see a list of release-able destinations.
&lt;/pre>
&lt;p>Wie vor dem Failover wird der vFiler jetzt wieder auf dem Master (netapp01) ausgeführt und die Daten zum Slave (netapp02) repliziert.&lt;/p>
&lt;pre class="shell">
netapp01> &lt;b>vfiler status&lt;/b>
vfiler0 running
vfiler01 running
netapp01> &lt;b>snapmirror status&lt;/b>
Snapmirror is on.
Source Destination State Lag Status
netapp01:vol_vfiler01 netapp02:vol_vfiler01 Source 00:00:00 In-sync
&lt;/pre>
&lt;pre class="shell">
netapp02> &lt;b>vfiler status&lt;/b>
vfiler0 running
vfiler01 stopped, DR backup
netapp02> &lt;b>snapmirror status&lt;/b>
Snapmirror is on.
Source Destination State Lag Status
netapp01_vfiler01_con:vol_vfiler01 netapp02:vol_vfiler01 Snapmirrored 00:00:00 In-sync
&lt;/pre>
&lt;p>&lt;a name="serienlinks">&lt;/a>
Alle Artikel der Serie:&lt;br>
&lt;a
class="gblog-markdown__link"
href="/de/netapp-vfiler-dr-teil1"
title="Teil 1: Download der benötigten Komponenten"
>Teil 1: Download der benötigten Komponenten&lt;/a>&lt;br>
&lt;a
class="gblog-markdown__link"
href="/de/netapp-vfiler-dr-teil2"
title="Teil 2: Einrichtung des 1. Simulators"
>Teil 2: Einrichtung des 1. Simulators&lt;/a>&lt;br>
&lt;a
class="gblog-markdown__link"
href="/de/netapp-vfiler-dr-teil3"
title="Teil 3: Einrichtung des 2. Simulators"
>Teil 3: Einrichtung des 2. Simulators&lt;/a>&lt;br>
&lt;a
class="gblog-markdown__link"
href="/de/netapp-vfiler-dr-teil4"
title="Teil 4: Erstellen eines Aggregats und Volumes"
>Teil 4: Erstellen eines Aggregats und Volumes&lt;/a>&lt;br>
&lt;a
class="gblog-markdown__link"
href="/de/netapp-vfiler-dr-teil5"
title="Teil 5: DNS Konfiguration"
>Teil 5: DNS Konfiguration&lt;/a>&lt;br>
&lt;a
class="gblog-markdown__link"
href="/de/netapp-vfiler-dr-teil6"
title="Teil 6: vFiler erstellen und vFiler DR konfigurieren"
>Teil 6: vFiler erstellen und vFiler DR konfigurieren&lt;/a>&lt;br>
&lt;a
class="gblog-markdown__link"
href="/de/netapp-vfiler-dr-teil7"
title="Teil 7: Synchroner vFiler DR"
>Teil 7: Synchroner vFiler DR&lt;/a>&lt;br>
&lt;a
class="gblog-markdown__link"
href="/de/netapp-vfiler-dr-teil8"
title="Teil 8: Freigaben auf vFiler erstellen"
>Teil 8: Freigaben auf vFiler erstellen&lt;/a>&lt;br>
&lt;a
class="gblog-markdown__link"
href="/de/netapp-vfiler-dr-teil9"
title="Teil 9: Geplanter Failover"
>Teil 9: Geplanter Failover&lt;/a>&lt;br>
&lt;a
class="gblog-markdown__link"
href="/de/netapp-vfiler-dr-teil10"
title="Teil 10: Disaster Failover"
>Teil 10: Disaster Failover&lt;/a>&lt;/p></content><category scheme="https://www.krausmueller.de/tags/netapp" term="netapp" label="netapp"/></entry><entry><title>NetApp vFiler DR mit Data ONTAP Simulator Teil 9: Geplanter Failover</title><link href="https://www.krausmueller.de/2016/04/28/netapp-vfiler-dr-teil9/" rel="alternate" type="text/html" hreflang="de"/><id>https://www.krausmueller.de/2016/04/28/netapp-vfiler-dr-teil9/</id><published>2016-04-28T00:00:00+00:00</published><updated>2016-04-28T00:00:00+00:00</updated><content type="html">
&lt;p>&lt;em style="font-size:0.8em;">Dies ist Teil einer &lt;a
class="gblog-markdown__link"
href="https://www.krausmueller.de/2016/04/28/netapp-vfiler-dr-teil9/#serienlinks"
title="Alle Artikel der Serie"
>Artikelserie&lt;/a>.&lt;/em>&lt;/p>
&lt;p>So wie die Umgebung in den bisherigen Schritten konfiguriert wurde kann man netapp01 als Master und netapp02 als Slave bezeichnen. Clients nutzen die Freigaben des vFilers auf dem Master (netapp01) und die Daten werden auf den Slave (netapp02) repliziert. Dadurch kann der vFiler bei einem Ausfall des Masters ohne Datenverlust auch auf dem Slave gestartet werden. Die Abbildung verdeutlicht die Konfiguration noch einmal.&lt;/p>
&lt;p>&lt;img
src="/images/vfiler_master.png"
alt="Master-Slave-Konfiguration"
/>&lt;/p>
&lt;p>Wird der Slave (netapp02) z.B. für Wartungsarbeiten heruntergefahren und fällt somit aus, hat dies auf die Freigaben erst mal keine Auswirkungen. Die CIFS und NFS Freigaben sind weiter verfügbar. Natürlich können die Daten vom Master (netapp01) nicht mehr auf den Slave (netapp02) repliziert werden, die Datenbestände laufen also auseinander. Sobald netapp02 aber wieder erreichbar ist setzt die Replikation automatisch wieder ein und die Daten werden abgeglichen.&lt;/p>
&lt;p>Aber was geschieht wenn der Master (netapp01) heruntergefahren werden muss oder ausfällt? Um weiter auf die Freigaben zugreifen zu können ist ein Failover auf den Slave (netapp02) notwendig. Dabei wird zwischen einem geplanten Failover (also ein kontrolliertes Umschalten auf den Slave) und einem Disaster Failover unterschieden. In diesem Teil wird der geplante Failover durchgespielt.&lt;/p>
&lt;div class="gblog-post__anchorwrap flex align-center">
&lt;h3 id="geplanter-failover-von-master-zu-slave">
Geplanter Failover von Master zu Slave:
&lt;/h3>
&lt;a data-clipboard-text="https://www.krausmueller.de/2016/04/28/netapp-vfiler-dr-teil9/#geplanter-failover-von-master-zu-slave" class="gblog-post__anchor gblog-post__anchor--right clip" aria-label="Anchor Geplanter Failover von Master zu Slave:" href="#geplanter-failover-von-master-zu-slave">
&lt;svg class="gblog-icon gblog_link">&lt;use xlink:href="#gblog_link">&lt;/use>&lt;/svg>
&lt;/a>
&lt;/div>
&lt;ol>
&lt;li>vFiler auf Master (netapp01) stoppen =&amp;gt; &amp;ldquo;stopped&amp;rdquo;&lt;/li>
&lt;/ol>
&lt;pre class="shell">
netapp01> &lt;b>vfiler stop vfiler01&lt;/b>
vfiler01 stopped
netapp01> Thu Apr 28 20:20:52 CEST [netapp01:vf.stopped:warning]: vfiler: 'vfiler01'; stopped
netapp01> &lt;b>vfiler status&lt;/b>
vfiler0 running
vfiler01 stopped
&lt;/pre>
&lt;pre class="shell">
netapp02> &lt;b>vfiler status&lt;/b>
vfiler0 running
vfiler01 stopped, DR backup
&lt;/pre>
&lt;ol start="2">
&lt;li>vFiler DR auf Slave starten =&amp;gt; &amp;ldquo;running&amp;rdquo;&lt;/li>
&lt;/ol>
&lt;pre class="shell">
netapp02> &lt;b>vfiler dr activate vfiler01@netapp01&lt;/b>
Waiting for "vol_vfiler01" to become stable.
Thu Apr 28 20:33:58 CEST [netapp02:snapmirror.sync.fail:notice]: Synchronous SnapMirror from netapp01_vfiler01_con:vol_vfiler01 to netapp02:vol_vfiler01 failed.
CIFS local server is running.
Thu Apr 28 20:34:04 CEST [vfiler01@netapp02:cifs.startup.local.succeeded:info]: CIFS: CIFS local server is running.
Thu Apr 28 20:34:04 CEST [netapp02:httpd.config.mime.missing:warning]: /etc/httpd.mimetypes.sample file is missing.
Thu Apr 28 20:34:04 CEST [vfiler01@netapp02:httpd.config.mime.missing:warning]: /etc/httpd.mimetypes file is missing.
Thu Apr 28 20:34:04 CEST [vfiler01@netapp02:httpd.config.mime.missing:warning]: /etc/httpd.mimetypes.sample file is missing.
Thu Apr 28 20:34:05 CEST [netapp02:wafl.scan.ownblocks.done:info]: Completed block ownership calculation on volume vol_vfiler01. The scanner took 0 ms.
Vfiler vfiler01 activated.
e0a: flags=0xe48867&lt;UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.2.67 netmask 0xffffff00 broadcast 192.168.2.255
ether 00:0c:29:61:01:2b (auto-1000t-fd-up) flowcontrol full
netapp02> Thu Apr 28 20:34:05 CEST [netapp02:cmds.vfiler.dr.activated:info]: Disaster recovery backup vFiler unit: 'vfiler01' of the vFiler unit at remote storage system: 'netapp01' was activated.
Thu Apr 28 20:34:29 CEST [vfiler01@netapp02:nbt.nbns.registrationComplete:info]: NBT: All CIFS name registrations have completed for the local server.
netapp02> &lt;b>vfiler status&lt;/b>
vfiler0 running
vfiler01 running
&lt;/pre>
&lt;ol start="3">
&lt;li>State des SnapMirrors prüfen =&amp;gt; &amp;ldquo;Source&amp;rdquo; auf Master und &amp;ldquo;Broken-off&amp;rdquo; auf Slave&lt;/li>
&lt;/ol>
&lt;pre class="shell">
netapp01> &lt;b>snapmirror status&lt;/b>
Snapmirror is on.
Source Destination State Lag Status
netapp01:vol_vfiler01 netapp02:vol_vfiler01 Source 00:04:22 Idle
&lt;/pre>
&lt;pre class="shell">
netapp02> &lt;b>snapmirror status&lt;/b>
Snapmirror is on.
Source Destination State Lag Status
netapp01_vfiler01_con:vol_vfiler01 netapp02:vol_vfiler01 Broken-off 00:05:12 Idle
&lt;/pre>
&lt;ol start="4">
&lt;li>Resync von Slave auf Master (&lt;em>&lt;strong>-s&lt;/strong>&lt;/em> für synchrone Replizierung)&lt;/li>
&lt;/ol>
&lt;pre class="shell">
netapp01> &lt;b>vfiler dr resync -s vfiler01@netapp02&lt;/b>
One can optionally provide an alternate ip path for sync snapmirroring
Alternate IP address/Hostname for remote filer netapp02 []:
Alternate IP address/Hostname for local filer netapp01 []:
netapp02's Administrative login: &lt;b>root&lt;/b>
netapp02's Administrative password:
CIFS local server on vFiler vfiler is shutting down...
CIFS local server on vfiler vfiler has shut down...
Thu Apr 28 20:40:57 CEST [vfiler01@netapp01:telnet_0:notice]: IP address 192.168.2.68 is removed from interface "e0a"
Configuring SnapMirror to mirror vfiler vfiler01's storage units from remote filer netapp02.
Starting snapmirror initialize commands. It
could take a very long time when the source or
destination filers are involved in many
simultaneous transfers. The console will not be
available until all initialize commands are
started successfully. Please use the
"snapmirror status" command on the source
filer to monitor the progress.
Thu Apr 28 20:41:00 CEST [netapp01:snapmirror.dst.resync.info:notice]: SnapMirror resync of vol_vfiler01 to netapp02:vol_vfiler01 is using netapp02(4082368507)_vol_vfiler01.4 as the base snapshot.
Thu Apr 28 20:41:00 CEST [netapp01:vFiler.storageUnit.off:warning]: vFiler vfiler01: storage unit /vol/vol_vfiler01 now offline.
Thu Apr 28 20:41:01 CEST [netapp01:wafl.snaprestore.revert:info]: Reverting volume vol_vfiler01 to a previous snapshot.
Thu Apr 28 20:41:02 CEST [netapp01:vFiler.storageUnit.On:notice]: vFiler vfiler01: storage unit /vol/vol_vfiler01 now online.
Revert to resync base snapshot was successful.
Thu Apr 28 20:41:02 CEST [netapp01:replication.dst.resync.success:notice]: SnapMirror resync of vol_vfiler01 to netapp02:vol_vfiler01 was successful.
SnapMirror transfer initiated for vfiler storage units.
&lt;/pre>
&lt;ol start="5">
&lt;li>SnapMirror von netapp02 (Source) auf netapp01 (Destination) prüfen =&amp;gt; zusätzliche Einträge mit State &amp;ldquo;Snapmirrored&amp;rdquo; auf Master und &amp;ldquo;Source&amp;rdquo; auf Slave&lt;/li>
&lt;/ol>
&lt;pre class="shell">
netapp01> &lt;b>snapmirror status&lt;/b>
Snapmirror is on.
Source Destination State Lag Status
netapp02_vfiler01_con:vol_vfiler01 netapp01:vol_vfiler04 Snapmirrored 00:00:00 In-sync
netapp01:vol_vfiler01 netapp02:vol_vfiler01 Source 00:10:45 Idle
&lt;/pre>
&lt;pre class="shell">
netapp02> &lt;b>snapmirror status&lt;/b>
Snapmirror is on.
Source Destination State Lag Status
netapp01_vfiler01_con:vol_vfiler01 netapp02:vol_vfiler01 Broken-off 00:11:31 Idle
netapp02:vol_vfiler01 netapp01:vol_vfiler01 Source 00:00:00 In-sync
&lt;/pre>
&lt;p>Nach diesen Aktionen haben Master und Slave ihre Rollen getauscht. Der vFiler läuft auf netapp02 und die Daten werden von netapp02 auf netapp01 repliziert. Jetzt kann netapp01 für Wartungszwecke heruntergefahren werden.&lt;/p>
&lt;p>&lt;img
src="/images/vfiler_slave.png"
alt="Master-Slave-Konfiguration"
/>&lt;/p>
&lt;p>Ist der &amp;ldquo;alte&amp;rdquo; Master (netapp01) wieder einsatzbereit, kann der vFiler wieder zurück verschoben werden.&lt;/p>
&lt;div class="gblog-post__anchorwrap flex align-center">
&lt;h3 id="rollback-von-slave-zu-master">
Rollback von Slave zu Master
&lt;/h3>
&lt;a data-clipboard-text="https://www.krausmueller.de/2016/04/28/netapp-vfiler-dr-teil9/#rollback-von-slave-zu-master" class="gblog-post__anchor gblog-post__anchor--right clip" aria-label="Anchor Rollback von Slave zu Master" href="#rollback-von-slave-zu-master">
&lt;svg class="gblog-icon gblog_link">&lt;use xlink:href="#gblog_link">&lt;/use>&lt;/svg>
&lt;/a>
&lt;/div>
&lt;ol>
&lt;li>Warten bis SnapMirror von netapp02 (Source) auf netapp01 (Destination) &amp;ldquo;In-sync&amp;rdquo;&lt;/li>
&lt;/ol>
&lt;pre class="shell">
netapp01> &lt;b>snapmirror status&lt;/b>
Snapmirror is on.
Source Destination State Lag Status
netapp02_vfiler01_con:vol_vfiler01 netapp01:vol_vfiler01 Snapmirrored 00:00:00 In-sync
netapp01:vol_vfiler01 netapp02:vol_vfiler01 Source 00:14:45 Idle
&lt;/pre>
&lt;pre class="shell">
netapp02> &lt;b>snapmirror status&lt;/b>
Snapmirror is on.
Source Destination State Lag Status
netapp01_vfiler01_con:vol_vfiler01 netapp02:vol_vfiler01 Broken-off 00:15:31 Idle
netapp02:vol_vfiler01 netapp01:vol_vfiler01 Source 00:00:00 In-sync
&lt;/pre>
&lt;ol start="2">
&lt;li>vFiler auf Slave stoppen =&amp;gt; &amp;ldquo;stopped&amp;rdquo;&lt;/li>
&lt;/ol>
&lt;pre class="shell">
netapp02> &lt;b>vfiler stop vfiler01&lt;/b>
vfiler01 stopped
Thu Apr 28 20:47:10 CEST [netapp02:vf.stopped:warning]: vfiler: 'vfiler01'; stopped
netapp02> &lt;b>vfiler status&lt;/b>
vfiler0 running
vfiler01 stopped
&lt;/pre>
&lt;ol start="3">
&lt;li>vFiler auf Master starten =&amp;gt; &amp;ldquo;running&amp;rdquo;&lt;/li>
&lt;/ol>
&lt;pre class="shell">
netapp01> &lt;b>vfiler dr activate vfiler01@netapp02&lt;/b>
Waiting for "vol_vfiler01" to become stable.
Thu Apr 28 20:48:23 CEST [netapp01:snapmirror.sync.fail:notice]: Synchronous SnapMirror from netapp02_vfiler01_con:vol_vfiler01 to netapp01:vol_vfiler01 failed.
Thu Apr 28 20:48:30 CEST [netapp01:wafl.scan.ownblocks.done:info]: Completed block ownership calculation on volume vol_vfiler01. The scanner took 0 ms.
CIFS local server is running.
Thu Apr 28 20:48:31 CEST [vfiler01@netapp01:cifs.startup.local.succeeded:info]: CIFS: CIFS local server is running.
Thu Apr 28 20:48:31 CEST [netapp01:httpd.config.mime.missing:warning]: /etc/httpd.mimetypes.sample file is missing.
Thu Apr 28 20:48:31 CEST [vfiler01@netapp01:httpd.config.mime.missing:warning]: /etc/httpd.mimetypes file is missing.
Thu Apr 28 20:48:31 CEST [vfiler01@netapp01:httpd.config.mime.missing:warning]: /etc/httpd.mimetypes.sample file is missing.
Vfiler vfiler01 activated.
e0a: flags=0xe48867&lt;UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.2.66 netmask 0xffffff00 broadcast 192.168.2.255
inet 192.168.2.69 netmask 0xffffff00 broadcast 192.168.2.255
ether 00:0c:29:ee:ee:f2 (auto-1000t-fd-up) flowcontrol full
netapp01> Thu Apr 28 20:48:32 CEST [netapp01:cmds.vfiler.dr.activated:info]: Disaster recovery backup vFiler unit: 'vfiler01' of the vFiler unit at remote storage system: 'netapp02' was activated.
Thu Apr 28 20:48:55 CEST [vfiler01@netapp01:nbt.nbns.registrationComplete:info]: NBT: All CIFS name registrations have completed for the local server.
netapp01> &lt;b>vfiler status&lt;/b>
vfiler0 running
vfiler01 running
&lt;/pre>
&lt;ol start="4">
&lt;li>Status des SnapMirrors von netapp02 (Source) auf netapp01 (Destination) prüfen =&amp;gt; &amp;ldquo;Source&amp;rdquo; auf netapp02 und &amp;ldquo;Broken-off&amp;rdquo; auf netapp01&lt;/li>
&lt;/ol>
&lt;pre class="shell">
netapp01> &lt;b>snapmirror status&lt;/b>
Snapmirror is on.
Source Destination State Lag Status
netapp02_vfiler01_con:vol_vfiler01 netapp01:vol_vfiler01 Broken-off 00:03:38 Idle
netapp01:vol_vfiler01 netapp02:vol_vfiler01 Source 00:17:04 Idle
&lt;/pre>
&lt;pre class="shell">
netapp02> &lt;b>snapmirror status&lt;/b>
Snapmirror is on.
Source Destination State Lag Status
netapp01_vfiler01_con:vol_vfiler01 netapp02:vol_vfiler01 Broken-off 00:17:58 Idle
netapp02:vol_vfiler01 netapp01:vol_vfiler01 Source 00:04:32 Idle
&lt;/pre>
&lt;ol start="5">
&lt;li>Resync von Master auf Slave =&amp;gt; Status SnapMirror von netapp01 (Source) auf netapp02 (Destination) &amp;ldquo;In-sync&amp;rdquo; (dauert eine Weile)&lt;/li>
&lt;/ol>
&lt;pre class="shell">
netapp02> &lt;b>vfiler dr resync -s vfiler01@netapp01&lt;/b>
One can optionally provide an alternate ip
path for sync snapmirroring
Alternate IP address/Hostname for remote filer netapp01 []:
Alternate IP address/Hostname for local filer netapp02 []:
netapp01's Administrative login: &lt;b>root&lt;/b>
netapp01's Administrative password:
CIFS local server on vFiler vfiler01 is shutting down...
waiting for CIFS shut down (^C aborts)...
CIFS local server on vfiler vfiler01 has shut down...
Thu Apr 28 20:53:02 CEST [vfiler01@netapp02:telnet_0:notice]: IP address 192.168.2.68 is removed from interface "e0a"
Configuring SnapMirror to mirror vfiler vfiler01's storage units from remote filer netapp01.
Starting snapmirror initialize commands. It
could take a very long time when the source or
destination filers are involved in many
simultaneous transfers. The console will not be
available until all initialize commands are
started successfully. Please use the
"snapmirror status" command on the source
filer to monitor the progress.
Thu Apr 28 20:53:06 CEST [netapp02:snapmirror.dst.resync.info:notice]: SnapMirror resync of vol_vfiler01 to netapp01:vol_vfiler01 is using netapp01(4082368508)_vol_vfiler01.5 as the base snapshot.
Thu Apr 28 20:53:06 CEST [netapp02:vFiler.storageUnit.off:warning]: vFiler vfiler01: storage unit /vol/vol_vfiler01 now offline.
Thu Apr 28 20:53:08 CEST [netapp02:wafl.snaprestore.revert:info]: Reverting volume vol_vfiler01 to a previous snapshot.
Thu Apr 28 20:53:09 CEST [netapp02:vFiler.storageUnit.On:notice]: vFiler vfiler01: storage unit /vol/vol_vfiler01 now online.
Revert to resync base snapshot was successful.
Thu Apr 28 20:53:10 CEST [netapp02:replication.dst.resync.success:notice]: SnapMirror resync of vol_vfiler01 to netapp01:vol_vfiler01 was successful.
SnapMirror transfer initiated for vfiler storage units.
netapp02> &lt;b>snapmirror status&lt;/b>
Snapmirror is on.
Source Destination State Lag Status
netapp01_vfiler01_con:vol_vfiler01 netapp02:vol_vfiler01 Snapmirrored 00:00:00 In-sync
netapp02:vol_vfiler01 netapp01:vol_vfiler01 Source 00:08:02 Idle
&lt;/pre>
&lt;pre class="shell">
netapp01> &lt;b>snapmirror status&lt;/b>
Snapmirror is on.
Source Destination State Lag Status
netapp02_vfiler01_con:vol_vfiler01 netapp01:vol_vfiler01 Broken-off 00:08:37 Idle
netapp01:vol_vfiler01 netapp02:vol_vfiler01 Source 00:00:00 In-sync
&lt;/pre>
&lt;ol start="6">
&lt;li>SnapMirror Beziehungen von Slave zu Master löschen&lt;/li>
&lt;/ol>
&lt;pre class="shell">
netapp02> &lt;b>snapmirror release vol_vfiler01 netapp01:vol_vfiler01&lt;/b>
snapmirror release: vol_vfiler01 netapp01:vol_vfiler01: No release-able destination found that matches those parameters. Use 'snapmirror destinations' to see a list of release-able destinations.
&lt;/pre>
&lt;pre class="shell">
netapp01> &lt;b>snapmirror release vol_vfiler01 netapp01:vol_vfiler01&lt;/b>
snapmirror release: vol_vfiler01 netapp01:vol_vfiler01: No release-able destination found that matches those parameters. Use 'snapmirror destinations' to see a list of release-able destinations.
&lt;/pre>
&lt;p>Wie vor dem Failover wird der vFiler jetzt wieder auf dem Master (netapp01) ausgeführt und die Daten zum Slave (netapp02) repliziert (vgl. erste Abbildung).&lt;/p>
&lt;pre class="shell">
netapp01> &lt;b>vfiler status&lt;/b>
vfiler0 running
vfiler01 running
netapp01> &lt;b>snapmirror status&lt;/b>
Snapmirror is on.
Source Destination State Lag Status
netapp01:vol_vfiler01 netapp02:vol_vfiler01 Source 00:00:00 In-sync
&lt;/pre>
&lt;pre class="shell">
netapp02> &lt;b>vfiler status&lt;/b>
vfiler0 running
vfiler01 stopped, DR backup
netapp02> &lt;b>snapmirror status&lt;/b>
Snapmirror is on.
Source Destination State Lag Status
netapp01_vfiler01_con:vol_vfiler01 netapp02:vol_vfiler01 Snapmirrored 00:00:00 In-sync
&lt;/pre>
&lt;p>&lt;a name="serienlinks">&lt;/a>
Alle Artikel der Serie:&lt;br>
&lt;a
class="gblog-markdown__link"
href="/de/netapp-vfiler-dr-teil1"
title="Teil 1: Download der benötigten Komponenten"
>Teil 1: Download der benötigten Komponenten&lt;/a>&lt;br>
&lt;a
class="gblog-markdown__link"
href="/de/netapp-vfiler-dr-teil2"
title="Teil 2: Einrichtung des 1. Simulators"
>Teil 2: Einrichtung des 1. Simulators&lt;/a>&lt;br>
&lt;a
class="gblog-markdown__link"
href="/de/netapp-vfiler-dr-teil3"
title="Teil 3: Einrichtung des 2. Simulators"
>Teil 3: Einrichtung des 2. Simulators&lt;/a>&lt;br>
&lt;a
class="gblog-markdown__link"
href="/de/netapp-vfiler-dr-teil4"
title="Teil 4: Erstellen eines Aggregats und Volumes"
>Teil 4: Erstellen eines Aggregats und Volumes&lt;/a>&lt;br>
&lt;a
class="gblog-markdown__link"
href="/de/netapp-vfiler-dr-teil5"
title="Teil 5: DNS Konfiguration"
>Teil 5: DNS Konfiguration&lt;/a>&lt;br>
&lt;a
class="gblog-markdown__link"
href="/de/netapp-vfiler-dr-teil6"
title="Teil 6: vFiler erstellen und vFiler DR konfigurieren"
>Teil 6: vFiler erstellen und vFiler DR konfigurieren&lt;/a>&lt;br>
&lt;a
class="gblog-markdown__link"
href="/de/netapp-vfiler-dr-teil7"
title="Teil 7: Synchroner vFiler DR"
>Teil 7: Synchroner vFiler DR&lt;/a>&lt;br>
&lt;a
class="gblog-markdown__link"
href="/de/netapp-vfiler-dr-teil8"
title="Teil 8: Freigaben auf vFiler erstellen"
>Teil 8: Freigaben auf vFiler erstellen&lt;/a>&lt;br>
&lt;a
class="gblog-markdown__link"
href="/de/netapp-vfiler-dr-teil9"
title="Teil 9: Geplanter Failover"
>Teil 9: Geplanter Failover&lt;/a>&lt;br>
&lt;a
class="gblog-markdown__link"
href="/de/netapp-vfiler-dr-teil10"
title="Teil 10: Disaster Failover"
>Teil 10: Disaster Failover&lt;/a>&lt;/p></content><category scheme="https://www.krausmueller.de/tags/netapp" term="netapp" label="netapp"/></entry><entry><title>NetApp vFiler DR mit Data ONTAP Simulator Teil 8: Freigaben auf vFiler erstellen</title><link href="https://www.krausmueller.de/2016/02/21/netapp-vfiler-dr-teil8/" rel="alternate" type="text/html" hreflang="de"/><id>https://www.krausmueller.de/2016/02/21/netapp-vfiler-dr-teil8/</id><published>2016-02-21T00:00:00+00:00</published><updated>2016-02-21T00:00:00+00:00</updated><content type="html">
&lt;p>&lt;em style="font-size:0.8em;">Dies ist Teil einer &lt;a
class="gblog-markdown__link"
href="https://www.krausmueller.de/2016/02/21/netapp-vfiler-dr-teil8/#serienlinks"
title="Alle Artikel der Serie"
>Artikelserie&lt;/a>.&lt;/em>&lt;/p>
&lt;p>In diesem Schritt werden eine CIFS und eine NFS Freigabe erstellt. Die Freigaben auf dem vFiler können nicht über OnCommand System Manager konfiguriert werden, stattdessen muss die Console oder SSH genutzt werden. SSH muss auf dem vFiler zuerst aktiviert werden. Dazu wird eine Sitzung auf dem 1. Simulator (netapp01) verwendet. Kommandos können von dort aus auf dem vFiler ausgeführt werden. Das Muster ist dabei &lt;em>&lt;strong>vfiler run &amp;lt;Name des vFilers&amp;gt; &amp;lt;Kommando&amp;gt;&lt;/strong>&lt;/em>.&lt;/p>
&lt;pre class="shell">
netapp01> &lt;b>vfiler run vfiler01 secureadmin setup ssh&lt;/b>
===== vfiler01
SSH Setup
---------
Determining if SSH Setup has already been done before...no
SSH server supports both ssh1.x and ssh2.0 protocols.
SSH server needs two RSA keys to support ssh1.x protocol. The host key is
generated and saved to file /vol/vol_vfiler01/etc/sshd/ssh_host_key during setup. The server
key is re-generated every hour when SSH server is running.
SSH server needs a RSA host key and a DSA host key to support ssh2.0 protocol.
The host keys are generated and saved to /vol/vol_vfiler01/etc/sshd/ssh_host_rsa_key and
/vol/vol_vfiler01/etc/sshd/ssh_host_dsa_key files respectively during setup.
SSH Setup will now ask you for the sizes of the host and server keys.
For ssh1.0 protocol, key sizes must be between 384 and 2048 bits.
For ssh2.0 protocol, key sizes must be between 768 and 2048 bits.
The size of the host and server keys must differ by at least 128 bits.
Please enter the size of host key for ssh1.x protocol [768] :
Please enter the size of server key for ssh1.x protocol [512] :
Please enter the size of host keys for ssh2.0 protocol [768] :
You have specified these parameters:
host key size = 768 bits
server key size = 512 bits
host key size for ssh2.0 protocol = 768 bits
Is this correct? [yes]
Setup will now generate the host keys. It will take a minute.
After Setup is finished the SSH server will start automatically.
netapp01> Wed Feb 17 20:15:16 CET [vfiler01@netapp01:secureadmin.ssh.setup.passed:info]: SSH setup is done and ssh2 is enabled. Host keys are stored in /vol/vol_vfiler01/etc/sshd/ssh_host_key, /vol/vol_vfiler01/etc/sshd/ssh_host_rsa_key, and /vol/vol_vfiler01/etc/sshd/ssh_host_dsa_key.
netapp01> &lt;b>vfiler run vfiler01 secureadmin status&lt;/b>
===== vfiler01
ssh2 - active
ssh1 - inactive
&lt;/pre>
&lt;p>Ab sofort ist es möglich sich per SSH direkt auf den vFiler zu verbinden und Kommandos dort auszuführen. Alternativ kann man diesen Schritt natürlich auch überspringen und alle Kommandos mit &lt;em>&lt;strong>vfiler run &amp;hellip;&lt;/strong>&lt;/em> vom Host auf dem der vFiler läuft (in diesem Fall netapp01) aus aufrufen.&lt;/p>
&lt;p>Als nächstes wird die CIFS Freigabe erstellt. Falls während der Erstellung des vFilers CIFS noch nicht konfiguriert wurde, muss dies als erstes geschehen (vgl. &lt;a
class="gblog-markdown__link"
href="/de/netapp-vfiler-dr-teil6"
title="Teil 6: vFiler erstellen und vFiler DR konfigurieren"
>Teil 6&lt;/a>). In diesem Beispiel wird der vFiler nicht in eine Active Directory Domäne aufgenommen, sondern für Berechtigungen nur die lokalen Benutzer des vFilers verwendet (Option 3 während der Konfiguration).&lt;/p>
&lt;pre class="shell">
vfiler01@netapp01> &lt;b>cifs setup&lt;/b>
....
This process will enable CIFS access to the filer from a Windows(R) system.
Use "?" for help at any prompt and Ctrl-C to exit without committing changes.
Your filer does not have WINS configured and is visible only to
clients on the same subnet.
Do you want to make the system visible via WINS? [n]: &lt;b>n&lt;/b>
A filer can be configured for multiprotocol access, or as an NTFS-only
filer. Since multiple protocols are currently licensed on this filer,
we recommend that you configure this filer as a multiprotocol filer
(1) Multiprotocol filer
(2) NTFS-only filer
Selection (1-2)? [1]: &lt;b>1&lt;/b>
CIFS requires local /etc/passwd and /etc/group files and default files
will be created. The default passwd file contains entries for 'root',
'pcuser', and 'nobody'.
The default name for this CIFS server is 'VFILER'.
Would you like to change this name? [n]: &lt;b>n&lt;/b>
Data ONTAP CIFS services support four styles of user authentication.
Choose the one from the list below that best suits your situation.
(1) Active Directory domain authentication (Active Directory domains only)
(2) Windows NT 4 domain authentication (Windows NT or Active Directory domains)
(3) Windows Workgroup authentication using the filer's local user accounts
(4) /etc/passwd and/or NIS/LDAP authentication
Selection (1-4)? [1]: &lt;b>3&lt;/b>
What is the name of the Workgroup? [WORKGROUP]: &lt;b>WORKGROUP&lt;/b>
CIFS - Starting SMB protocol...
It is recommended that you create the local administrator account
(VFILER01\administrator) for this filer.
Do you want to create the VFILER01\administrator account? [y]: &lt;b>y&lt;/b>
Enter the new password for VFILER01\administrator:
Retype the password:
Welcome to the WORKGROUP Windows(R) workgroup
vfiler01@netapp01> Wed Feb 17 21:41:06 CET [vfiler01@netapp01:cifs.startup.local.succeeded:info]: CIFS: CIFS local server is running.
&lt;/pre>
&lt;p>Für den Zugriff auf Freigaben kann man den soeben angelegten Benutzer &lt;em>&lt;strong>VFILER01\administrator&lt;/strong>&lt;/em> verwenden, oder es kann ein eigener Benutzer angelegt werden:&lt;/p>
&lt;pre class="shell">
vfiler01@netapp01> &lt;b>useradmin user add user01 -g Guests&lt;/b>
New password:
Retype new password:
User &amp;lt;user01> added.
vfiler01@netapp01> Wed Feb 17 21:49:18 CET [vfiler01@netapp01:useradmin.added.deleted:info]: The user 'user01' has been added.
&lt;/pre>
&lt;p>Nachdem CIFS jetzt auf dem vFiler aktiviert ist, kann die Freigabe angelegt werden. Dazu wird erst ein &lt;a
class="gblog-markdown__link"
href="https://library.netapp.com/ecmdocs/ECMP1154894/html/GUID-8F084F85-2AB8-4622-B4F3-2D9E68559292.html"
title="What is a qtree?"
>qtree&lt;/a> und danach die Freigabe erstellt.&lt;/p>
&lt;pre class="shell">
vfiler01@netapp01> &lt;b>qtree create /vol/vol_vfiler01/q_cifs&lt;/b>
vfiler01@netapp01> &lt;b>qtree security /vol/vol_vfiler01/q_cifs ntfs&lt;/b>
vfiler01@netapp01> &lt;b>qtree status&lt;/b>
Volume Tree Style Oplocks Status
-------- -------- ----- -------- ---------
vol_vfiler01 unix enabled normal
vol_vfiler01 q_cifs ntfs enabled normal
vfiler01@netapp01> &lt;b>cifs shares -add cifs01 /vol/vol_vfiler01/q_cifs&lt;/b>
vfiler01@netapp01> &lt;b>cifs shares&lt;/b>
Name Mount Point Description
---- ----------- -----------
ETC$ /vol/vol_vfiler01/etc Remote Administration
** priv access only **
HOME /vol/vol_vfiler01/home Default Share
everyone / Full Control
C$ / Remote Administration
** priv access only **
cifs01 /vol/vol_vfiler01/q_cifs
everyone / Full Control
&lt;/pre>
&lt;p>Auf die Freigabe kann jetzt z.B. über &lt;em>&lt;strong>\\192.168.2.68\cifs01&lt;/strong>&lt;/em> (als Benutzer &lt;em>&lt;strong>VFILER01\user01&lt;/strong>&lt;/em>) zugegriffen werden. Eine Einschränkung der Berechtigungen ist für diese Artikelserie nicht notwendig. Jeder hat volle Rechte auf die Freigabe.&lt;/p>
&lt;p>Für die NFS Freigabe wird auch wieder ein qtree erstellt und danach der Share für alle Hosts im Netz 192.168.2.0/24 freigegeben.&lt;/p>
&lt;pre class="shell">
vfiler01@netapp01> &lt;b>qtree create /vol/vol_vfiler01/q_nfs&lt;/b>
vfiler01@netapp01> &lt;b>qtree security /vol/vol_vfiler01/q_cifs unix&lt;/b>
vfiler01@netapp01> &lt;b>qtree status&lt;/b>
Volume Tree Style Oplocks Status
-------- -------- ----- -------- ---------
vol_vfiler01 unix enabled normal
vol_vfiler01 q_cifs ntfs enabled normal
vol_vfiler01 q_nfs unix enabled normal
vfiler01@netapp01> &lt;b>exportfs -p rw=192.168.2.0/24,root=192.168.2.0/24 /vol/vol_vfiler01/q_nfs&lt;/b>
vfiler01@netapp01> &lt;b>exportfs&lt;/b>
/vol/vol_vfiler01/q_nfs -sec=sys,rw=192.168.2.0/24,root=192.168.2.0/24
/vol/vol_vfiler01 -sec=sys,rw,anon=0,nosuid
&lt;/pre>
&lt;p>Von einem Linux Server kann die Freigabe nun gemountet werden.&lt;/p>
&lt;pre class="shell">
hostname:~# &lt;b>mount 192.168.2.68:/vol/vol_vfiler01/q_nfs /media/cdrom&lt;/b>
&lt;/pre>
&lt;p>&lt;a name="serienlinks">&lt;/a>
Alle Artikel der Serie:&lt;br>
&lt;a
class="gblog-markdown__link"
href="/de/netapp-vfiler-dr-teil1"
title="Teil 1: Download der benötigten Komponenten"
>Teil 1: Download der benötigten Komponenten&lt;/a>&lt;br>
&lt;a
class="gblog-markdown__link"
href="/de/netapp-vfiler-dr-teil2"
title="Teil 2: Einrichtung des 1. Simulators"
>Teil 2: Einrichtung des 1. Simulators&lt;/a>&lt;br>
&lt;a
class="gblog-markdown__link"
href="/de/netapp-vfiler-dr-teil3"
title="Teil 3: Einrichtung des 2. Simulators"
>Teil 3: Einrichtung des 2. Simulators&lt;/a>&lt;br>
&lt;a
class="gblog-markdown__link"
href="/de/netapp-vfiler-dr-teil4"
title="Teil 4: Erstellen eines Aggregats und Volumes"
>Teil 4: Erstellen eines Aggregats und Volumes&lt;/a>&lt;br>
&lt;a
class="gblog-markdown__link"
href="/de/netapp-vfiler-dr-teil5"
title="Teil 5: DNS Konfiguration"
>Teil 5: DNS Konfiguration&lt;/a>&lt;br>
&lt;a
class="gblog-markdown__link"
href="/de/netapp-vfiler-dr-teil6"
title="Teil 6: vFiler erstellen und vFiler DR konfigurieren"
>Teil 6: vFiler erstellen und vFiler DR konfigurieren&lt;/a>&lt;br>
&lt;a
class="gblog-markdown__link"
href="/de/netapp-vfiler-dr-teil7"
title="Teil 7: Synchroner vFiler DR"
>Teil 7: Synchroner vFiler DR&lt;/a>&lt;br>
&lt;a
class="gblog-markdown__link"
href="/de/netapp-vfiler-dr-teil8"
title="Teil 8: Freigaben auf vFiler erstellen"
>Teil 8: Freigaben auf vFiler erstellen&lt;/a>&lt;br>
&lt;a
class="gblog-markdown__link"
href="/de/netapp-vfiler-dr-teil9"
title="Teil 9: Geplanter Failover"
>Teil 9: Geplanter Failover&lt;/a>&lt;br>
&lt;a
class="gblog-markdown__link"
href="/de/netapp-vfiler-dr-teil10"
title="Teil 10: Disaster Failover"
>Teil 10: Disaster Failover&lt;/a>&lt;/p></content><category scheme="https://www.krausmueller.de/tags/netapp" term="netapp" label="netapp"/></entry><entry><title>NetApp vFiler DR mit Data ONTAP Simulator Teil 7: Synchroner vFiler DR</title><link href="https://www.krausmueller.de/2016/02/12/netapp-vfiler-dr-teil7/" rel="alternate" type="text/html" hreflang="de"/><id>https://www.krausmueller.de/2016/02/12/netapp-vfiler-dr-teil7/</id><published>2016-02-12T00:00:00+00:00</published><updated>2016-02-12T00:00:00+00:00</updated><content type="html">
&lt;p>&lt;em style="font-size:0.8em;">Dies ist Teil einer &lt;a
class="gblog-markdown__link"
href="https://www.krausmueller.de/2016/02/12/netapp-vfiler-dr-teil7/#serienlinks"
title="Alle Artikel der Serie"
>Artikelserie&lt;/a>.&lt;/em>&lt;/p>
&lt;p>&lt;strong>Hinweis:&lt;/strong> Dieser Schritt kann übersprungen werden wenn statt einem synchronen Spiegel ein asynchroner SnapMirror (wie in &lt;a
class="gblog-markdown__link"
href="/de/netapp-vfiler-dr-teil6"
title="Teil 6: vFiler erstellen und vFiler DR konfigurieren"
>Teil 6&lt;/a> eingerichtet) ausreicht und vFiler DR bereits konfiguriert wurde.&lt;/p>
&lt;p>In &lt;a
class="gblog-markdown__link"
href="/de/netapp-vfiler-dr-teil6"
title="Teil 6: vFiler erstellen und vFiler DR konfigurieren"
>Teil 6&lt;/a> der Serie wurde der DR vFiler mit einem asynchronen SnapMirror angelegt. Die Daten werden also mit einem leichten Zeitversatz übertragen. Stattdessen kann auch ein synchroner SnapMirror angelegt werden, die Daten werden dann sofort auf dem vFiler und seinem Spiegel geschrieben. Dafür müssen alle Volumes des vFilers mindestens 10 GB groß sein (deswegen wurde in &lt;a
class="gblog-markdown__link"
href="/de/netapp-vfiler-dr-teil4"
title="Teil 4: Erstellen eines Aggregats und Volumes"
>Teil 4&lt;/a> ein Volume mit der Größe 10 GB angelegt). Zusätzlich muss zwingend die Namensauflösung des jeweils anderen Simulators funktionieren. Wenn die DNS Einstellungen (wie auch im Video von &lt;a
class="gblog-markdown__link"
href="/de/netapp-vfiler-dr-teil1"
title="Teil 1: Download der benötigten Komponenten"
>Teil 1&lt;/a>) nicht bei der Installation konfiguriert wurden, können die richtigen Einstellungen auch im Nachhinein über OnCommand System Manager (Configuration =&amp;gt; Network =&amp;gt; DNS) gesetzt werden. Wenn kein DNS Server zur Verfügung steht ist es auch möglich die Daten in die Datei /etc/hosts auf dem jeweiligen Simulator einzutragen.&lt;/p>
&lt;pre class="shell">
netapp01> &lt;b>rdfile /etc/hosts&lt;/b>
127.0.0.1 localhost localhost-stack
127.0.10.1 localhost-10 localhost-bsd
127.0.20.1 localhost-20 localhost-sk
192.168.2.66 netapp01 netapp01-e0a
# 0.0.0.0 netapp01-e0b
# 0.0.0.0 netapp01-e0c
# 0.0.0.0 netapp01-e0d
netapp01> &lt;b>wrfile /etc/hosts&lt;/b>
127.0.0.1 localhost localhost-stack
127.0.10.1 localhost-10 localhost-bsd
127.0.20.1 localhost-20 localhost-sk
192.168.2.66 netapp01 netapp01-e0a
# 0.0.0.0 netapp01-e0b
# 0.0.0.0 netapp01-e0c
# 0.0.0.0 netapp01-e0d
192.168.2.67 netapp02
read: error reading standard input: Interrupted system call
netapp01> &lt;b>rdfile /etc/hosts&lt;/b>
127.0.0.1 localhost localhost-stack
127.0.10.1 localhost-10 localhost-bsd
127.0.20.1 localhost-20 localhost-sk
192.168.2.66 netapp01 netapp01-e0a
# 0.0.0.0 netapp01-e0b
# 0.0.0.0 netapp01-e0c
# 0.0.0.0 netapp01-e0d
192.168.2.67 netapp02
&lt;/pre>
&lt;p>Mit &lt;em>&lt;strong>rdfile /etc/hosts&lt;/strong>&lt;/em> wird der Inhalt der Datei /etc/hosts ausgegeben. Die Datei kann mit SSH leider nicht editiert werden, sondern muss neu geschrieben werden. Man muss also den vorherigen Inhalt kopieren und die Datei mit &lt;em>&lt;strong>wrfile /etc/hosts&lt;/strong>&lt;/em> neu schreiben. Nach dem Einfügen des bisherigen Inhalts aus der Zwischenablage wird die zusätzliche Zeile (Eintrag besteht aus IP und Hostname der anderen Simulators) eingegeben und das Editieren der Datei mit Ctrl+C beendet. Danach kann der Inhalt mit &lt;em>&lt;strong>rdfile /etc/hosts&lt;/strong>&lt;/em> kontrolliert werden. Ein kurzes Video verdeutlicht die Vorgehensweise am Beispiel des 2. Simulators (netapp02).&lt;/p>
&lt;video controls="controls" width="672" height="324">
&lt;source src="/videos/netapp04.mp4" type="video/mp4" />
&lt;object type="application/x-shockwave-flash" data="http://releases.flowplayer.org/swf/flowplayer-3.2.1.swf" width="640" height="360">
&lt;param name="movie" value="http://releases.flowplayer.org/swf/flowplayer-3.2.1.swf" />
&lt;param name="allowFullScreen" value="true" />
&lt;param name="wmode" value="transparent" />
&lt;param name="flashVars" value="config={'playlist':[{'url':'%2Fmedia%2Fvideos%2Fnetapp01.mp4','autoPlay':false}]}" />
&lt;/object>
&lt;/video>
&lt;p>Die Konfiguration kann mit einem ping von beiden Systemen kontrolliert werden:&lt;/p>
&lt;pre class="shell">
netapp01> &lt;b>ping netapp02&lt;/b>
netapp02 is alive
&lt;/pre>
&lt;pre class="shell">
netapp02> &lt;b>ping netapp01&lt;/b>
netapp01 is alive
&lt;/pre>
&lt;p>Der vFiler DR wird fast genauso wie in &lt;a
class="gblog-markdown__link"
href="/de/netapp-vfiler-dr-teil6"
title="Teil 6: vFiler erstellen und vFiler DR konfigurieren"
>Teil 6&lt;/a> beschrieben eingerichtet.Für einen synchronen SnapMirror muss lediglich die Option &lt;em>&lt;strong>-s&lt;/strong>&lt;/em> hinzugefügt werden.&lt;/p>
&lt;pre class="shell">
netapp02> &lt;b>vfiler dr configure -s vfiler01@192.168.2.66&lt;/b>
One can optionally provide an alternate ip
path for sync snapmirroring
Alternate IP address/Hostname for remote filer 192.168.2.66 []:
Alternate IP address/Hostname for local filer netapp02 []:
192.168.2.66's Administrative login: root
192.168.2.66's Administrative password:
Configuring SnapMirror to mirror vfiler vfiler01's storage units from remote filer 192.168.2.66.
Upon Activation, configure vfiler IP address 192.168.2.68? [y]:
Interface to assign this address to {e0a, e0b, e0c, e0d}: &lt;b>e0a&lt;/b>
Netmask to use: [255.255.255.0]:
Starting snapmirror initialize commands. It
could take a very long time when the source or
destination filers are involved in many
simultaneous transfers. The console will not be
available until all initialize commands are
started successfully. Please use the
"snapmirror status" command on the source
filer to monitor the progress.
Volume 'vol_vfiler01' is now restricted.
Upon activation, do you want the DR vfiler to use a different
set of DNS servers from the production vfiler? [n]:
SnapMirror transfer initiated for vfiler storage units.
&lt;/pre>
&lt;p>Der SnapMirror sieht bei einem &lt;em>&lt;strong>snapmirror status&lt;/strong>&lt;/em> zuerst genauso aus wie ein asynchroner SnapMirror. Nach dem ersten erfolgreichen Abgleich wechselt der Status jedoch auf &amp;ldquo;In-sync&amp;rdquo;.&lt;/p>
&lt;pre class="shell">
netapp02> &lt;b>snapmirror status&lt;/b>
Snapmirror is on.
Source Destination State Lag Status
192.168.2.66_vfiler01_con:vol_vfiler01 netapp02:vol_vfiler01 Snapmirrored 00:00:30 Idle
netapp02> &lt;b>snapmirror status&lt;/b>
Snapmirror is on.
Source Destination State Lag Status
192.168.2.66_vfiler01_con:vol_vfiler01 netapp02:vol_vfiler01 Snapmirrored 00:00:00 In-sync
&lt;/pre>
&lt;p>Falls der Status nicht auf &amp;ldquo;In-sync&amp;rdquo; wechseln sollte, können die Syslog-Einträge im OnCommand System Manager (Diagnostics =&amp;gt; Logs =&amp;gt; Syslog) helfen die Ursache zu finden. Bei falscher bzw. fehlender DNS Konfiguration erhielt ich z.B. &lt;em>&amp;ldquo;SnapMirror is unable to setup a multipath connection to vol_vfiler01, resorting to the standard single TCP connection.&amp;rdquo;&lt;/em> und &lt;em>&amp;ldquo;SnapMirror: destination transfer from 192.168.2.66_vfiler01_con:vol_vfiler01 to vol_vfiler01 : Error in snapmirror sync mode negotiation.&amp;rdquo;&lt;/em> als Fehlermeldungen.&lt;/p>
&lt;p>&lt;a name="serienlinks">&lt;/a>
Alle Artikel der Serie:&lt;br>
&lt;a
class="gblog-markdown__link"
href="/de/netapp-vfiler-dr-teil1"
title="Teil 1: Download der benötigten Komponenten"
>Teil 1: Download der benötigten Komponenten&lt;/a>&lt;br>
&lt;a
class="gblog-markdown__link"
href="/de/netapp-vfiler-dr-teil2"
title="Teil 2: Einrichtung des 1. Simulators"
>Teil 2: Einrichtung des 1. Simulators&lt;/a>&lt;br>
&lt;a
class="gblog-markdown__link"
href="/de/netapp-vfiler-dr-teil3"
title="Teil 3: Einrichtung des 2. Simulators"
>Teil 3: Einrichtung des 2. Simulators&lt;/a>&lt;br>
&lt;a
class="gblog-markdown__link"
href="/de/netapp-vfiler-dr-teil4"
title="Teil 4: Erstellen eines Aggregats und Volumes"
>Teil 4: Erstellen eines Aggregats und Volumes&lt;/a>&lt;br>
&lt;a
class="gblog-markdown__link"
href="/de/netapp-vfiler-dr-teil5"
title="Teil 5: DNS Konfiguration"
>Teil 5: DNS Konfiguration&lt;/a>&lt;br>
&lt;a
class="gblog-markdown__link"
href="/de/netapp-vfiler-dr-teil6"
title="Teil 6: vFiler erstellen und vFiler DR konfigurieren"
>Teil 6: vFiler erstellen und vFiler DR konfigurieren&lt;/a>&lt;br>
&lt;a
class="gblog-markdown__link"
href="/de/netapp-vfiler-dr-teil7"
title="Teil 7: Synchroner vFiler DR"
>Teil 7: Synchroner vFiler DR&lt;/a>&lt;br>
&lt;a
class="gblog-markdown__link"
href="/de/netapp-vfiler-dr-teil8"
title="Teil 8: Freigaben auf vFiler erstellen"
>Teil 8: Freigaben auf vFiler erstellen&lt;/a>&lt;br>
&lt;a
class="gblog-markdown__link"
href="/de/netapp-vfiler-dr-teil9"
title="Teil 9: Geplanter Failover"
>Teil 9: Geplanter Failover&lt;/a>&lt;br>
&lt;a
class="gblog-markdown__link"
href="/de/netapp-vfiler-dr-teil10"
title="Teil 10: Disaster Failover"
>Teil 10: Disaster Failover&lt;/a>&lt;/p></content><category scheme="https://www.krausmueller.de/tags/netapp" term="netapp" label="netapp"/></entry><entry><title>Temperatur messen mit Cubietruck und DS18B20 Sensor</title><link href="https://www.krausmueller.de/2016/02/08/ds18b20-mit-cubietruck/" rel="alternate" type="text/html" hreflang="de"/><id>https://www.krausmueller.de/2016/02/08/ds18b20-mit-cubietruck/</id><published>2016-02-08T00:00:00+00:00</published><updated>2016-02-08T00:00:00+00:00</updated><content type="html">
&lt;p>&lt;strong>Hinweis:&lt;/strong> Wenn die generelle Vorgehensweise bekannt ist, der Sensor allerdings nicht zuverlässig funktioniert bitte die &lt;a
class="gblog-markdown__link"
href="#cpufreq"
>Stromsparfunktion&lt;/a> der CPU prüfen.&lt;/p>
&lt;p>Im Vergleich zum Raspberry Pi ist der Cubietruck leider nicht allzu weit verbreitet, weshalb es nur wenige Anleitungen für die Nutzung der GPIO Pins gibt. Ziel des Artikels ist die Temperatur mit einem DS18B20 Sensor zu messen. Als erstes muss man sich natürlich den Sensor besorgen (z.B. bei &lt;a
class="gblog-markdown__link"
href="http://www.amazon.de/gp/aw/s/ref=nb_sb_noss?k=ds18b20"
title="DS18B20 bei Amazon"
>Amazon&lt;/a> oder &lt;a
class="gblog-markdown__link"
href="http://m.ebay.de/sch/i.html?_nkw=ds18b20&amp;amp;isNewKw=1&amp;amp;isRefine=true&amp;amp;mfs=GOCLK&amp;amp;acimp=0&amp;amp;_trksid=p2056088.m2428.l1313.TR2.TRC1.Xds18b20&amp;amp;sqp=ds18b20"
title="DS18B20 bei ebay"
>ebay&lt;/a>). Der Sensor besitzt 3 Leitungen: Masse (GND), 3,3 Volt (VDD) und das Singal (DQ).&lt;/p>
&lt;p>&lt;img
src="/images/ds18b20.png"
alt="DS18B20"
/>&lt;/p>
&lt;p>Zwischen VDD und DQ wird ein 4,7 K Ohm Widerstand geschaltet (siehe auch &lt;a
class="gblog-markdown__link"
href="https://datasheets.maximintegrated.com/en/ds/DS18B20.pdf"
title="DS18B20 Datenblatt"
>Datenblatt&lt;/a>). Zum Testen baut man die Schaltung am besten mit einem Breadboard auf. Ich habe den Sensor und den Widerstand direkt verlötet.&lt;/p>
&lt;p>&lt;img
src="/images/ds18b20_resistor.png"
alt="DS18B20 mit angelöteten Widerstand"
/>&lt;/p>
&lt;p>Der Kernel benötigt die Module gpio_sunxi, w1_therm, w1_sunxi und w1_gpio. Als Betriebssystem kann ich &lt;a
class="gblog-markdown__link"
href="http://www.armbian.com/cubietruck/"
title="armbian für Cubietruck"
>armbian&lt;/a> empfehlen. In der Variante &lt;a
class="gblog-markdown__link"
href="http://mirror.igorpecovnik.com/Armbian_4.5_Cubietruck_Debian_jessie_3.4.109.zip"
title="armbian Legacy Jessie"
>Legacy Jessie&lt;/a> sind die Module schon integriert. Um sie automatisch zu laden kann man sie in die Datei /etc/modules aufnehmen.&lt;/p>
&lt;pre class="shell">
hostname:~# cat /etc/modules
# /etc/modules: kernel modules to load at boot time.
#
# This file contains the names of kernel modules that should be loaded
# at boot time, one per line. Lines beginning with "#" are ignored.
brcmfmac
rfcomm
hidp
bonding
gpio_sunxi
w1_therm
w1_sunxi
w1_gpio
hostname:~#
&lt;/pre>
&lt;p>Danach sucht man sich passende &lt;a
class="gblog-markdown__link"
href="http://docs.cubieboard.org/a20-cubietruck_gpio_pin"
title="GPIO Pins auf Cubietruck"
>GPIO Pins&lt;/a> auf dem Cubietruck aus. Ich habe mich für PB18 für DQ entschieden. Die Leitungen für Masse (GND) und Spannung (VDD) müssen an entsprechende Pins angeschlossen werden (z.B. Pin 1 und 2 auf &lt;a
class="gblog-markdown__link"
href="http://docs.cubieboard.org/a20-cubietruck_gpio_pin"
title="GPIO Pins auf Cubietruck"
>CN8&lt;/a>). Der gewählte DQ Pin muss aktiviert werden. Die Konfiguration läuft über eine bin-Datei. Die genaue Vorgehensweise wird &lt;a
class="gblog-markdown__link"
href="https://abhinavgupta2812.wordpress.com/2013/08/27/configuring-the-gpio-and-uart-on-the-cubieboard/"
title="Configuring the GPIO and UART on the Cubieboard"
>hier&lt;/a> beschrieben. Bei armbian lautet die Datei &lt;em>&lt;strong>/boot/script.bin&lt;/strong>&lt;/em> und ist ein Link auf &lt;em>&lt;strong>/boot/bin/cubietruck.bin&lt;/strong>&lt;/em>. Am besten kopiert man sich die Datei erst mal in sein Home-Verzeichnis und wandelt sie dort in eine editierbare fex-Datei um.&lt;/p>
&lt;pre class="shell">
hostname:~# cp /boot/bin/cubietruck.bin ~
hostname:~# bin2fex cubietruck.bin cubietruck.fex
hostname:~# cp cubietruck.fex cubietruck_own.fex
&lt;/pre>
&lt;p>Die Datei cubietruck_own.fex kann jetzt editiert werden. Es muss der Bereich &lt;em>&lt;strong>[gpio_para]&lt;/strong>&lt;/em> angepasst und der Bereich &lt;em>&lt;strong>[w1_para]&lt;/strong>&lt;/em> hinzugefügt werden. Bei mir sieht das dann so aus:&lt;/p>
&lt;pre class="shell">
[gpio_para]
gpio_used = 1
gpio_num = 4
gpio_pin_1 = port:PH20&lt;1>&lt;default>&lt;default>&lt;1>
gpio_pin_2 = port:PH10&lt;0>&lt;default>&lt;default>&lt;0>
gpio_pin_3 = port:PG08&lt;1>&lt;default>&lt;default>&lt;1>
gpio_pin_4 = port:PB18&lt;0>&lt;default>&lt;default>&lt;0>
[w1_para]
gpio = 4
&lt;/pre>
&lt;p>Es werden 4 GPIO Pins genutzt (gpio_num=4). GPIO Pin 4 wird der Pin PB18 zugewiesen (gpio_pin_4 = &amp;hellip;) und 1-wire auf Pin 4 konfiguriert (gpio=4 im Bereich [w1_para]). Nach dem Editieren der Datei erstellt man daraus wieder die bin-Datei und tauscht die usprüngliche mit der angepassten aus.&lt;/p>
&lt;pre class="shell">
hostname:~# fex2bin cubietruck_own.fex cubietruck.bin
hostname:~# cp cubietruck.bin /boot/bin/cubietruck.bin
&lt;/pre>
&lt;p>Die Änderung wird nach einem Reboot aktiv. Sind die Module geladen, der Sensor richtig verbunden und die GPIO Pins richtig konfiguriert erscheint der Sensor unter /sys/bus/w1/devices/. Für jeden Sensor (es könnten auch mehrere gleichzeitig angeschlossen werden) gibt es dort ein Verzeichnis nach dem Muster 28-XXXXXXXXXXXX. &lt;a name="cpufreq">&lt;/a>Bei mir war der Sensor nur direkt nach dem Booten vorhanden und verschwand nach kurzer Zeit wieder. Die CPU taktet sich je nach Anforderung herunter und ab einem bestimmten Wert funktioniert dann der Sensor nicht &lt;a
class="gblog-markdown__link"
href="http://www.cubieforums.com/index.php/topic,2986.msg20023.html#msg20023"
title="Beitrag aus www.cubieforums.com"
>mehr&lt;/a>. Ich habe den minimalen Wert auf 700 MHz gesetzt.&lt;/p>
&lt;pre class="shell">
hostname:~# sudo cpufreq-set -d 700000
&lt;/pre>
&lt;p>Ist der Sensor unter /sys/bus/w1/devices/ vorhanden, lässt sich die Temperatur leicht auslesen.&lt;/p>
&lt;pre class="shell">
hostname:~# cat /sys/bus/w1/devices/28-000003ca3e36/w1_slave
e7 00 4b 46 7f ff 09 10 94 : crc=94 YES
e7 00 4b 46 7f ff 09 10 94 t=14437
&lt;/pre>
&lt;p>Das &lt;em>&lt;strong>YES&lt;/strong>&lt;/em> in der 1. Zeile besagt, dass die Checksumme stimmt und damit der Temperaturwert gültig ist. Die Temperatur von &lt;em>&lt;strong>14437&lt;/strong>&lt;/em> entspricht 14,437 °C. Der Wert kann also einfach durch 1000 geteilt werden. Mit einem einfache &lt;a href="/downloads/get_temp_ds18b20.sh" target="_blank">Shellscript&lt;/a> (basiert auf Code aus dem &lt;a
class="gblog-markdown__link"
href="http://linux-sunxi.org/1-Wire"
>Wiki der &amp;ldquo;linux-sunxi community&amp;rdquo;&lt;/a>) oder &lt;a href="/downloads/get_temp_ds18b20.py" target="_blank">Python Script&lt;/a> (basiert auf &lt;a
class="gblog-markdown__link"
href="https://bitbucket.org/rvto/my-pi-projects/src/b2090764aa78d701a90fb4c1cc64c0fb8ee6d0ef/ds1820/ds1820.py?at=master&amp;amp;fileviewer=file-view-default"
>my-pi-scripts&lt;/a>) kann der Wert richtig formatiert ausgegeben werden.&lt;/p>
&lt;p>Die Vorgehensweise wird auch auf &lt;a
class="gblog-markdown__link"
href="http://www.cubieforums.com/index.php/topic,2986.msg19674.html?PHPSESSID=9uhmbcukigg6b5mthi1ltrciu2#msg19674"
title="Beitrag bei www.cubieforums.com"
>www.cubieforums.com&lt;/a> erklärt.&lt;/p></content><category scheme="https://www.krausmueller.de/tags/cubietruck" term="cubietruck" label="cubietruck"/></entry><entry><title>NetApp vFiler DR mit Data ONTAP Simulator Teil 6: vFiler erstellen und vFiler DR konfigurieren</title><link href="https://www.krausmueller.de/2016/01/27/netapp-vfiler-dr-teil6/" rel="alternate" type="text/html" hreflang="de"/><id>https://www.krausmueller.de/2016/01/27/netapp-vfiler-dr-teil6/</id><published>2016-01-27T00:00:00+00:00</published><updated>2016-01-27T00:00:00+00:00</updated><content type="html">
&lt;p>&lt;em style="font-size:0.8em;">Dies ist Teil einer &lt;a
class="gblog-markdown__link"
href="https://www.krausmueller.de/2016/01/27/netapp-vfiler-dr-teil6/#serienlinks"
title="Alle Artikel der Serie"
>Artikelserie&lt;/a>.&lt;/em>&lt;/p>
&lt;p>&lt;strong>Hinweis:&lt;/strong> In diesem Artikel wird vFiler DR mit asynchroner Replikation eingerichtet. Wenn synchrone Replikation gewünscht ist, bitte in diesem Teil nur den vFiler erstellen und dann mit &lt;a
class="gblog-markdown__link"
href="/de/netapp-vfiler-dr-teil7"
title="Teil 7: Synchroner vFiler DR"
>Teil 7&lt;/a> fortsetzen. Den Abschnitt &amp;ldquo;vFiler DR konfigurieren&amp;rdquo; aus diesem Artikel überspringen.&lt;/p>
&lt;p>Jetzt wird endlich der eigentliche vFiler auf dem ersten Simulator (netapp01) angelegt. Entweder per OnCommand System Manager&lt;/p>
&lt;video controls="controls" width="754" height="622">
&lt;source src="/videos/netapp03.mp4" type="video/mp4" />
&lt;object type="application/x-shockwave-flash" data="http://releases.flowplayer.org/swf/flowplayer-3.2.1.swf" width="640" height="360">
&lt;param name="movie" value="http://releases.flowplayer.org/swf/flowplayer-3.2.1.swf" />
&lt;param name="allowFullScreen" value="true" />
&lt;param name="wmode" value="transparent" />
&lt;param name="flashVars" value="config={'playlist':[{'url':'%2Fmedia%2Fvideos%2Fnetapp01.mp4','autoPlay':false}]}" />
&lt;/object>
&lt;/video>
&lt;p>oder über SSH.&lt;/p>
&lt;pre class="shell">
netapp01> &lt;b>vfiler create vfiler01 -i 192.168.2.68 /vol/vol_vfiler01&lt;/b>
Tue Jan 17 00:21:06 CET [netapp01:vFiler.etcPath.exists:warning]: Warning: /vol/vol_vfiler01/etc already exists. Old configuration will be deleted.
Tue Jan 17 00:21:06 CET [vfiler01@netapp01:lun.vfiler.oldConfigDeleted:notice]: Warning: Old LUN configuration exists and will be deleted.
Tue Jan 17 00:21:06 CET [vfiler01@netapp01:secureadmin.ssh.setup.passed:info]: SSH setup is done and ssh2 is enabled. Host keys are stored in /vol/vol_vfiler01/etc/sshd/ssh_host_key, /vol/vol_vfiler01/etc/sshd/ssh_host_rsa_key, and /vol/vol_vfiler01/etc/sshd/ssh_host_dsa_key.
Tue Jan 17 00:21:06 CET [netapp01:httpd.config.mime.missing:warning]: /etc/httpd.mimetypes.sample file is missing.
Tue Jan 17 00:21:06 CET [vfiler01@netapp01:httpd.config.mime.missing:warning]: /etc/httpd.mimetypes file is missing.
Tue Jan 17 00:21:06 CET [vfiler01@netapp01:httpd.config.mime.missing:warning]: /etc/httpd.mimetypes.sample file is missing.
Tue Jan 17 00:21:06 CET [vfiler01@netapp01:useradmin.added.deleted:info]: The role 'compliance' has been added.
Tue Jan 17 00:21:07 CET [vfiler01@netapp01:export.file.missing:warning]: Could not open '/etc/exports' for reading.
The etc configuration directory for vfiler "vfiler01" is /vol/vol_vfiler01/etc.
Setting up vfiler vfiler01
Tue Jan 17 00:21:07 CET [vfiler01@netapp01:cmds.vfiler.info:notice]: vFiler unit vfiler01 initialized.
Configure vfiler IP address 192.168.2.68? [y]: &lt;b>y&lt;/b>
Interface to assign this address to {e0a, e0b, e0c, e0d}: &lt;b>e0a&lt;/b>
Netmask to use: [255.255.255.0]: &lt;b>255.255.255.0&lt;/b>
The administration host is given root access to the filer's
/etc files for system administration. To allow /etc root access
to all NFS clients enter RETURN below.
Please enter the name or IP address of the administration host:
Do you want to run DNS resolver? [n]: &lt;b>y&lt;/b>
Please enter DNS domain name []: &lt;b>test.local&lt;/b>
You may enter up to 3 nameservers
Please enter the IP address for first nameserver []: &lt;b>192.168.2.50&lt;/b>
Do you want another nameserver? [n]: &lt;b>n&lt;/b>
Do you want to run NIS client? [n]: &lt;b>n&lt;/b>
e0a: flags=0xe48867&lt;UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.2.66 netmask 0xffffff00 broadcast 192.168.2.255
ether 00:0c:29:ee:ee:f2 (auto-1000t-fd-up) flowcontrol full
Default password for root on vfiler vfiler01 is "".
New password:Tue Jan 17 00:21:51 CET [vfiler01@netapp01:useradmin.added.deleted:info]: The user 'root' has been added.
Retype new password:
Tue Jan 17 00:22:05 CET [vfiler01@netapp01:passwd.changed:info]: passwd for user 'root' changed.
Do you want to setup CIFS? [y]: &lt;b>y&lt;/b>
This process will enable CIFS access to the filer from a Windows(R) system.
Use "?" for help at any prompt and Ctrl-C to exit without committing changes.
Your filer does not have WINS configured and is visible only to
clients on the same subnet.
Do you want to make the system visible via WINS? [n]: &lt;b>n&lt;/b>
A filer can be configured for multiprotocol access, or as an NTFS-only
filer. Since multiple protocols are currently licensed on this filer,
we recommend that you configure this filer as a multiprotocol filer
(1) Multiprotocol filer
(2) NTFS-only filer
Selection (1-2)? [1]: &lt;b>1&lt;/b>
CIFS requires local /etc/passwd and /etc/group files and default files
will be created. The default passwd file contains entries for 'root',
'pcuser', and 'nobody'.
The default name for this CIFS server is 'VFILER01'.
Would you like to change this name? [n]: &lt;b>n&lt;/b>
Data ONTAP CIFS services support four styles of user authentication.
Choose the one from the list below that best suits your situation.
(1) Active Directory domain authentication (Active Directory domains only)
(2) Windows NT 4 domain authentication (Windows NT or Active Directory domains)
(3) Windows Workgroup authentication using the filer's local user accounts
(4) /etc/passwd and/or NIS/LDAP authentication
Selection (1-4)? [1]: &lt;b>3&lt;/b>
What is the name of the Workgroup? [WORKGROUP]: WORKGROUP
CIFS - Starting SMB protocol...
It is recommended that you create the local administrator account
(VFILER01\administrator) for this filer.
Do you want to create the VFILER01\administrator account? [y]: &lt;b>y&lt;/b>
Enter the new password for VFILER01\administrator:
Retype the password:
Welcome to the WORKGROUP Windows(R) workgroup
netapp01> Tue Jan 17 00:23:23 CET [vfiler01@netapp01:cifs.startup.local.succeeded:info]: CIFS: CIFS local server is running.
&lt;/pre>
&lt;div class="gblog-post__anchorwrap flex align-center">
&lt;h2 id="vfiler-dr-konfigurieren">
vFiler DR konfigurieren
&lt;/h2>
&lt;a data-clipboard-text="https://www.krausmueller.de/2016/01/27/netapp-vfiler-dr-teil6/#vfiler-dr-konfigurieren" class="gblog-post__anchor gblog-post__anchor--right clip" aria-label="Anchor vFiler DR konfigurieren" href="#vfiler-dr-konfigurieren">
&lt;svg class="gblog-icon gblog_link">&lt;use xlink:href="#gblog_link">&lt;/use>&lt;/svg>
&lt;/a>
&lt;/div>
&lt;p>vFiler DR wird auf dem zweiten Simulator per SSH eingerichtet.&lt;/p>
&lt;pre class="shell">
netapp02> &lt;b>vfiler dr configure vfiler01@192.168.2.66&lt;/b>
192.168.2.66's Administrative login: &lt;b>root&lt;/b>
192.168.2.66's Administrative password:
Configuring SnapMirror to mirror vfiler vfiler01's storage units from remote filer 192.168.2.66.
Upon Activation, configure vfiler IP address 192.168.2.68? [y]: &lt;b>y&lt;/b>
Interface to assign this address to {e0a, e0b, e0c, e0d}: &lt;b>e0a&lt;/b>
Netmask to use: [255.255.255.0]: &lt;b>255.255.255.0&lt;/b>
Starting snapmirror initialize commands. It
could take a very long time when the source or
destination filers are involved in many
simultaneous transfers. The console will not be
available until all initialize commands are
started successfully. Please use the
"snapmirror status" command on the source
filer to monitor the progress.
Volume 'vol_vfiler01' is now restricted.
Upon activation, do you want the DR vfiler to use a different
set of DNS servers from the production vfiler? [n]: &lt;b>n&lt;/b>
SnapMirror transfer initiated for vfiler storage units.
netapp02> Tue Jan 17 21:14:02 CET [netapp02:cmds.vfiler.dr.configure:info]: vFiler unit 'vfiler01' is now disaster recovery backup of remote vFiler unit present at storage system '192.168.2.66'.
Tue Jan 17 21:14:02 CET [netapp02:vFiler.storageUnit.On:notice]: vFiler vfiler01: storage unit /vol/vol_vfiler01 now online.
Tue Jan 17 21:14:02 CET [netapp02:vFiler.etcStorage.readOnly:warning]: vFiler vfiler01: vFiler cannot be started because the volume containing its root, volume vol_vfiler01, is read-only.
&lt;/pre>
&lt;p>Dabei handelt es sich um einen asynchronen SnapMirror. Das bedeutet die Daten werden auf den ersten Simulator geschrieben und landen mit einem leichten zeitlichen Versatz auf dem zweiten Simulator. Standardmäßig findet die Replizierung alle 3 Minuten statt. Mit einem &lt;em>&lt;strong>snapmirror status&lt;/strong>&lt;/em> kann man sich den aktuellen Zustand anzeigen lassen. Dabei sieht man das die Zeit in der Spalte &amp;ldquo;Lag&amp;rdquo; bis zu 3 Minuten beträgt und danach die Replizierung startet.&lt;/p>
&lt;pre class="shell">
netapp02> &lt;b>snapmirror status&lt;/b>
Snapmirror is on.
Source Destination State Lag Status
192.168.2.66:vol_vfiler01 netapp02:vol_vfiler01 Snapmirrored 00:02:52 Idle
netapp02> &lt;b>snapmirror status&lt;/b>
Snapmirror is on.
Source Destination State Lag Status
192.168.2.66:vol_vfiler01 netapp02:vol_vfiler01 Snapmirrored 00:03:01 Transferring
netapp02> &lt;b>snapmirror status&lt;/b>
Snapmirror is on.
Source Destination State Lag Status
192.168.2.66:vol_vfiler01 netapp02:vol_vfiler01 Snapmirrored 00:03:02 Transferring (84 KB done)
netapp02> &lt;b>snapmirror status&lt;/b>
Snapmirror is on.
Source Destination State Lag Status
192.168.2.66:vol_vfiler01 netapp02:vol_vfiler01 Snapmirrored 00:00:07 Idle
&lt;/pre>
&lt;p>&lt;a name="serienlinks">&lt;/a>
Alle Artikel der Serie:&lt;br>
&lt;a
class="gblog-markdown__link"
href="/de/netapp-vfiler-dr-teil1"
title="Teil 1: Download der benötigten Komponenten"
>Teil 1: Download der benötigten Komponenten&lt;/a>&lt;br>
&lt;a
class="gblog-markdown__link"
href="/de/netapp-vfiler-dr-teil2"
title="Teil 2: Einrichtung des 1. Simulators"
>Teil 2: Einrichtung des 1. Simulators&lt;/a>&lt;br>
&lt;a
class="gblog-markdown__link"
href="/de/netapp-vfiler-dr-teil3"
title="Teil 3: Einrichtung des 2. Simulators"
>Teil 3: Einrichtung des 2. Simulators&lt;/a>&lt;br>
&lt;a
class="gblog-markdown__link"
href="/de/netapp-vfiler-dr-teil4"
title="Teil 4: Erstellen eines Aggregats und Volumes"
>Teil 4: Erstellen eines Aggregats und Volumes&lt;/a>&lt;br>
&lt;a
class="gblog-markdown__link"
href="/de/netapp-vfiler-dr-teil5"
title="Teil 5: DNS Konfiguration"
>Teil 5: DNS Konfiguration&lt;/a>&lt;br>
&lt;a
class="gblog-markdown__link"
href="/de/netapp-vfiler-dr-teil6"
title="Teil 6: vFiler erstellen und vFiler DR konfigurieren"
>Teil 6: vFiler erstellen und vFiler DR konfigurieren&lt;/a>&lt;br>
&lt;a
class="gblog-markdown__link"
href="/de/netapp-vfiler-dr-teil7"
title="Teil 7: Synchroner vFiler DR"
>Teil 7: Synchroner vFiler DR&lt;/a>&lt;br>
&lt;a
class="gblog-markdown__link"
href="/de/netapp-vfiler-dr-teil8"
title="Teil 8: Freigaben auf vFiler erstellen"
>Teil 8: Freigaben auf vFiler erstellen&lt;/a>&lt;br>
&lt;a
class="gblog-markdown__link"
href="/de/netapp-vfiler-dr-teil9"
title="Teil 9: Geplanter Failover"
>Teil 9: Geplanter Failover&lt;/a>&lt;br>
&lt;a
class="gblog-markdown__link"
href="/de/netapp-vfiler-dr-teil10"
title="Teil 10: Disaster Failover"
>Teil 10: Disaster Failover&lt;/a>&lt;/p></content><category scheme="https://www.krausmueller.de/tags/netapp" term="netapp" label="netapp"/></entry><entry><title>NetApp vFiler DR mit Data ONTAP Simulator Teil 5: DNS Konfiguration</title><link href="https://www.krausmueller.de/2016/01/26/netapp-vfiler-dr-teil5/" rel="alternate" type="text/html" hreflang="de"/><id>https://www.krausmueller.de/2016/01/26/netapp-vfiler-dr-teil5/</id><published>2016-01-26T00:00:00+00:00</published><updated>2016-01-26T00:00:00+00:00</updated><content type="html">
&lt;p>&lt;em style="font-size:0.8em;">Dies ist Teil einer &lt;a
class="gblog-markdown__link"
href="https://www.krausmueller.de/2016/01/26/netapp-vfiler-dr-teil5/#serienlinks"
title="Alle Artikel der Serie"
>Artikelserie&lt;/a>.&lt;/em>&lt;/p>
&lt;p>&lt;strong>Hinweis:&lt;/strong> Falls bereits beim Einrichten der VMs (&lt;a
class="gblog-markdown__link"
href="/de/netapp-vfiler-dr-teil2"
title="Teil 2: Einrichtung des 1. Simulators"
>Teil 2&lt;/a> und &lt;a
class="gblog-markdown__link"
href="/de/netapp-vfiler-dr-teil3"
title="Teil 3: Einrichtung des 2. Simulators"
>3&lt;/a>) DNS konfiguriert wurde (&amp;ldquo;DNS resolver&amp;rdquo;), kann direkt die Namensauflösung per &lt;a
class="gblog-markdown__link"
href="https://www.krausmueller.de/2016/01/26/netapp-vfiler-dr-teil5/#ping"
title="Test der Konfiguration mit ping"
>ping&lt;/a> geprüft werden.&lt;/p>
&lt;p>Für den weiteren Verlauf ist es sinnvoll, dass DNS auf beiden NetApp VMs richtig konfiguriert ist. Sie sollen sich also mindestens gegenseitig auflösen können. Soll im späteren Verlauf ein synchroner vFiler DR genutzt werden, sind die richtigen DNS Einstellungen sogar zwingend notwendig. Bei falscher bzw. fehlender DNS Konfiguration erhielt ich z.B. &lt;em>&amp;ldquo;SnapMirror is unable to setup a multipath connection to vol_vfiler, resorting to the standard single TCP connection.&amp;rdquo;&lt;/em> und &lt;em>&amp;ldquo;SnapMirror: destination transfer from 192.168.2.66_vfiler_con:vol_vfiler1 to vol_vfiler1 : Error in snapmirror sync mode negotiation.&amp;rdquo;&lt;/em> als Fehlermeldungen.&lt;/p>
&lt;p>Es stehen 2 Varianten zur Auswahl: &lt;a
class="gblog-markdown__link"
href="https://www.krausmueller.de/2016/01/26/netapp-vfiler-dr-teil5/#dns"
title="Konfiguration mit DNS Server"
>&amp;ldquo;Konfiguration mit DNS Server&amp;rdquo;&lt;/a> und &lt;a
class="gblog-markdown__link"
href="https://www.krausmueller.de/2016/01/26/netapp-vfiler-dr-teil5/#hosts"
title="Konfiguration über /etc/hosts"
>&amp;ldquo;Konfiguration über /etc/hosts&amp;rdquo;&lt;/a>. Die Konfiguration muss auf beiden Simulatoren analog erfolgen.&lt;/p>
&lt;p>&lt;a name="dns">&lt;/a>&lt;/p>
&lt;div class="gblog-post__anchorwrap flex align-center">
&lt;h3 id="konfiguration-mit-dns-server">
Konfiguration mit DNS Server:
&lt;/h3>
&lt;a data-clipboard-text="https://www.krausmueller.de/2016/01/26/netapp-vfiler-dr-teil5/#konfiguration-mit-dns-server" class="gblog-post__anchor gblog-post__anchor--right clip" aria-label="Anchor Konfiguration mit DNS Server:" href="#konfiguration-mit-dns-server">
&lt;svg class="gblog-icon gblog_link">&lt;use xlink:href="#gblog_link">&lt;/use>&lt;/svg>
&lt;/a>
&lt;/div>
&lt;p>Wenn ein DNS Server im Netzwerk vorhanden ist und dort Einträge für die beiden Simulatoren hinterlegt sind, reicht es aus diesen DNS Server auf beiden VMs zu konfigurieren. Dafür kann der OnCommand System Manager genutzt werden (Configuration =&amp;gt; Network =&amp;gt; DNS).&lt;/p>
&lt;p>&lt;img
src="/images/dns_ocsm.png"
alt="DNS Server über OnCommand System Manager"
/>&lt;/p>
&lt;p>Sollte der OnCommand System Manager nicht zur Verfügung stehen kann die Änderung auch per SSH mit &lt;a
class="gblog-markdown__link"
href="hhttps://kb.netapp.com/support/s/article/ka31A0000000mKeQAI/how-to-add-lines-to-a-configuration-file-on-the-storage-system-using-wrfile-the-command-wrfile-does-not-have-an-option-to-exit-without-saving?language=en_US"
title="How to add lines to a configuration file on the storage system using wrfile"
>rdfile und wrfile&lt;/a> vorgenommen werden:&lt;/p>
&lt;pre class="shell">
netapp01> &lt;b>rdfile /etc/resolv.conf&lt;/b>
netapp01> &lt;b>wrfile /etc/resolv.conf&lt;/b>
nameserver 192.168.2.50
search test.local
read: error reading standard input: Interrupted system call
netapp01> &lt;b>options dns.domainname test.local&lt;/b>
netapp01> &lt;b>options dns.enable on&lt;/b>
&lt;/pre>
&lt;p>Mit &lt;em>&lt;strong>rdfile /etc/resolv.conf&lt;/strong>&lt;/em> wird der Inhalt der Datei /etc/resolv.conf ausgegeben. Die Datei kann über SSH leider nicht direkt editiert werden, sondern muss komplett neu geschrieben werden. Man muss also, falls vorhanden, den vorherigen Inhalt kopieren und die Datei mit &lt;em>&lt;strong>wrfile /etc/resolv.conf&lt;/strong>&lt;/em> neu schreiben. Nach dem Einfügen des bisherigen Inhalts aus der Zwischenablage wird die zusätzliche Zeile (Eintrag besteht aus &lt;em>&lt;strong>nameserver&lt;/strong>&lt;/em> und der IP des DNS Servers) eingegeben und das Editieren der Datei mit Ctrl+C beendet. Danach kann der Inhalt mit &lt;em>&lt;strong>rdfile /etc/resolv.conf&lt;/strong>&lt;/em> kontrolliert werden (vgl. Video &lt;a
class="gblog-markdown__link"
href="https://www.krausmueller.de/2016/01/26/netapp-vfiler-dr-teil5/#hosts"
title="Konfiguration über /etc/hosts"
>unten&lt;/a>).&lt;/p>
&lt;p>&lt;a name="hosts">&lt;/a>&lt;/p>
&lt;div class="gblog-post__anchorwrap flex align-center">
&lt;h3 id="konfiguration-über-etchosts">
Konfiguration über /etc/hosts
&lt;/h3>
&lt;a data-clipboard-text="https://www.krausmueller.de/2016/01/26/netapp-vfiler-dr-teil5/#konfiguration-über-etchosts" class="gblog-post__anchor gblog-post__anchor--right clip" aria-label="Anchor Konfiguration über /etc/hosts" href="#konfiguration-%c3%bcber-etchosts">
&lt;svg class="gblog-icon gblog_link">&lt;use xlink:href="#gblog_link">&lt;/use>&lt;/svg>
&lt;/a>
&lt;/div>
&lt;p>Ist kein DNS Server vorhanden, oder sollen die beiden VMs unabhängig von einem DNS Server sein, können die IP-Adressen und zugehörigen Hostnamen auch in der Datei /etc/hosts eingetragen werden. Der Eintrag muss wieder auf beiden Simulatoren erfolgen. Dazu kann wieder der OnCommand System Manager genutzt werden (Configuration =&amp;gt; Network =&amp;gt; Network Files).&lt;/p>
&lt;p>&lt;img
src="/images/hosts_ocsm.png"
alt="/etc/hosts über OnCommand System Manager"
/>&lt;/p>
&lt;p>Das Editieren der Datei ist natürlich auch wieder per SSH möglich:&lt;/p>
&lt;pre class="shell">
netapp01> &lt;b>rdfile /etc/hosts&lt;/b>
127.0.0.1 localhost localhost-stack
127.0.10.1 localhost-10 localhost-bsd
127.0.20.1 localhost-20 localhost-sk
192.168.2.66 netapp01 netapp01-e0a
# 0.0.0.0 netapp01-e0b
# 0.0.0.0 netapp01-e0c
# 0.0.0.0 netapp01-e0d
netapp01> &lt;b>wrfile /etc/hosts&lt;/b>
127.0.0.1 localhost localhost-stack
127.0.10.1 localhost-10 localhost-bsd
127.0.20.1 localhost-20 localhost-sk
192.168.2.66 netapp01 netapp01-e0a
# 0.0.0.0 netapp01-e0b
# 0.0.0.0 netapp01-e0c
# 0.0.0.0 netapp01-e0d
192.168.2.67 netapp02
read: error reading standard input: Interrupted system call
netapp01> &lt;b>rdfile /etc/hosts&lt;/b>
127.0.0.1 localhost localhost-stack
127.0.10.1 localhost-10 localhost-bsd
127.0.20.1 localhost-20 localhost-sk
192.168.2.66 netapp01 netapp01-e0a
# 0.0.0.0 netapp01-e0b
# 0.0.0.0 netapp01-e0c
# 0.0.0.0 netapp01-e0d
192.168.2.67 netapp02
&lt;/pre>
&lt;p>Mit &lt;em>&lt;strong>rdfile /etc/hosts&lt;/strong>&lt;/em> wird der Inhalt der Datei /etc/hosts ausgegeben, der Inhalt in die Zwischaenablage kopiert und mit &lt;em>&lt;strong>wrfile /etc/hosts&lt;/strong>&lt;/em> neu geschrieben. Nach dem Einfügen des bisherigen Inhalts aus der Zwischenablage wird die zusätzliche Zeile (Eintrag besteht aus IP und Hostname des anderen Simulators) eingegeben und das Editieren der Datei mit Ctrl+C beendet. Danach kann der Inhalt mit &lt;em>&lt;strong>rdfile /etc/hosts&lt;/strong>&lt;/em> kontrolliert werden. Ein kurzes Video verdeutlicht die Vorgehensweise am Beispiel des 2. Simulators (netapp02).&lt;/p>
&lt;video controls="controls" width="672" height="324">
&lt;source src="/videos/netapp04.mp4" type="video/mp4" />
&lt;object type="application/x-shockwave-flash" data="http://releases.flowplayer.org/swf/flowplayer-3.2.1.swf" width="640" height="360">
&lt;param name="movie" value="http://releases.flowplayer.org/swf/flowplayer-3.2.1.swf" />
&lt;param name="allowFullScreen" value="true" />
&lt;param name="wmode" value="transparent" />
&lt;param name="flashVars" value="config={'playlist':[{'url':'%2Fmedia%2Fvideos%2Fnetapp01.mp4','autoPlay':false}]}" />
&lt;/object>
&lt;/video>
&lt;p>&lt;a name="ping">&lt;/a>&lt;/p>
&lt;div class="gblog-post__anchorwrap flex align-center">
&lt;h3 id="test-der-konfiguration-mit-ping">
Test der Konfiguration mit ping
&lt;/h3>
&lt;a data-clipboard-text="https://www.krausmueller.de/2016/01/26/netapp-vfiler-dr-teil5/#test-der-konfiguration-mit-ping" class="gblog-post__anchor gblog-post__anchor--right clip" aria-label="Anchor Test der Konfiguration mit ping" href="#test-der-konfiguration-mit-ping">
&lt;svg class="gblog-icon gblog_link">&lt;use xlink:href="#gblog_link">&lt;/use>&lt;/svg>
&lt;/a>
&lt;/div>
&lt;p>Die Konfiguration kann mit einem ping von beiden Systemen kontrolliert werden:&lt;/p>
&lt;pre class="shell">
netapp01> &lt;b>ping netapp02&lt;/b>
netapp02 is alive
&lt;/pre>
&lt;pre class="shell">
netapp02> &lt;b>ping netapp01&lt;/b>
netapp01 is alive
&lt;/pre>
&lt;p>&lt;a name="serienlinks">&lt;/a>
Alle Artikel der Serie:&lt;br>
&lt;a
class="gblog-markdown__link"
href="/de/netapp-vfiler-dr-teil1"
title="Teil 1: Download der benötigten Komponenten"
>Teil 1: Download der benötigten Komponenten&lt;/a>&lt;br>
&lt;a
class="gblog-markdown__link"
href="/de/netapp-vfiler-dr-teil2"
title="Teil 2: Einrichtung des 1. Simulators"
>Teil 2: Einrichtung des 1. Simulators&lt;/a>&lt;br>
&lt;a
class="gblog-markdown__link"
href="/de/netapp-vfiler-dr-teil3"
title="Teil 3: Einrichtung des 2. Simulators"
>Teil 3: Einrichtung des 2. Simulators&lt;/a>&lt;br>
&lt;a
class="gblog-markdown__link"
href="/de/netapp-vfiler-dr-teil4"
title="Teil 4: Erstellen eines Aggregats und Volumes"
>Teil 4: Erstellen eines Aggregats und Volumes&lt;/a>&lt;br>
&lt;a
class="gblog-markdown__link"
href="/de/netapp-vfiler-dr-teil5"
title="Teil 5: DNS Konfiguration"
>Teil 5: DNS Konfiguration&lt;/a>&lt;br>
&lt;a
class="gblog-markdown__link"
href="/de/netapp-vfiler-dr-teil6"
title="Teil 6: vFiler erstellen und vFiler DR konfigurieren"
>Teil 6: vFiler erstellen und vFiler DR konfigurieren&lt;/a>&lt;br>
&lt;a
class="gblog-markdown__link"
href="/de/netapp-vfiler-dr-teil7"
title="Teil 7: Synchroner vFiler DR"
>Teil 7: Synchroner vFiler DR&lt;/a>&lt;br>
&lt;a
class="gblog-markdown__link"
href="/de/netapp-vfiler-dr-teil8"
title="Teil 8: Freigaben auf vFiler erstellen"
>Teil 8: Freigaben auf vFiler erstellen&lt;/a>&lt;br>
&lt;a
class="gblog-markdown__link"
href="/de/netapp-vfiler-dr-teil9"
title="Teil 9: Geplanter Failover"
>Teil 9: Geplanter Failover&lt;/a>&lt;br>
&lt;a
class="gblog-markdown__link"
href="/de/netapp-vfiler-dr-teil10"
title="Teil 10: Disaster Failover"
>Teil 10: Disaster Failover&lt;/a>&lt;/p></content><category scheme="https://www.krausmueller.de/tags/netapp" term="netapp" label="netapp"/></entry><entry><title>NetApp vFiler DR mit Data ONTAP Simulator Teil 4: Erstellen eines Aggregats und Volumes</title><link href="https://www.krausmueller.de/2016/01/21/netapp-vfiler-dr-teil4/" rel="alternate" type="text/html" hreflang="de"/><id>https://www.krausmueller.de/2016/01/21/netapp-vfiler-dr-teil4/</id><published>2016-01-21T00:00:00+00:00</published><updated>2016-01-21T00:00:00+00:00</updated><content type="html">
&lt;p>&lt;em style="font-size:0.8em;">Dies ist Teil einer &lt;a
class="gblog-markdown__link"
href="https://www.krausmueller.de/2016/01/21/netapp-vfiler-dr-teil4/#serienlinks"
title="Alle Artikel der Serie"
>Artikelserie&lt;/a>.&lt;/em>&lt;/p>
&lt;p>In diesem Teil wird auf beiden Data ONTAP Simulatoren jeweils ein neues Aggregat (aggr1) und darin ein Volume (vol_vfiler01) für den vFiler angelegt. Dem Aggregat werden 14 Festplatten zugeordnet und das Volume wird mit einer Größe von 10 GB (minimale Größe für synchrone SnapMirror Beziehungen) angelegt. Auf dem ersten Simulator (netapp01) habe ich den OnCommand System Manager genutzt.&lt;/p>
&lt;video controls="controls" width="754" height="622">
&lt;source src="/videos/netapp02.mp4" type="video/mp4" />
&lt;object type="application/x-shockwave-flash" data="http://releases.flowplayer.org/swf/flowplayer-3.2.1.swf" width="640" height="360">
&lt;param name="movie" value="http://releases.flowplayer.org/swf/flowplayer-3.2.1.swf" />
&lt;param name="allowFullScreen" value="true" />
&lt;param name="wmode" value="transparent" />
&lt;param name="flashVars" value="config={'playlist':[{'url':'%2Fmedia%2Fvideos%2Fnetapp01.mp4','autoPlay':false}]}" />
&lt;/object>
&lt;/video>
&lt;p>Auf dem zweiten Simulator (netapp02) habe ich die Schritte per SSH durchgeführt.&lt;/p>
&lt;pre class="shell">
netapp02> &lt;b>aggr create aggr1 -t raid_dp 14&lt;/b>
Mon Jan 16 21:50:53 CET [netapp02:raid.vol.disk.add.done:notice]: Addition of Disk /aggr1/plex0/rg0/v4.25 Shelf ? Bay ? [NETAPP VD-1000MB-FZ-520 0042] S/N [07762208] to aggregate aggr1 has completed successfully
Mon Jan 16 21:50:53 CET [netapp02:raid.vol.disk.add.done:notice]: Addition of Disk /aggr1/plex0/rg0/v5.24 Shelf ? Bay ? [NETAPP VD-1000MB-FZ-520 0042] S/N [07152307] to aggregate aggr1 has completed successfully
Mon Jan 16 21:50:53 CET [netapp02:raid.vol.disk.add.done:notice]: Addition of Disk /aggr1/plex0/rg0/v4.24 Shelf ? Bay ? [NETAPP VD-1000MB-FZ-520 0042] S/N [07762207] to aggregate aggr1 has completed successfully
Mon Jan 16 21:50:53 CET [netapp02:raid.vol.disk.add.done:notice]: Addition of Disk /aggr1/plex0/rg0/v5.22 Shelf ? Bay ? [NETAPP VD-1000MB-FZ-520 0042] S/N [07152306] to aggregate aggr1 has completed successfully
Mon Jan 16 21:50:53 CET [netapp02:raid.vol.disk.add.done:notice]: Addition of Disk /aggr1/plex0/rg0/v4.22 Shelf ? Bay ? [NETAPP VD-1000MB-FZ-520 0042] S/N [07762206] to aggregate aggr1 has completed successfully
Mon Jan 16 21:50:53 CET [netapp02:raid.vol.disk.add.done:notice]: Addition of Disk /aggr1/plex0/rg0/v5.21 Shelf ? Bay ? [NETAPP VD-1000MB-FZ-520 0042] S/N [07152305] to aggregate aggr1 has completed successfully
Mon Jan 16 21:50:53 CET [netapp02:raid.vol.disk.add.done:notice]: Addition of Disk /aggr1/plex0/rg0/v4.21 Shelf ? Bay ? [NETAPP VD-1000MB-FZ-520 0042] S/N [07762205] to aggregate aggr1 has completed successfully
Mon Jan 16 21:50:53 CET [netapp02:raid.vol.disk.add.done:notice]: Addition of Disk /aggr1/plex0/rg0/v5.20 Shelf ? Bay ? [NETAPP VD-1000MB-FZ-520 0042] S/N [07152304] to aggregate aggr1 has completed successfully
Mon Jan 16 21:50:53 CET [netapp02:raid.vol.disk.add.done:notice]: Addition of Disk /aggr1/plex0/rg0/v4.20 Shelf ? Bay ? [NETAPP VD-1000MB-FZ-520 0042] S/N [07762204] to aggregate aggr1 has completed successfully
Mon Jan 16 21:50:53 CET [netapp02:raid.vol.disk.add.done:notice]: Addition of Disk /aggr1/plex0/rg0/v5.19 Shelf ? Bay ? [NETAPP VD-1000MB-FZ-520 0042] S/N [07152303] to aggregate aggr1 has completed successfully
Mon Jan 16 21:50:53 CET [netapp02:raid.vol.disk.add.done:notice]: Addition of Disk /aggr1/plex0/rg0/v4.19 Shelf ? Bay ? [NETAPP VD-1000MB-FZ-520 0042] S/N [07762203] to aggregate aggr1 has completed successfully
Mon Jan 16 21:50:53 CET [netapp02:raid.vol.disk.add.done:notice]: Addition of Disk /aggr1/plex0/rg0/v5.18 Shelf ? Bay ? [NETAPP VD-1000MB-FZ-520 0042] S/N [07152302] to aggregate aggr1 has completed successfully
Mon Jan 16 21:50:53 CET [netapp02:raid.vol.disk.add.done:notice]: Addition of Disk /aggr1/plex0/rg0/v4.18 Shelf ? Bay ? [NETAPP VD-1000MB-FZ-520 0042] S/N [07762202] to aggregate aggr1 has completed successfully
Mon Jan 16 21:50:53 CET [netapp02:raid.vol.disk.add.done:notice]: Addition of Disk /aggr1/plex0/rg0/v5.17 Shelf ? Bay ? [NETAPP VD-1000MB-FZ-520 0042] S/N [07152301] to aggregate aggr1 has completed successfully
Creation of an aggregate with 14 disks has completed.
Mon Jan 16 21:50:57 CET [netapp02:wafl.aggr.btiddb.build:info]: Buftreeid database for aggregate 'aggr1' UUID 'bc9d185d-55e8-4bd2-b537-5123f859ff87' was built in 0 msec, after scanning 0 inodes and restarting -1 times with a final result of starting.
Mon Jan 16 21:50:57 CET [netapp02:wafl.aggr.btiddb.build:info]: Buftreeid database for aggregate 'aggr1' UUID 'bc9d185d-55e8-4bd2-b537-5123f859ff87' was built in 25 msec, after scanning 0 inodes and restarting 0 times with a final result of success.
Mon Jan 16 21:50:57 CET [netapp02:wafl.vol.add:info]: Aggregate aggr1 has been added to the system.
&lt;/pre>
&lt;pre class="shell">
netapp02> &lt;b>vol create vol_vfiler01 aggr1 10G&lt;/b>
Creation of volume 'vol_vfiler01' with size 10g on containing aggregate 'aggr1' has completed.
&lt;/pre>
&lt;p>&lt;a name="serienlinks">&lt;/a>
Alle Artikel der Serie:&lt;br>
&lt;a
class="gblog-markdown__link"
href="/de/netapp-vfiler-dr-teil1"
title="Teil 1: Download der benötigten Komponenten"
>Teil 1: Download der benötigten Komponenten&lt;/a>&lt;br>
&lt;a
class="gblog-markdown__link"
href="/de/netapp-vfiler-dr-teil2"
title="Teil 2: Einrichtung des 1. Simulators"
>Teil 2: Einrichtung des 1. Simulators&lt;/a>&lt;br>
&lt;a
class="gblog-markdown__link"
href="/de/netapp-vfiler-dr-teil3"
title="Teil 3: Einrichtung des 2. Simulators"
>Teil 3: Einrichtung des 2. Simulators&lt;/a>&lt;br>
&lt;a
class="gblog-markdown__link"
href="/de/netapp-vfiler-dr-teil4"
title="Teil 4: Erstellen eines Aggregats und Volumes"
>Teil 4: Erstellen eines Aggregats und Volumes&lt;/a>&lt;br>
&lt;a
class="gblog-markdown__link"
href="/de/netapp-vfiler-dr-teil5"
title="Teil 5: DNS Konfiguration"
>Teil 5: DNS Konfiguration&lt;/a>&lt;br>
&lt;a
class="gblog-markdown__link"
href="/de/netapp-vfiler-dr-teil6"
title="Teil 6: vFiler erstellen und vFiler DR konfigurieren"
>Teil 6: vFiler erstellen und vFiler DR konfigurieren&lt;/a>&lt;br>
&lt;a
class="gblog-markdown__link"
href="/de/netapp-vfiler-dr-teil7"
title="Teil 7: Synchroner vFiler DR"
>Teil 7: Synchroner vFiler DR&lt;/a>&lt;br>
&lt;a
class="gblog-markdown__link"
href="/de/netapp-vfiler-dr-teil8"
title="Teil 8: Freigaben auf vFiler erstellen"
>Teil 8: Freigaben auf vFiler erstellen&lt;/a>&lt;br>
&lt;a
class="gblog-markdown__link"
href="/de/netapp-vfiler-dr-teil9"
title="Teil 9: Geplanter Failover"
>Teil 9: Geplanter Failover&lt;/a>&lt;br>
&lt;a
class="gblog-markdown__link"
href="/de/netapp-vfiler-dr-teil10"
title="Teil 10: Disaster Failover"
>Teil 10: Disaster Failover&lt;/a>&lt;/p></content><category scheme="https://www.krausmueller.de/tags/netapp" term="netapp" label="netapp"/></entry><entry><title>PowerShell Parameter auf gültige Werte prüfen</title><link href="https://www.krausmueller.de/2016/01/18/powershell-parameter-pruefen/" rel="alternate" type="text/html" hreflang="de"/><id>https://www.krausmueller.de/2016/01/18/powershell-parameter-pruefen/</id><published>2016-01-18T00:00:00+00:00</published><updated>2016-01-18T00:00:00+00:00</updated><content type="html">
&lt;p>Bei der Übergabe von Parametern möchte man diese evtl. auf gültige Werte einschränken. Natürlich kann diese Überprüfung selbst mit if-Anweisungen erledigt werden. Gültige Werte können aber auch schon bei der Definition der Parameter vorgegeben werden.&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;span class="lnt">11
&lt;/span>&lt;span class="lnt">12
&lt;/span>&lt;span class="lnt">13
&lt;/span>&lt;span class="lnt">14
&lt;/span>&lt;span class="lnt">15
&lt;/span>&lt;span class="lnt">16
&lt;/span>&lt;span class="lnt">17
&lt;/span>&lt;span class="lnt">18
&lt;/span>&lt;span class="lnt">19
&lt;/span>&lt;span class="lnt">20
&lt;/span>&lt;span class="lnt">21
&lt;/span>&lt;span class="lnt">22
&lt;/span>&lt;span class="lnt">23
&lt;/span>&lt;span class="lnt">24
&lt;/span>&lt;span class="lnt">25
&lt;/span>&lt;span class="lnt">26
&lt;/span>&lt;span class="lnt">27
&lt;/span>&lt;span class="lnt">28
&lt;/span>&lt;span class="lnt">29
&lt;/span>&lt;span class="lnt">30
&lt;/span>&lt;span class="lnt">31
&lt;/span>&lt;span class="lnt">32
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-powershell" data-lang="powershell">&lt;span class="line">&lt;span class="cl">&lt;span class="c"># Definition der Parameter&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">Param&lt;/span>&lt;span class="p">(&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">[&lt;/span>&lt;span class="k">Parameter&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="k">Mandatory&lt;/span>&lt;span class="p">=&lt;/span>&lt;span class="nv">$True&lt;/span>&lt;span class="p">)]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="no">[string]&lt;/span>&lt;span class="nv">$StringParameter1&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">[&lt;/span>&lt;span class="k">Parameter&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="k">Mandatory&lt;/span>&lt;span class="p">=&lt;/span>&lt;span class="nv">$True&lt;/span>&lt;span class="p">)]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">[&lt;/span>&lt;span class="k">ValidateSet&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;String1&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="s2">&amp;#34;String2&amp;#34;&lt;/span>&lt;span class="p">)]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="no">[string]&lt;/span>&lt;span class="nv">$StringParameter2&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">[&lt;/span>&lt;span class="k">Parameter&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="k">Mandatory&lt;/span>&lt;span class="p">=&lt;/span>&lt;span class="nv">$True&lt;/span>&lt;span class="p">)]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="no">[int]&lt;/span>&lt;span class="nv">$IntegerParameter1&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">[&lt;/span>&lt;span class="k">Parameter&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="k">Mandatory&lt;/span>&lt;span class="p">=&lt;/span>&lt;span class="nv">$True&lt;/span>&lt;span class="p">)]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">[&lt;/span>&lt;span class="k">ValidateRange&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">0&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">5&lt;/span>&lt;span class="p">)]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="no">[int]&lt;/span>&lt;span class="nv">$IntegerParameter2&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c"># eigene Überprüfung der Parameter&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">if&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="o">-not&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nv">$StringParameter1&lt;/span> &lt;span class="o">-eq&lt;/span> &lt;span class="s2">&amp;#34;String1&amp;#34;&lt;/span> &lt;span class="o">-or&lt;/span> &lt;span class="nv">$StringParameter1&lt;/span> &lt;span class="o">-eq&lt;/span> &lt;span class="s2">&amp;#34;String2&amp;#34;&lt;/span>&lt;span class="p">))&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">Write-Output&lt;/span> &lt;span class="s2">&amp;#34;Fehler! Gültige Werte für StringParameter1 sind &amp;#34;&amp;#34;String1&amp;#34;&amp;#34; und &amp;#34;&amp;#34;String2&amp;#34;&amp;#34;.&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">exit&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">if&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="nv">$IntegerParameter1&lt;/span> &lt;span class="o">-lt&lt;/span> &lt;span class="n">0&lt;/span> &lt;span class="o">-or&lt;/span> &lt;span class="nv">$IntegerParameter1&lt;/span> &lt;span class="o">-gt&lt;/span> &lt;span class="n">5&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">Write-Output&lt;/span> &lt;span class="s2">&amp;#34;Fehler! Wert für IntegerParameter1 muss im Bereich 0 bis 5 liegen.&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">exit&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c"># Ausgabe der Parameter&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">Write-Output&lt;/span> &lt;span class="s2">&amp;#34;StringParameter1: $StringParameter1&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">Write-Output&lt;/span> &lt;span class="s2">&amp;#34;StringParameter2: $StringParameter2&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">Write-Output&lt;/span> &lt;span class="s2">&amp;#34;IntegerParameter1: $IntegerParameter1&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">Write-Output&lt;/span> &lt;span class="s2">&amp;#34;IntegerParameter2: $IntegerParameter2&amp;#34;&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>
&lt;p>Im Beispiel werden &lt;em>&lt;strong>$StringParameter1&lt;/strong>&lt;/em> und &lt;em>&lt;strong>$IntegerParameter1&lt;/strong>&lt;/em> durch eigenen Code überprüft (Zeile 18 bis 24). Die beiden anderen Parameter werden mit ValidateSet (Zeile 7) und ValidateRange (Zeile 14) auf gültige Werte geprüft. In beiden Fällen dürfen als String &amp;ldquo;String1&amp;rdquo; oder &amp;ldquo;String2&amp;rdquo; und als Integer die Zahlen von 0 bis 5 übergeben werden. Als Beispiele die Fehlerausgabe bei der eigenen Überprüfung&lt;/p>
&lt;pre class="psconsole">
PS C:\> .\ValidatePowerShellParameter.ps1 -StringParameter1 "ein anderer String" -StringParameter2 "String2" -IntegerParameter1 3 -IntegerParameter2 5
&lt;span style="color: red;">Fehler! Gültige Werte für StringParameter1 sind "String1" und "String2".
At C:\ValidatePowerShellParameter.ps1:20 char:10
+ Throw &lt;&lt;&lt;&lt; "Fehler! Gültige Werte für StringParameter1 sind ""String1"" und ""String2""."
+ CategoryInfo : OperationStopped: (Fehler! Gültige... und "String2".:String) [], RuntimeException
+ FullyQualifiedErrorId : Fehler! Gültige Werte für StringParameter1 sind "String1" und "String2".&lt;/span>
&lt;/pre>
&lt;p>und bei einem Fehler mit ValidateRange.&lt;/p>
&lt;pre class="psconsole">
PS C:\> .\ValidatePowerShellParameter.ps1 -StringParameter1 "String1" -StringParameter2 "String2" -IntegerParameter1 3 -IntegerParameter2 8
&lt;span style="color: red;">C:\ValidatePowerShellParameter.ps1 : Cannot validate argument on parameter 'IntegerParameter2'. The 8 argument is greater than the maximum allowed range of 5. Supply an argument that is less than 5 and then try the command again.
At line:1 char:120
+ .\ValidatePowerShellParameter.ps1 -StringParameter1 "String1" -StringParameter2 "String2" -IntegerParameter1 3 -IntegerParameter2 &lt;&lt;&lt;&lt; 8
+ CategoryInfo : InvalidData: (:) [ValidatePowerShellParameter.ps1], ParameterBindingValidationException
+ FullyQualifiedErrorId : ParameterArgumentValidationError,ValidatePowerShellParameter.ps1&lt;/span>
&lt;/pre>
&lt;p>Neben ValidateSet und ValidateRange gibt es noch weitere [Möglichkeiten](&lt;a
class="gblog-markdown__link"
href="https://technet.microsoft.com/en-us/library/dd347600.aspx"
>https://technet.microsoft.com/en-us/library/dd347600.aspx&lt;/a> &amp;ldquo;&amp;ldquo;about_Functions_Advanced_Parameters&amp;rdquo; im Microsoft TechNet&amp;rdquo;):&lt;/p>
&lt;ul>
&lt;li>ValidateCount&lt;/li>
&lt;li>ValidateLength&lt;/li>
&lt;li>ValidatePattern&lt;/li>
&lt;li>ValidateRange&lt;/li>
&lt;li>ValidateScript&lt;/li>
&lt;li>ValidateSet&lt;/li>
&lt;li>ValidateNotNull&lt;/li>
&lt;li>ValidateNotNullOrEmpty&lt;/li>
&lt;/ul>
&lt;p>Ein kurzes Beispiel für ValidateScript:
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;span class="lnt">3
&lt;/span>&lt;span class="lnt">4
&lt;/span>&lt;span class="lnt">5
&lt;/span>&lt;span class="lnt">6
&lt;/span>&lt;span class="lnt">7
&lt;/span>&lt;span class="lnt">8
&lt;/span>&lt;span class="lnt">9
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-powershell" data-lang="powershell">&lt;span class="line">&lt;span class="cl">&lt;span class="c"># Definition der Parameter&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">Param&lt;/span>&lt;span class="p">(&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">[&lt;/span>&lt;span class="k">Parameter&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="k">Mandatory&lt;/span>&lt;span class="p">=&lt;/span>&lt;span class="nv">$True&lt;/span>&lt;span class="p">)]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">[&lt;/span>&lt;span class="n">ValidateScript&lt;/span>&lt;span class="p">({&lt;/span>&lt;span class="nv">$_&lt;/span> &lt;span class="o">-match&lt;/span> &lt;span class="s2">&amp;#34;St.*g&amp;#34;&lt;/span>&lt;span class="p">})]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="no">[string]&lt;/span>&lt;span class="nv">$StringParameter&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c"># Ausgabe der Parameter&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">Write-Output&lt;/span> &lt;span class="s2">&amp;#34;StringParameter: $StringParameter&amp;#34;&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;/p>
&lt;p>Leider ist es nicht möglich innerhalb des ValidateScript-Teils auf andere übergebene Parameter zuzugreifen. Sind die gültigen Werte eines Parameters also abhängig vom Wert eines weiteren Parameters, muss die Überprüfung außerhalb der Parameterdefinition erfolgen.&lt;/p>
&lt;p>Außerdem ist zu beachten, dass nur übergebene Parameter überprüft werden. Wird ein Wert als Default gesetzt und nicht als Parameter übergeben, findet keine Überprüfung statt und der Wert muss (soweit wirklich erforderlich) mit eigenem Code geprüft werden.&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;span class="lnt">3
&lt;/span>&lt;span class="lnt">4
&lt;/span>&lt;span class="lnt">5
&lt;/span>&lt;span class="lnt">6
&lt;/span>&lt;span class="lnt">7
&lt;/span>&lt;span class="lnt">8
&lt;/span>&lt;span class="lnt">9
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-powershell" data-lang="powershell">&lt;span class="line">&lt;span class="cl">&lt;span class="c"># Definition der Parameter&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">Param&lt;/span>&lt;span class="p">(&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">[&lt;/span>&lt;span class="k">Parameter&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="k">Mandatory&lt;/span>&lt;span class="p">=&lt;/span>&lt;span class="nv">$False&lt;/span>&lt;span class="p">)]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">[&lt;/span>&lt;span class="k">ValidateRange&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">0&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="n">5&lt;/span>&lt;span class="p">)]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="no">[string]&lt;/span>&lt;span class="nv">$IntegerParameter&lt;/span>&lt;span class="p">=&lt;/span>&lt;span class="n">8&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c"># Ausgabe der Parameter&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">Write-Output&lt;/span> &lt;span class="s2">&amp;#34;IntegerParameter: $IntegerParameter&amp;#34;&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>
&lt;pre class="psconsole">
PS C:\> .\ValidatePowerShellParameter.ps1
IntegerParameter: 8
PS C:\> .\ValidatePowerShellParameter.ps1 -IntegerParameter 8
&lt;span style="color: red;">C:\ValidatePowerShellParameter.ps1 : Cannot validate argument on parameter 'IntegerParameter'. The 8 argument is greater than the maximum allowed range of 5. Supply an argument that is less than 5 and then try the command again.
At line:1 char:43
+ .\ValidatePowerShellParameter.ps1 -IntegerParameter &lt;&lt;&lt;&lt; 8
+ CategoryInfo : InvalidData: (:) [ValidatePowerShellParameter.ps1], ParameterBindingValidationException
+ FullyQualifiedErrorId : ParameterArgumentValidationError,ValidatePowerShellParameter.ps1&lt;/span>
&lt;/pre></content><category scheme="https://www.krausmueller.de/tags/powershell" term="powershell" label="powershell"/></entry><entry><title>Zukunft von jk_poll</title><link href="https://www.krausmueller.de/2016/01/12/zukunft-von-jk_poll/" rel="alternate" type="text/html" hreflang="de"/><id>https://www.krausmueller.de/2016/01/12/zukunft-von-jk_poll/</id><published>2016-01-12T00:00:00+00:00</published><updated>2016-01-12T00:00:00+00:00</updated><content type="html">
&lt;p>&lt;a
class="gblog-markdown__link"
href="https://typo3.org/extensions/repository/view/jk_poll"
title="jk_poll im Repository"
>jk_poll&lt;/a> gibt es mittlweile schon seit 10 Jahren (erster Upload in 2005). Neue Versionen erscheinen nur noch sehr selten und sind meist auch nur kleinere Bugfixes wie z.B. auch die Kompatibilität zu TYPO3 6.2.x. Aus meiner Sicht ist die Extension &amp;ldquo;Feature complete&amp;rdquo;.&lt;/p>
&lt;p>Ich startete jk_poll weil ich für eine TYPO3-Installation eine Umfrage umsetzen wollte und keine für mich passende fand. Über die Jahre kamen immer mal wieder Anfragen für neue Features, wodurch die Extension sich weiterentwickelte. Mittlerweile setze ich jk_poll selber nicht mehr ein (außer im &lt;a
class="gblog-markdown__link"
href="https://www.krausmueller.de/jk_poll_demo/"
title="Demo von jk_poll"
>Demo-Bereich&lt;/a>). Generell nutze ich TYPO3 nur noch für ein paar alte Installationen. Deshalb wird es vermutlich auch in Zukunft keine neuen Features geben. Im Gegenteil, evtl. fallen auch Features weg da benötigte Extensions wie &lt;a
class="gblog-markdown__link"
href="https://typo3.org/extensions/repository/view/comments"
title="TYPO3-Extension comments"
>comments&lt;/a> mit der heute aktuellen TYPO3-Version 6.2.17 nicht mehr kompatibel sind. Anfragen können natürlich weiterhin gestellt werden, sie werden allerdings nur in absoluten Ausnahmefällen umgesetzt. Weiterhin geben wird es (soweit notwendig) Bugfixes und die Kompatibilität für zumindest TYPO3 in der Version 6.x.&lt;/p>
&lt;p>Auf Github wurde jk_poll auch &lt;a
class="gblog-markdown__link"
href="https://github.com/Intera/typo3-extension-jk_poll/"
title="Fork von jk_poll auf Github"
>&amp;ldquo;geforkt&amp;rdquo;&lt;/a>. Vielleicht ist auch dieser Fork für manche Benutzer von jk_poll interessant.&lt;/p>
&lt;p>&lt;strong>Zusammenfassung: jk_poll wird keine neuen Features erhalten. Bugfixes und Kompatibilität zu TYPO3 Version 6.x sind weiterhin gewährleistet.&lt;/strong>&lt;/p></content><category scheme="https://www.krausmueller.de/tags/typo3" term="typo3" label="typo3"/></entry><entry><title>NetApp vFiler DR mit Data ONTAP Simulator Teil 3: Einrichtung des 2. Simulators</title><link href="https://www.krausmueller.de/2015/12/19/netapp-vfiler-dr-teil3/" rel="alternate" type="text/html" hreflang="de"/><id>https://www.krausmueller.de/2015/12/19/netapp-vfiler-dr-teil3/</id><published>2015-12-19T00:00:00+00:00</published><updated>2015-12-19T00:00:00+00:00</updated><content type="html">
&lt;p>&lt;em style="font-size:0.8em;">Dies ist Teil einer &lt;a
class="gblog-markdown__link"
href="https://www.krausmueller.de/2015/12/19/netapp-vfiler-dr-teil3/#serienlinks"
title="Alle Artikel der Serie"
>Artikelserie&lt;/a>.&lt;/em>&lt;/p>
&lt;p>Prinzipiell wird der 2. Simulator genauso eingerichtet wie die 1. VM. Als einzige Besonderheit müssen wie in &lt;a
class="gblog-markdown__link"
href="/de/netapp-vfiler-dr-teil1"
title="Teil 1: Download der benötigten Komponenten"
>Teil 1&lt;/a> angedeutet die Seriennummer und Systemid der Data ONTAP Installation geändert und die dazu passenden Lizenzen genutzt werden.&lt;/p>
&lt;p>Aus der Datei &amp;ldquo;VSIM Licenses: 8.2.3 licenses Clustered-ONTAP&amp;rdquo; wird nun eine passende Seriennummer ausgewählt. In meinem Fall enthält die Datei die Zeile &amp;ldquo;Licenses for the non-ESX build (Serial Number 4082368507)&amp;rdquo;. Die Seriennummer für die 2. VM lautet also 4082368507 und darunter sind die Lizenzen für die 2. VM aufgeführt.&lt;/p>
&lt;p>Nach dem Einschalten der 2. VM wird an der Stelle &amp;ldquo;Hit [Enter] to boot immediately, or any other key for command prompt.&amp;rdquo; eine beliebige andere Taste gedrückt. Das command prompt meldet sich dann mit &amp;ldquo;SIMLOADER&amp;gt;&amp;rdquo;. An dieser Stelle werden Seriennummer und Systemid mit den Befehlen &lt;em>&lt;strong>set SYS_SERIAL_NUM=4082368-50-7&lt;/strong>&lt;/em> und &lt;em>&lt;strong>set bootarg.nvram.sysid=4082368507&lt;/strong>&lt;/em> neu gesetzt und das System danach mit &amp;ldquo;boot&amp;rdquo; gestartet.&lt;/p>
&lt;p>&lt;img
src="/images/netapp_serial.png"
alt="Ändern der Seriennummer"
/>&lt;/p>
&lt;p>Die restliche Konfiguration läuft wie beim 1. Simulator ab. Also erst Ctrl+C, mit 4 die Konfiguration neu starten und Hostnamen und IP-Einstellungen vergeben. Danach wieder per SSH einloggen und die Befehle wie in &lt;a
class="gblog-markdown__link"
href="/de/netapp-vfiler-dr-teil2"
title="Teil 2: Einrichtung des 1. Simulators"
>Teil 2&lt;/a> eingeben. Die Lizenzen müssen jetzt natürlich wie die Seriennummer aus der Datei &amp;ldquo;VSIM Licenses: 8.2.3 licenses Clustered-ONTAP&amp;rdquo; entnommen werden.&lt;/p>
&lt;p>Jetzt stehen also 2 Data ONTAP Simulatoren zur Verfügung auf denen in den weiteren Teilen der Serie ein vFiler DR eingerichtet werden kann.&lt;/p>
&lt;p>&lt;a name="serienlinks">&lt;/a>
Alle Artikel der Serie:&lt;br>
&lt;a
class="gblog-markdown__link"
href="/de/netapp-vfiler-dr-teil1"
title="Teil 1: Download der benötigten Komponenten"
>Teil 1: Download der benötigten Komponenten&lt;/a>&lt;br>
&lt;a
class="gblog-markdown__link"
href="/de/netapp-vfiler-dr-teil2"
title="Teil 2: Einrichtung des 1. Simulators"
>Teil 2: Einrichtung des 1. Simulators&lt;/a>&lt;br>
&lt;a
class="gblog-markdown__link"
href="/de/netapp-vfiler-dr-teil3"
title="Teil 3: Einrichtung des 2. Simulators"
>Teil 3: Einrichtung des 2. Simulators&lt;/a>&lt;br>
&lt;a
class="gblog-markdown__link"
href="/de/netapp-vfiler-dr-teil4"
title="Teil 4: Erstellen eines Aggregats und Volumes"
>Teil 4: Erstellen eines Aggregats und Volumes&lt;/a>&lt;br>
&lt;a
class="gblog-markdown__link"
href="/de/netapp-vfiler-dr-teil5"
title="Teil 5: DNS Konfiguration"
>Teil 5: DNS Konfiguration&lt;/a>&lt;br>
&lt;a
class="gblog-markdown__link"
href="/de/netapp-vfiler-dr-teil6"
title="Teil 6: vFiler erstellen und vFiler DR konfigurieren"
>Teil 6: vFiler erstellen und vFiler DR konfigurieren&lt;/a>&lt;br>
&lt;a
class="gblog-markdown__link"
href="/de/netapp-vfiler-dr-teil7"
title="Teil 7: Synchroner vFiler DR"
>Teil 7: Synchroner vFiler DR&lt;/a>&lt;br>
&lt;a
class="gblog-markdown__link"
href="/de/netapp-vfiler-dr-teil8"
title="Teil 8: Freigaben auf vFiler erstellen"
>Teil 8: Freigaben auf vFiler erstellen&lt;/a>&lt;br>
&lt;a
class="gblog-markdown__link"
href="/de/netapp-vfiler-dr-teil9"
title="Teil 9: Geplanter Failover"
>Teil 9: Geplanter Failover&lt;/a>&lt;br>
&lt;a
class="gblog-markdown__link"
href="/de/netapp-vfiler-dr-teil10"
title="Teil 10: Disaster Failover"
>Teil 10: Disaster Failover&lt;/a>&lt;/p></content><category scheme="https://www.krausmueller.de/tags/netapp" term="netapp" label="netapp"/></entry><entry><title>Alternativer Client für Let's Encrypt</title><link href="https://www.krausmueller.de/2015/12/17/alternativer-client-fuer-letsencrypt/" rel="alternate" type="text/html" hreflang="de"/><id>https://www.krausmueller.de/2015/12/17/alternativer-client-fuer-letsencrypt/</id><published>2015-12-17T00:00:00+00:00</published><updated>2015-12-17T00:00:00+00:00</updated><content type="html">
&lt;p>Wie schon im &lt;a
class="gblog-markdown__link"
href="/de/ssl-mit-nginx-und-letsencrypt"
title="Nginx mit SSL und Let&amp;#39;s Encrypt absichern"
>1. Artikel&lt;/a> zu Let&amp;rsquo;s Encrypt kurz erwähnt ist die Installation des Clients und die notwendige Umgebung unter ~/.local/ nicht ganz durchsichtig. Als Alternative habe ich den Client &lt;a
class="gblog-markdown__link"
href="https://github.com/diafygi/acme-tiny"
title="acme-tiny"
>acme-tiny&lt;/a> getestet. Voraussetzung für den Client ist lediglich Python und OpenSSL. Der Quellcode ist unter 200 Zeilen und somit noch einigermaßen leicht nachvollziehbar.&lt;/p>
&lt;p>Als weiteren Vorteil kann man durch &lt;a
class="gblog-markdown__link"
href="https://en.wikipedia.org/wiki/SubjectAltName"
title="Wikipedia Artikel"
>Subject Alternative Names&lt;/a> auch ein Zertifikat erstellen, dass für mehrere Domains (die auf den gleichen Server und Webspace verweisen) gültig ist. So kann also z.B. ein für die Domains krausmueller.de &lt;strong>und&lt;/strong> &lt;a
class="gblog-markdown__link"
href="https://www.krausmueller.de"
>www.krausmueller.de&lt;/a> gültiges Zertifikat ausgestellt werden. Die &lt;a
class="gblog-markdown__link"
href="https://github.com/diafygi/acme-tiny/blob/master/README.md"
title="README von acme-tiny"
>README&lt;/a> enthält alle notwendigen Schritte, weshalb ich nur kurz auf die aus meiner Sicht wichtigsten Schritte gesondert eingehe.&lt;/p>
&lt;p>Die Domains für die das Zertifikat ausgestellt wird (Subject Alternative Names) werden in Schritt 2 angegeben.&lt;/p>
&lt;p>Der Nachweis, dass die Domain auch von einem verwaltet wird erfolgt bei acme-tiny per Dateien im Ordner .well-known/acme-challenge/ unterhalb der Domain. Es muss also entweder beim Aufruf des Clients in Schritt 4 als acme-dir der volle Pfad zu diesem Ordner angegeben (also z.B. /var/www/domain/.well-known/acme-challenge) oder ein Alias auf ein anderes Verzeichnis angelegt werden, welches dann als acme-dir angegeben werden kann (Beispiel unten für Apache).&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-apacheconf" data-lang="apacheconf">&lt;span class="line">&lt;span class="cl">&lt;span class="nb">Alias&lt;/span> /.well-known/acme-challenge/ &lt;span class="s2">&amp;#34;/var/www/challenges/&amp;#34;&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>
&lt;p>Die Beispielkonfiguration in Schritt 5 der README ist für nginx. Ein Konfiguration für Apache könnte folgendermaßen aussehen:&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;span class="lnt">11
&lt;/span>&lt;span class="lnt">12
&lt;/span>&lt;span class="lnt">13
&lt;/span>&lt;span class="lnt">14
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-apacheconf" data-lang="apacheconf">&lt;span class="line">&lt;span class="cl">&lt;span class="nt">&amp;lt;VirtualHost&lt;/span> &lt;span class="s">*:443&lt;/span>&lt;span class="nt">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">ServerAdmin&lt;/span> webmaster@localhost
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">ServerName&lt;/span> krausmueller.de
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">ServerAlias&lt;/span> www.krausmueller.de
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">DocumentRoot&lt;/span> &lt;span class="sx">/var/www/krausmueller&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">SSLEngine&lt;/span> &lt;span class="k">on&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">SSLCertificateFile&lt;/span> &lt;span class="sx">/home/johannes/lets_encrypt/signed.crt&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">SSLCertificateChainFile&lt;/span> &lt;span class="sx">/home/johannes/lets_encrypt/intermediate.pem&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">SSLCertificateKeyFile&lt;/span> &lt;span class="sx">/home/johannes/lets_encrypt/domain.key&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">SSLProtocol&lt;/span> &lt;span class="k">all&lt;/span> -SSLv2 -SSLv3 -TLSv1
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">SSLCipherSuite&lt;/span> ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!3DES:!MD5:!PSK
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">SSLHonorCipherOrder&lt;/span> &lt;span class="k">on&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nt">&amp;lt;/VirtualHost&amp;gt;&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>
&lt;p>Zusätzlich kann man noch alle HTTP-Zugriffe automatisch auf HTTPS umleiten. Als Ausnahme muss dabei der Ordner .well-known/acme-challenge definiert werden, da dieser Pfad beim Erneuern des Zertifikats per HTTP erreichbar sein muss.&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;span class="lnt">11
&lt;/span>&lt;span class="lnt">12
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-apacheconf" data-lang="apacheconf">&lt;span class="line">&lt;span class="cl">&lt;span class="nt">&amp;lt;VirtualHost&lt;/span> &lt;span class="s">*:80&lt;/span>&lt;span class="nt">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">ServerAdmin&lt;/span> webmaster@localhost
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">ServerName&lt;/span> krausmueller.de
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">ServerAlias&lt;/span> www.krausmueller.de
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">DocumentRoot&lt;/span> &lt;span class="sx">/var/www/&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;IfModule&lt;/span> &lt;span class="s">mod_rewrite.c&lt;/span>&lt;span class="nt">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">RewriteEngine&lt;/span> &lt;span class="k">On&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">RewriteCond&lt;/span> %{REQUEST_URI} !^/\.well\-known/acme\-challenge/
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">RewriteRule&lt;/span> (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;/IfModule&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nt">&amp;lt;/VirtualHost&amp;gt;&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>
&lt;p>Für das Erneuern des Zertifikats muss wie in Schritt 6 der README beschrieben ein Script erstellt werden, welches dann per Cronjob regelmäßig ausgeführt wird.&lt;/p></content><category scheme="https://www.krausmueller.de/tags/web" term="web" label="web"/><category scheme="https://www.krausmueller.de/tags/linux" term="linux" label="linux"/></entry><entry><title>NetApp vFiler DR mit Data ONTAP Simulator Teil 2: Einrichtung des 1. Simulators</title><link href="https://www.krausmueller.de/2015/12/15/netapp-vfiler-dr-teil2/" rel="alternate" type="text/html" hreflang="de"/><id>https://www.krausmueller.de/2015/12/15/netapp-vfiler-dr-teil2/</id><published>2015-12-15T00:00:00+00:00</published><updated>2015-12-15T00:00:00+00:00</updated><content type="html">
&lt;p>&lt;em style="font-size:0.8em;">Dies ist Teil einer &lt;a
class="gblog-markdown__link"
href="https://www.krausmueller.de/2015/12/15/netapp-vfiler-dr-teil2/#serienlinks"
title="Alle Artikel der Serie"
>Artikelserie&lt;/a>.&lt;/em>&lt;/p>
&lt;p>Nach dem Entpacken der Datei vsim_netapp-7m.tgz muss die Datei DataONTAP.vmx in VMware Fusion geöffnet werden. Die virtuellen Netzwerkkarten sind standardmäßig auf &amp;ldquo;Host-only&amp;rdquo; bzw. &amp;ldquo;Privat auf meinem Mac&amp;rdquo; eingestellt, also nur vom Fusion Host selbst erreichbar. Um mit den Simulatoren im normalen Netzwerk kommunizieren zu können, sollte der Netzwerktyp auf &amp;ldquo;Bridged&amp;rdquo; gesetzt werden.&lt;/p>
&lt;p>&lt;img
src="/images/netapp_vmnet.png"
alt="Netzwerkkonfiguration"
/>&lt;/p>
&lt;p>Nach dem Start der VM muss sie neu konfiguriert werden (z.B. IP-Adress und Hostname). Dazu erst Ctrl+C drücken und mit 4 die Konfiguration neu starten und alle Disks neu initialisieren. Die Nachfragen jeweils mit &amp;ldquo;Y&amp;rdquo; bestätigen. Die VM startet neu und fragt nach einer Weile den Hostnamen und die IP-Einstellungen ab. Ich habe nur die erste Netzwerkkarte konfiguriert. Alle anderen Fragen werden durch &amp;ldquo;ENTER&amp;rdquo; mit dem Default-Wert beantwortet. Nach Vergabe eines Passworts steht der erste Filer prinzipiell bereit. Ein kurzes Video veranschaulicht die Einrichtung vermutlich am besten:&lt;/p>
&lt;video controls="controls" width="628" height="480">
&lt;source src="/videos/netapp01.mp4" type="video/mp4" />
&lt;object type="application/x-shockwave-flash" data="http://releases.flowplayer.org/swf/flowplayer-3.2.1.swf" width="640" height="360">
&lt;param name="movie" value="http://releases.flowplayer.org/swf/flowplayer-3.2.1.swf" />
&lt;param name="allowFullScreen" value="true" />
&lt;param name="wmode" value="transparent" />
&lt;param name="flashVars" value="config={'playlist':[{'url':'%2Fmedia%2Fvideos%2Fnetapp01.mp4','autoPlay':false}]}" />
&lt;/object>
&lt;/video>
&lt;p>Ab jetzt kann man sich z.B. mit &lt;a
class="gblog-markdown__link"
href="http://www.putty.org/"
title="Putty SSH Client"
>putty&lt;/a> per SSH einloggen (Benutzer root und das vorher vergebene Passwort) und die restliche Konfiguration vornehmen.&lt;/p>
&lt;p>Als erstes sollte man den Autosupport abschalten, so daß das System Fehler nicht automatisch zu NetApp schickt. Außerdem kann man gleich die Zeitzone richtig einstellen (sofern nicht schon bei der initialen Konfiguration richtig gesetzt). Durch die Aktivierung von TLS lässt sich später auch der OnCommand System Manager nutzen.&lt;/p>
&lt;pre class="shell">
netapp01> &lt;b>options autosupport.support.enable off&lt;/b>
netapp01> &lt;b>timezone Europe/Berlin&lt;/b>
netapp01> &lt;b>options tls.enable on&lt;/b>
&lt;/pre>
&lt;p>Als nächstes kann man die virtuellen Festplatten der NetApp zuordnen, so daß sie später genutzt werden können:&lt;/p>
&lt;pre class="shell">
netapp01> &lt;b>disk show -n&lt;/b>
DISK OWNER POOL SERIAL NUMBER HOME DR HOME
------------ ------------- ----- ------------- ------------- -------------
v4.16 Not Owned NONE 08523900
v4.17 Not Owned NONE 08523901
v4.18 Not Owned NONE 08523902
v4.19 Not Owned NONE 08523903
v4.20 Not Owned NONE 08523904
v4.21 Not Owned NONE 08523905
v4.22 Not Owned NONE 08523906
v4.24 Not Owned NONE 08523907
v4.25 Not Owned NONE 08523908
v4.26 Not Owned NONE 08523909
v4.27 Not Owned NONE 08523910
v4.28 Not Owned NONE 08523911
v4.29 Not Owned NONE 08523912
v4.32 Not Owned NONE 08523913
netapp01> &lt;b>disk assign all&lt;/b>
Mon Dec 14 22:31:18 CET [netapp01:diskown.changingOwner:info]: changing ownership for disk v4.16 (S/N 08523900) from unowned (ID 4294967295) to netapp01 (ID 4082368508)
Mon Dec 14 22:31:18 CET [netapp01:diskown.changingOwner:info]: changing ownership for disk v4.17 (S/N 08523901) from unowned (ID 4294967295) to netapp01 (ID 4082368508)
Mon Dec 14 22:31:18 CET [netapp01:diskown.changingOwner:info]: changing ownership for disk v4.18 (S/N 08523902) from unowned (ID 4294967295) to netapp01 (ID 4082368508)
Mon Dec 14 22:31:18 CET [netapp01:diskown.changingOwner:info]: changing ownership for disk v4.19 (S/N 08523903) from unowned (ID 4294967295) to netapp01 (ID 4082368508)
Mon Dec 14 22:31:18 CET [netapp01:diskown.changingOwner:info]: changing ownership for disk v4.20 (S/N 08523904) from unowned (ID 4294967295) to netapp01 (ID 4082368508)
Mon Dec 14 22:31:18 CET [netapp01:diskown.changingOwner:info]: changing ownership for disk v4.21 (S/N 08523905) from unowned (ID 4294967295) to netapp01 (ID 4082368508)
Mon Dec 14 22:31:18 CET [netapp01:diskown.changingOwner:info]: changing ownership for disk v4.22 (S/N 08523906) from unowned (ID 4294967295) to netapp01 (ID 4082368508)
Mon Dec 14 22:31:18 CET [netapp01:diskown.changingOwner:info]: changing ownership for disk v4.24 (S/N 08523907) from unowned (ID 4294967295) to netapp01 (ID 4082368508)
Mon Dec 14 22:31:18 CET [netapp01:diskown.changingOwner:info]: changing ownership for disk v4.25 (S/N 08523908) from unowned (ID 4294967295) to netapp01 (ID 4082368508)
Mon Dec 14 22:31:18 CET [netapp01:diskown.changingOwner:info]: changing ownership for disk v4.26 (S/N 08523909) from unowned (ID 4294967295) to netapp01 (ID 4082368508)
Mon Dec 14 22:31:18 CET [netapp01:diskown.changingOwner:info]: changing ownership for disk v4.27 (S/N 08523910) from unowned (ID 4294967295) to netapp01 (ID 4082368508)
Mon Dec 14 22:31:18 CET [netapp01:diskown.changingOwner:info]: changing ownership for disk v4.28 (S/N 08523911) from unowned (ID 4294967295) to netapp01 (ID 4082368508)
Mon Dec 14 22:31:18 CET [netapp01:diskown.changingOwner:info]: changing ownership for disk v4.29 (S/N 08523912) from unowned (ID 4294967295) to netapp01 (ID 4082368508)
Mon Dec 14 22:31:18 CET [netapp01:diskown.changingOwner:info]: changing ownership for disk v4.32 (S/N 08523913) from unowned (ID 4294967295) to netapp01 (ID 4082368508)
&lt;/pre>
&lt;p>Als letztes werden noch die Lizenzen eingespielt und Features aktiviert. Die Lizenzen sind in der Datei &amp;ldquo;VSIM Licenses: 8.2.3 licenses 7-Mode&amp;rdquo; aus &lt;a
class="gblog-markdown__link"
href="/de/netapp-vfiler-dr-teil1"
title="Teil 1: Download der benötigten Komponenten"
>Part 1&lt;/a> im Bereich &amp;ldquo;Licenses for the non-ESX build&amp;rdquo; zu finden und müssen für jeden License Code mit &amp;ldquo;license add&amp;rdquo; hinzugefügt werden (im Beispiel unten ist dies nur für einen License Code aufgeführt und die Lizenz durch &amp;ldquo;XXXXXXXXXXXXXXXXXXXXXXXXXXXX&amp;rdquo; dargestellt).&lt;/p>
&lt;pre class="shell">
netapp01> &lt;b>license add XXXXXXXXXXXXXXXXXXXXXXXXXXXX&lt;/b>
license add: successfully added license key "XXXXXXXXXXXXXXXXXXXXXXXXXXXX".
netapp01> &lt;b>options licensed_feature.multistore.enable on&lt;/b>
netapp01> &lt;b>options snapmirror.enable on&lt;/b>
netapp01> &lt;b>options rsh.enable on&lt;/b>
&lt;/pre>
&lt;p>&lt;a name="serienlinks">&lt;/a>
Alle Artikel der Serie:&lt;br>
&lt;a
class="gblog-markdown__link"
href="/de/netapp-vfiler-dr-teil1"
title="Teil 1: Download der benötigten Komponenten"
>Teil 1: Download der benötigten Komponenten&lt;/a>&lt;br>
&lt;a
class="gblog-markdown__link"
href="/de/netapp-vfiler-dr-teil2"
title="Teil 2: Einrichtung des 1. Simulators"
>Teil 2: Einrichtung des 1. Simulators&lt;/a>&lt;br>
&lt;a
class="gblog-markdown__link"
href="/de/netapp-vfiler-dr-teil3"
title="Teil 3: Einrichtung des 2. Simulators"
>Teil 3: Einrichtung des 2. Simulators&lt;/a>&lt;br>
&lt;a
class="gblog-markdown__link"
href="/de/netapp-vfiler-dr-teil4"
title="Teil 4: Erstellen eines Aggregats und Volumes"
>Teil 4: Erstellen eines Aggregats und Volumes&lt;/a>&lt;br>
&lt;a
class="gblog-markdown__link"
href="/de/netapp-vfiler-dr-teil5"
title="Teil 5: DNS Konfiguration"
>Teil 5: DNS Konfiguration&lt;/a>&lt;br>
&lt;a
class="gblog-markdown__link"
href="/de/netapp-vfiler-dr-teil6"
title="Teil 6: vFiler erstellen und vFiler DR konfigurieren"
>Teil 6: vFiler erstellen und vFiler DR konfigurieren&lt;/a>&lt;br>
&lt;a
class="gblog-markdown__link"
href="/de/netapp-vfiler-dr-teil7"
title="Teil 7: Synchroner vFiler DR"
>Teil 7: Synchroner vFiler DR&lt;/a>&lt;br>
&lt;a
class="gblog-markdown__link"
href="/de/netapp-vfiler-dr-teil8"
title="Teil 8: Freigaben auf vFiler erstellen"
>Teil 8: Freigaben auf vFiler erstellen&lt;/a>&lt;br>
&lt;a
class="gblog-markdown__link"
href="/de/netapp-vfiler-dr-teil9"
title="Teil 9: Geplanter Failover"
>Teil 9: Geplanter Failover&lt;/a>&lt;br>
&lt;a
class="gblog-markdown__link"
href="/de/netapp-vfiler-dr-teil10"
title="Teil 10: Disaster Failover"
>Teil 10: Disaster Failover&lt;/a>&lt;/p></content><category scheme="https://www.krausmueller.de/tags/netapp" term="netapp" label="netapp"/></entry><entry><title>Nginx mit SSL und Let's Encrypt absichern</title><link href="https://www.krausmueller.de/2015/12/13/ssl-mit-nginx-und-letsencrypt/" rel="alternate" type="text/html" hreflang="de"/><id>https://www.krausmueller.de/2015/12/13/ssl-mit-nginx-und-letsencrypt/</id><published>2015-12-13T00:00:00+00:00</published><updated>2015-12-13T00:00:00+00:00</updated><content type="html">
&lt;p>&lt;strong>Hinweis:&lt;/strong> Wenn man den Client und Pakete die für ihn benötigt werden nicht zusätzlich auf seinem Server installieren will kann man auch mit der Hilfe einer &lt;a
class="gblog-markdown__link"
href="https://gethttpsforfree.com/"
title="Webseite zum manuellen Erstellen der Zertifikate"
>Webseite&lt;/a> die einzelnen Schritte zur Ausstellung des Zertifikats manuell durchführen.&lt;/p>
&lt;p>Seit dem 3. Dezember 2015 befindet sich &lt;a
class="gblog-markdown__link"
href="https://letsencrypt.org"
title="Webseite von Let&amp;#39;s Encrypt"
>Let&amp;rsquo;s Encrypt&lt;/a> in der &lt;a
class="gblog-markdown__link"
href="https://letsencrypt.org/2015/12/03/entering-public-beta.html"
title="Blogartikel zur Public Beta"
>Public Beta&lt;/a>. Das bedeutet man kann sich ohne vorherige Registrierung und Wartezeit ein kostenloses SSL Zertifikat für seine Domain erstellen. Für mein &amp;ldquo;Heimcloud&amp;rdquo; nutze ich einen &lt;a
class="gblog-markdown__link"
href=""
>Cubietruck&lt;/a> (ähnlich zum weitaus bekannteren Raspberry Pi) mit Nginx. Dieser Artikel zeigt wie ich Nginx mit einem SSL-Zertifikat von Let&amp;rsquo;s Encrypt eingerichtet habe.&lt;/p>
&lt;p>Als erstes musss der Let&amp;rsquo;s Encrypt Client &lt;a
class="gblog-markdown__link"
href="https://letsencrypt.readthedocs.org/en/latest/using.html#installation"
title="Installationsanleitung"
>installiert&lt;/a> werden. Dabei werden alle benötigten Debian-Pakete installiert:
&lt;pre class="shell">
hostname:~# git clone https://github.com/letsencrypt/letsencrypt
hostname:~# cd letsencrypt
hostname:~/letsencrypt# ./letsencrypt-auto
&lt;/pre>
&lt;/p>
&lt;p>Für Nginx gibt es noch kein Plugin das die Installation des Zertifikats automatisch vornimmt. Deshalb wird als Plugin standalone verwendet und die Nginx Konfiguration danach manuell angepasst. Zur Validierung der Domain (nicht das man sich ein Zertifikat für eine Domain ausstellt die man gar nicht administriert) werden Port 80 oder 443 genutzt. Da Nginx auf diesen Ports lauscht muss er während der Ausstellung des Zertifikats gestoppt werden. In meinem Fall habe ich kein Problem damit wenn der Webserver kurz nicht verfügbar. Alternativ kann die Domain auch über ein Verzeichnis im Webroot &lt;a
class="gblog-markdown__link"
href="https://letsencrypt.readthedocs.org/en/latest/using.html#id9"
title="Domain Validierung über Webroot"
>validiert&lt;/a> werden:
&lt;pre class="shell">
hostname:~# sudo /etc/init.d/nginx stop
hostname:~# ./letsencrypt-auto certonly -d example.krausmueller.de
hostname:~# sudo /etc/init.d/nginx start
&lt;/pre>
&lt;/p>
&lt;p>Wenn alles geklappt hat liegen die Dateien des Zertifiktas unter /etc/letsencrypt/live/example.krausmueller.de/:
&lt;pre class="shell">
hostname:~# sudo ls /etc/letsencrypt/live/example.krausmueller.de/
cert.pem chain.pem fullchain.pem privkey.pem
&lt;/pre>
&lt;/p>
&lt;p>Neben dem Zertifikat sollte man noch seien eigenen Diffie-Hellman-Parameter &lt;a
class="gblog-markdown__link"
href="https://weakdh.org/sysadmin.html"
title="Guide to Deploying Diffie-Hellman for TLS"
>erstellen&lt;/a>:
&lt;pre class="shell">
hostname:~# sudo openssl dhparam -out /etc/nginx/dhparams.pem 2048
&lt;/pre>
&lt;/p>
&lt;p>Eine möglichst sichere Konfiguration für Nginx lässt sich mit dem &lt;a
class="gblog-markdown__link"
href="https://mozilla.github.io/server-side-tls/ssl-config-generator/"
title="Mozilla SSL Configuration Generator"
>Mozilla SSL Configuration Generator&lt;/a> erstellen. Wichtig ist es dabei die richtige Version des Servers und von OpenSSL einzutragen. Die für meine Zertifikate angepasste Konfiguration:&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;span class="lnt">11
&lt;/span>&lt;span class="lnt">12
&lt;/span>&lt;span class="lnt">13
&lt;/span>&lt;span class="lnt">14
&lt;/span>&lt;span class="lnt">15
&lt;/span>&lt;span class="lnt">16
&lt;/span>&lt;span class="lnt">17
&lt;/span>&lt;span class="lnt">18
&lt;/span>&lt;span class="lnt">19
&lt;/span>&lt;span class="lnt">20
&lt;/span>&lt;span class="lnt">21
&lt;/span>&lt;span class="lnt">22
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-nginx" data-lang="nginx">&lt;span class="line">&lt;span class="cl">&lt;span class="k">server&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kn">listen&lt;/span> &lt;span class="mi">443&lt;/span> &lt;span class="s">ssl&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kn">server_name&lt;/span> &lt;span class="s">example.krausmueller.de&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># certs sent to the client in SERVER HELLO are concatenated in ssl_certificate
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="kn">ssl_certificate&lt;/span> &lt;span class="s">/etc/letsencrypt/live/example.krausmueller.de/fullchain.pem&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kn">ssl_certificate_key&lt;/span> &lt;span class="s">/etc/letsencrypt/live/example.krausmueller.de/privkey.pem&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kn">ssl_session_timeout&lt;/span> &lt;span class="s">1d&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kn">ssl_session_cache&lt;/span> &lt;span class="s">shared:SSL:50m&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># Diffie-Hellman parameter for DHE ciphersuites, recommended 2048 bits
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="kn">ssl_dhparam&lt;/span> &lt;span class="s">/etc/nginx/dhparams.pem&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># modern configuration. tweak to your needs.
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="kn">ssl_protocols&lt;/span> &lt;span class="s">TLSv1.1&lt;/span> &lt;span class="s">TLSv1.2&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kn">ssl_ciphers&lt;/span> &lt;span class="s">&amp;#39;ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!3DES:!MD5:!PSK&amp;#39;&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kn">ssl_prefer_server_ciphers&lt;/span> &lt;span class="no">on&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># HSTS (ngx_http_headers_module is required) (15768000 seconds = 6 months)
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="kn">add_header&lt;/span> &lt;span class="s">Strict-Transport-Security&lt;/span> &lt;span class="s">max-age=15768000&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>
&lt;p>Nach einem Neustart des Nginx sollte ein Test bei &lt;a
class="gblog-markdown__link"
href="https://www.ssllabs.com/ssltest/"
title="Zertifikattest bei SSL Labs"
>SSL Labs&lt;/a> jetzt ein &amp;ldquo;A Rating&amp;rdquo; ergeben.&lt;/p>
&lt;p>&lt;img
src="/images/ssl_labs_rating.png"
alt="SSL Labs Rating"
/>&lt;/p>
&lt;p>Zertifikate von Let&amp;rsquo;s Encrypt sind lediglich 90 Tage gültig und müssen deshalb regelmäßig erneuert werden. Am einfachsten lässt sich das über einen Cronjob erledigen. Bei diesem Beispiel wird das Zertifikat jeden 2. Monat am 28. (wichtig durch möglichen Schalttag im Februar) erneuert:&lt;/p>
&lt;pre class="shell">
hostname:~# crontab -l
# m h dom mon dow command
0 1 28 2,4,6,8,10,12 * sudo /etc/init.d/nginx stop; /home/user/letsencrypt/letsencrypt-auto certonly --renew -d example.krausmueller.de; sudo /etc/init.d/nginx start
&lt;/pre></content><category scheme="https://www.krausmueller.de/tags/web" term="web" label="web"/><category scheme="https://www.krausmueller.de/tags/linux" term="linux" label="linux"/></entry><entry><title>NetApp vFiler DR mit Data ONTAP Simulator Teil 1: Download der benötigten Komponenten</title><link href="https://www.krausmueller.de/2015/12/03/netapp-vfiler-dr-teil1/" rel="alternate" type="text/html" hreflang="de"/><id>https://www.krausmueller.de/2015/12/03/netapp-vfiler-dr-teil1/</id><published>2015-12-03T00:00:00+00:00</published><updated>2015-12-03T00:00:00+00:00</updated><content type="html">
&lt;p>&lt;em style="font-size:0.8em;">Dies ist Teil einer &lt;a
class="gblog-markdown__link"
href="https://www.krausmueller.de/2015/12/03/netapp-vfiler-dr-teil1/#serienlinks"
title="Alle Artikel der Serie"
>Artikelserie&lt;/a>.&lt;/em>&lt;/p>
&lt;p>Um die NetApp vFiler DR Funktionalität, aber auch andere Funktionen, zu testen bietet sich der Data ONTAP Simulator an. Ziel dieser Artikelserie sind 2 NetApps im 7-Mode auf denen alle nötigen Lizenzen eingespielt und die vFiler eingerichtet sind. Als Grundlage dient hier VMware Fusion unter Mac OS X, es sollte aber auf anderen Plattformen (z.B. VMware Workstation unter Windows) ähnlich funktionieren.&lt;/p>
&lt;p>&lt;img
src="/images/vfiler_dr.png"
alt="vFiler DR"
/>&lt;/p>
&lt;p>Zum Download des Simulators muss man sich (sofern noch kein Account vorhanden ist) bei NetApp &lt;a
class="gblog-markdown__link"
href="http://mysupport.netapp.com/eservice/public/now.do"
title="NetApp Registrierung"
>registrieren&lt;/a>. Danach kann dann die passende VM &lt;a
class="gblog-markdown__link"
href="http://mysupport.netapp.com/NOW/download/tools/simulator/ontap/8.X/"
title="Data ONTAP Simulator 8.x Download"
>heruntergeladen&lt;/a> werden. Die VMs stehen im Format für VMware ESX oder Workstation, Player und Fusion bereit. Außerdem wird zwischen &amp;ldquo;7-Mode&amp;rdquo; und &amp;ldquo;Clustered-ONTAP&amp;rdquo; unterschieden. In diesem Beispiel wird 7-Mode (&lt;a
class="gblog-markdown__link"
href="http://mysupport.netapp.com/NOW/download/tools/simulator/ontap/8.2.3/vsim_netapp-7m.tgz"
title="Data ONTAP 7-Mode 8.2.3"
>Version 8.2.3&lt;/a>) für VMware Fusion verwendet.&lt;/p>
&lt;p>Neben der Datei vsim_netapp-7m.tgz werden noch die Lizenzen für Features wie SnapMirror benötigt. Die Lizenzen sind abhängig von der Seriennummer der Data ONTAP Installation. Der heruntergeladene Simulator besitzt immer die gleiche Seriennummer. Um einen 2. Simulator zu verwenden muss dessen Seriennummer geändert werden. Das bedeutet das auch andere Lizenzen (passend zu der geänderten Seriennumer) benötigt werden. Zum Glück kann man dazu die Lizenzen für Clustered-ONTAP nutzen. Es müssen also die Lizenzen &lt;a
class="gblog-markdown__link"
href="http://mysupport.netapp.com/download/tools/simulator/ontap/8.2.3/7Mode_licenses_8.2.3.txt"
title="8.2.3 Lizenzen 7-Mode"
>&amp;ldquo;VSIM Licenses: 8.2.3 licenses 7-Mode&amp;rdquo;&lt;/a> und &lt;a
class="gblog-markdown__link"
href="http://mysupport.netapp.com/download/tools/simulator/ontap/8.2.3/CMode_licenses_8.2.3.txt"
title="8.2.3 Lizenzen Clustered-ONTAP"
>&amp;ldquo;VSIM Licenses: 8.2.3 licenses Clustered-ONTAP&amp;rdquo;&lt;/a> heruntergeladen werden.&lt;/p>
&lt;p>&lt;img
src="/images/netapp_download.png"
alt="Download der benötigten Dateien"
/>&lt;/p>
&lt;p>&lt;a name="serienlinks">&lt;/a>
Alle Artikel der Serie:&lt;br>
&lt;a
class="gblog-markdown__link"
href="/de/netapp-vfiler-dr-teil1"
title="Teil 1: Download der benötigten Komponenten"
>Teil 1: Download der benötigten Komponenten&lt;/a>&lt;br>
&lt;a
class="gblog-markdown__link"
href="/de/netapp-vfiler-dr-teil2"
title="Teil 2: Einrichtung des 1. Simulators"
>Teil 2: Einrichtung des 1. Simulators&lt;/a>&lt;br>
&lt;a
class="gblog-markdown__link"
href="/de/netapp-vfiler-dr-teil3"
title="Teil 3: Einrichtung des 2. Simulators"
>Teil 3: Einrichtung des 2. Simulators&lt;/a>&lt;br>
&lt;a
class="gblog-markdown__link"
href="/de/netapp-vfiler-dr-teil4"
title="Teil 4: Erstellen eines Aggregats und Volumes"
>Teil 4: Erstellen eines Aggregats und Volumes&lt;/a>&lt;br>
&lt;a
class="gblog-markdown__link"
href="/de/netapp-vfiler-dr-teil5"
title="Teil 5: DNS Konfiguration"
>Teil 5: DNS Konfiguration&lt;/a>&lt;br>
&lt;a
class="gblog-markdown__link"
href="/de/netapp-vfiler-dr-teil6"
title="Teil 6: vFiler erstellen und vFiler DR konfigurieren"
>Teil 6: vFiler erstellen und vFiler DR konfigurieren&lt;/a>&lt;br>
&lt;a
class="gblog-markdown__link"
href="/de/netapp-vfiler-dr-teil7"
title="Teil 7: Synchroner vFiler DR"
>Teil 7: Synchroner vFiler DR&lt;/a>&lt;br>
&lt;a
class="gblog-markdown__link"
href="/de/netapp-vfiler-dr-teil8"
title="Teil 8: Freigaben auf vFiler erstellen"
>Teil 8: Freigaben auf vFiler erstellen&lt;/a>&lt;br>
&lt;a
class="gblog-markdown__link"
href="/de/netapp-vfiler-dr-teil9"
title="Teil 9: Geplanter Failover"
>Teil 9: Geplanter Failover&lt;/a>&lt;br>
&lt;a
class="gblog-markdown__link"
href="/de/netapp-vfiler-dr-teil10"
title="Teil 10: Disaster Failover"
>Teil 10: Disaster Failover&lt;/a>&lt;/p></content><category scheme="https://www.krausmueller.de/tags/netapp" term="netapp" label="netapp"/></entry><entry><title>Frontend Editing in TYPO3 6.2</title><link href="https://www.krausmueller.de/2015/12/01/typo3-frontend-editing/" rel="alternate" type="text/html" hreflang="de"/><id>https://www.krausmueller.de/2015/12/01/typo3-frontend-editing/</id><published>2015-12-01T00:00:00+00:00</published><updated>2015-12-01T00:00:00+00:00</updated><content type="html">
&lt;p>Nach dem Update von TYPO3 4.5 auf Version 6.2 funktionierte die Systemextension &amp;ldquo;Frontend Editing&amp;rdquo; (feedit) nicht mehr. Die Icons zum Editieren von Inhalten werden nicht angezeigt. Die Benutzer sind alle Mitglied einer Benutzergruppe mit folgender TSconfig:&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;span class="lnt">3
&lt;/span>&lt;span class="lnt">4
&lt;/span>&lt;span class="lnt">5
&lt;/span>&lt;span class="lnt">6
&lt;/span>&lt;span class="lnt">7
&lt;/span>&lt;span class="lnt">8
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">admPanel {
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> enable.edit = 1
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> module.edit.forceNoPopup = 1
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> module.edit.forceDisplayFieldIcons = 0
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> module.edit.displayIcons = 1
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> module.edit.forceDisplayIcons = 1
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> hide = 1
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">}&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>
&lt;p>Nach ein wenig Debuggen stellte sich heraus, dass bei dieser Konfiguration die CSS-Datei für das Admin-Panel nicht eingebunden wird. Der Bug ist auch &lt;a
class="gblog-markdown__link"
href="https://forge.typo3.org/issues/61298"
title="Bug #61298"
>hier&lt;/a> beschrieben. Der Fehler ist wohl in TYPO3 7.4 behoben, aber leider nicht für Version 6.2.&lt;/p>
&lt;p>Als Workaround habe ich die CSS-Datei manuell über das Template eingebunden:&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;span class="lnt">3
&lt;/span>&lt;span class="lnt">4
&lt;/span>&lt;span class="lnt">5
&lt;/span>&lt;span class="lnt">6
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl"># Workaround für feedit
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">[globalVar = TSFE : beUserLogin &amp;gt; 0]
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">page.includeCSS {
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> file1 = typo3/sysext/t3skin/stylesheets/standalone/admin_panel.css
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">}
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">[global]&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>
&lt;p>Sobald ein User am Backend angemeldet ist, wird die CSS-Datei admin_panel.css in die Seite eingebunden.&lt;/p></content><category scheme="https://www.krausmueller.de/tags/typo3" term="typo3" label="typo3"/></entry><entry><title>Parameter an PowerShell Script übergeben</title><link href="https://www.krausmueller.de/2015/11/26/powershell-parameter/" rel="alternate" type="text/html" hreflang="de"/><id>https://www.krausmueller.de/2015/11/26/powershell-parameter/</id><published>2015-11-26T00:00:00+00:00</published><updated>2015-11-26T00:00:00+00:00</updated><content type="html">
&lt;p>Um einem PowerShell Script Parameter übergeben zu können müssen diese vorher definiert werden. Dabei legt man auch den Datentyp des Parameters fest. Ein kleines Beispiel verdeutlicht es denke ich am besten:&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;span class="lnt">11
&lt;/span>&lt;span class="lnt">12
&lt;/span>&lt;span class="lnt">13
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-powershell" data-lang="powershell">&lt;span class="line">&lt;span class="cl">&lt;span class="c"># Definition der Parameter&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">Param&lt;/span>&lt;span class="p">(&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="no">[string]&lt;/span>&lt;span class="nv">$StringParameter&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="no">[bool]&lt;/span>&lt;span class="nv">$BooleanParameter&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="nv">$False&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="no">[int]&lt;/span>&lt;span class="nv">$IntegerParameter&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="n">10&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="no">[switch]&lt;/span>&lt;span class="nv">$SwitchParameter&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c"># Ausgabe der Parameter&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">Write-host&lt;/span> &lt;span class="s2">&amp;#34;StringParameter: $StringParameter&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">Write-host&lt;/span> &lt;span class="s2">&amp;#34;BooleanParameter: $BooleanParameter&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">Write-host&lt;/span> &lt;span class="s2">&amp;#34;IntegerParameter: $IntegerParameter&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">Write-host&lt;/span> &lt;span class="s2">&amp;#34;SwitchParameter: $SwitchParameter&amp;#34;&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>
&lt;p>Mehrere Parameter werden durch Komma getrennt, nach dem letzten Parameter folgt kein Komma. Es können auch gleich Werte zugewiesen werden (im Beispiel $BooleanParameter und $IntegerParameter) die durch den übergebenen Parameter überschrieben werden. Wird ein Parameter beim Aufruf nicht angegeben, gilt der zugewiesene Wert. Statt eines Parameters mit dem Typ Boolean kann auch der Typ Switch verwendet werden. Mit Switch ist die Variable &amp;ldquo;True&amp;rdquo; sobald sie im Aufruf vorhanden ist (es reicht also ein &amp;ldquo;-SwitchParameter&amp;rdquo; anstatt &amp;ldquo;-SwitchParameter:$True&amp;rdquo;).&lt;/p>
&lt;p>Ein Aufruf und die Ausgabe könnte dann so aussehen:&lt;/p>
&lt;pre class="psconsole">
PS C:\> .\PowerShellParameter.ps1 -StringParameter "Text" -BooleanParameter $True
StringParameter: Text
BooleanParameter: True
IntegerParameter: 10
SwitchParameter: False
&lt;/pre>
&lt;p>Außerdem kann definiert werden das bestimmte Parameter unbedingt angegeben werden müssen:&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;span class="lnt">11
&lt;/span>&lt;span class="lnt">12
&lt;/span>&lt;span class="lnt">13
&lt;/span>&lt;span class="lnt">14
&lt;/span>&lt;span class="lnt">15
&lt;/span>&lt;span class="lnt">16
&lt;/span>&lt;span class="lnt">17
&lt;/span>&lt;span class="lnt">18
&lt;/span>&lt;span class="lnt">19
&lt;/span>&lt;span class="lnt">20
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-powershell" data-lang="powershell">&lt;span class="line">&lt;span class="cl">&lt;span class="c"># Definition der Parameter&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">Param&lt;/span>&lt;span class="p">(&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">[&lt;/span>&lt;span class="k">Parameter&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="k">Mandatory&lt;/span>&lt;span class="p">=&lt;/span>&lt;span class="nv">$True&lt;/span>&lt;span class="p">)]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="no">[string]&lt;/span>&lt;span class="nv">$StringParameter&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">[&lt;/span>&lt;span class="k">Parameter&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="k">Mandatory&lt;/span>&lt;span class="p">=&lt;/span>&lt;span class="nv">$False&lt;/span>&lt;span class="p">)]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="no">[bool]&lt;/span>&lt;span class="nv">$BooleanParameter&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="nv">$False&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">[&lt;/span>&lt;span class="k">Parameter&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="k">Mandatory&lt;/span>&lt;span class="p">=&lt;/span>&lt;span class="nv">$False&lt;/span>&lt;span class="p">)]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="no">[int]&lt;/span>&lt;span class="nv">$IntegerParameter&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="n">10&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">[&lt;/span>&lt;span class="k">Parameter&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="k">Mandatory&lt;/span>&lt;span class="p">=&lt;/span>&lt;span class="nv">$False&lt;/span>&lt;span class="p">)]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="no">[switch]&lt;/span>&lt;span class="nv">$SwitchParameter&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c"># Ausgabe der Parameter&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">Write-host&lt;/span> &lt;span class="s2">&amp;#34;StringParameter: $StringParameter&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">Write-host&lt;/span> &lt;span class="s2">&amp;#34;BooleanParameter: $BooleanParameter&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">Write-host&lt;/span> &lt;span class="s2">&amp;#34;IntegerParameter: $IntegerParameter&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">Write-host&lt;/span> &lt;span class="s2">&amp;#34;SwitchParameter: $SwitchParameter&amp;#34;&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>
&lt;p>Durch &amp;ldquo;(Mandatory=$True)&amp;rdquo; wird festgelegt, dass der Parameter angebeben werden muss (Zeile 3). Bei &amp;ldquo;$False&amp;rdquo; kann der Parameter angegeben werden, muss er aber nicht. Muss ein Parameter nicht angegeben werden ist es meist sinnvoll ihn wie schon im 1. Beispiel mit einem Default-Wert zu belegen (Zeile 7 und 10).&lt;/p>
&lt;p>Wird im Beispiel &amp;ldquo;$StringParameter&amp;rdquo; nicht angegeben wird er von PowerShell abgefragt:&lt;/p>
&lt;pre class="psconsole">
PS C:\> .\PowerShellParameter.ps1 -BooleanParameter $True
cmdlet PowerShellParameter.ps1 at command pipeline position 1
Supply values for the following parameters:
StringParameter:
&lt;/pre></content><category scheme="https://www.krausmueller.de/tags/powershell" term="powershell" label="powershell"/></entry></feed>