Was ist Ansible?
Zusätzlich zu dem Artikel über die PeerVPN-Installation und -Konfiguration zeige ich Ihnen nun eine fortschrittlichere und ziemlich "moderne" Methode, um mehrere Server bereitzustellen und Ihren VPN-Client wirklich schnell zum Laufen zu bringen. Sie haben wahrscheinlich schon von Ansible gehört. Nun, einer seiner Anwendungsfälle ist genau das, was wir hier brauchen: Configuration Manager. Viele von uns haben schon einmal Kopfschmerzen gehabt, wenn wir eine ganze Umgebung installieren, konfigurieren und dann verwalten müssen. Ja, die gleichen Schritte auf Hunderten von Servern zu wiederholen, auf denen unterschiedliche Betriebssysteme, Anwendungsversionen und alle Arten von Abhängigkeiten vorhanden sind, führt sicherlich zu einigen Problemen.
Erfahren Sie mehr über Ansible
Lesen Sie unseren umfassenden Einsteigerleitfaden zu Ansible und lernen Sie alle Grundlagen!
Nun, Ansible ist hier, um Ihnen bei all diesen Dingen zu helfen. Sie können alles auswählen, einstellen und anpassen, was für eine bestimmte Umgebung erforderlich ist und deren Anforderungen entspricht. Beginnen wir also mit einer Einführung in Ansible, seine Struktur und seine Komponenten.
Meiner Meinung nach gibt es zwei Ansätze, wenn man mit Ansible anfängt. Die erste ist, die offizielle Einführung in Ansible zu lesen, in der viel über die Struktur von Ansible erklärt wird, und dann mit einem einfachen Playbook zu beginnen, das man dann zu einer Rolle erweitert. Oder Sie nutzen die Ansible-Galaxie, in der viele von der Community bereitgestellte Rollen zur Verfügung stehen. Nun, nicht jede Rolle ist so skalierbar und flexibel, wie Sie es wünschen, also können Sie einfach beide Ansätze kombinieren, eine bereits erstellte Rolle nehmen und ihre Funktionalitäten erweitern. Wenn Sie das schnell gelernt haben und das alles langweilig ist, können Sie anfangen, Ihre eigenen Ansible-Module zu bauen.
Werfen wir nun einen Blick auf meine PeerVPN-Rolle.
Die Verzeichnisstruktur:
roles/ PeerVPN/ # this hierarchy represents a "role" tasks/ # main.yml # <-- the main. yml file task file includes install.yml + configure.yml install.yml # configure.yml # templates/ # <-- files for use with the template resource peervpn.service.j2 # <---templates end in .j2, moved in a certain location peervpn.conf.j2 # defaults/ # main.yml # <-- default lower priority variables for this
Aufgaben/main.yml:
- include: install.yml
- include: configure.yml
- service: name=peervpn state=started
Tasks/install.yml (Achten Sie auf die Leerzeichen am Anfang der Zeile):
- name: install dependencies
yum:
name: "{{ item }}"
state: latest
with_items:
- gcc
- openssl-devel
- openssl
- python-urllib3
- pyOpenSSL
when: ansible_os_family == "RedHat"
- name: downloading PeerVPN
unarchive: src=https://www.peervpn.net/files/peervpn-0-044-linux-x86.tar.gz dest=/tmp/ remote_src=yes
- name: moving extracted files [binary + config]
command: /usr/bin/mv /tmp/peervpn-0-044/peervpn /usr/sbin/peervpn
when: ansible_os_family == "RedHat"
Tasks/configure.yml (Achten Sie auf die Leerzeichen am Anfang der Zeile):
- name: create configuration directory
file:
path: /etc/peervpn
state: directory
- name: write the peervpn config file
template: src=../templates/peervpn.conf.j2 dest=/etc/peervpn/peervpn.conf
- name: create peervpn service
template: src=../templates/peervpn.service.j2 dest=/usr/lib/systemd/system/peervpn.service
when: ansible_os_family == "RedHat"
Templates/peervpn.service.j2:
[Unit]
Description={{ unit_description }}
{% if vpn_initpeers -%}
Requires={{ unit_requires }}
{% endif -%}
After={{ unit_after }}
ConditionPathExists={{ unit_condition_path }}
[Service]
Type={{ service_type }}
ExecStart={{ service_exec }}
PIDFile={{ service_pidfile }}
[Install]
WantedBy={{ install_wantedby }}
Vorlagen/peervpn.conf.j2:
port {{ peervpn_port }}
networkname {{ peervpn_networkname }}
psk {{ peervpn_password }}
enabletunneling {{ peevpn_enabletunneling }}
interface {{ peervpn_interface }}
ifconfig4 {{ peervpn_ip }}
{% if vpn_initpeers -%}
initpeers {{ vpn_initpeers }}
{% endif -%}
Defaults/main.yml:
peervpn_port: 7000
peervpn_networkname: MyPeerVPN
peervpn_password: VqmWsJje18/qqIOEN2+pLHugDtAcN5So03J0TL9wIQomAkQwcNR23SzM+m7cuJyCeyXXuHDLoKbzVbk176eDVLPS8wLNoWSiwPF2yQn57Q4vjRz3qjI51nhE3yEyKmHZgotQga4Uz0vyvTGjJRxtPJqZ/igDN0YmI25nwhsYsyi34c6pIcqPCOHYlILndCUh8AYk3hGNPc0lSnkxW/sY+Uo+5BU0K6nB1LYcMlXA9Ij0deU+eyRTfoVggKnpXdl5FikrELbAOyoo71F0PEjL73k5fmyGmsoEE1f4yvgUXOKOzsPUaf567SP4Hm+h/EpqkWMR7JGc5jBDsOlY52LTp5XaZNn+l+VEInCsFQiKgTW3zvzSmUcrPB3GqQ1KXknwfHmtCJe4SRiRZLKtSeTiPdPvXC0HBMk+KK9TNk45dDUi3/ougCIwavMPEedH7Gh5fvG5iNXjZ24tAAOTle2oBHVgO2Wq7llh2VwKkrzyYATuchusVLbHa98D0YR2wA==
peevpn_enabletunneling: "yes"
peervpn_interface: pvpn0
peervpn_ip: 0.0.0.0
vpn_initpeers: false
unit_description: PeerVPN
unit_requires: network.target
unit_after: syslog.target network.target
unit_condition_path: /etc/peervpn/peervpn.conf
service_type: simple
service_exec: /usr/sbin/peervpn {{ unit_condition_path }}
service_pidfile: /var/run/peervpn/peervpn.pid
install_wantedby: multi-user.target
So, jetzt haben wir die Rolle. Es fehlen nur noch das Playbook und die Inventardatei. Die Inventarisierungsdatei kann übersprungen werden (Sie können die Hosts als Argumente parsen, wenn Sie den Befehl ausführen) oder Ihre Zielhosts können in der Standard-Ansible-Inventarisierungsdatei in /etc/ansible/hosts abgelegt werden. Hier ist ein Beispiel für ein Playbook, das 2 Hosts provisioniert:
playbook.yml:
- name: Configuring and installing PeerVPN init peer
hosts: VPN_init_peer
remote_user: root
vars:
peervpn_ip: 10.1.0.1/24
roles:
- PeerVPN
- name: Configuring and installing PeerVPN other peers
hosts: Host_1
remote_user: root
vars:
peervpn_ip: 10.1.0.2/24
vpn_initpeers: "{{ groups.VPN_init_peer[0] }} {{ peervpn_port }}"
roles:
- PeerVPN
Beachten Sie, dass ich eine Inventardatei für die Speicherung der Hosts verwende:
Inventory.yml:
[VPN_init_peer]
165.165.165.165
[Host_1]
170.170.170.170
To provision more hosts you need to simply add [Host_<2/3/4..etc>] and an IP in your inventory file and add accordingly paragraph(s) to the playbook file, with different peervpn_ip and hosts.
Um das obige Beispiel auszuführen, müssen Sie Ihre öffentlichen Schlüssel auf den Zielhosts verteilt haben, da Ansible standardmäßig über SSH arbeitet. Führen Sie nun einfach den folgenden Befehl in dem Verzeichnis aus, in dem sich Ihr Playbook befindet:
$ ansible-playbook playbook.yml -i inventory.yml

