Inhaltsverzeichnis
Ansible
ist eine Open-Source-Software zur Automatisierung, Orchestrierung und Konfiguration von Serversystemen. Mit Ansible erfolgt die Verwaltung von Servern unter anderem über SSH und erfordert keinerlei zusätzliche Software auf dem zu verwaltenden System. Die Ausgabe erfolgt im JSON-Format und Module können in jeder beliebigen Programmiersprache geschrieben sein. Das System nutzt überwiegend YAML zur Konfiguration von wiederverwendbarer Beschreibungen der Systeme.
Beschreibung | Externer Link |
---|---|
Homepage | https://www.ansible.com/ |
Dokumentation | https://docs.ansible.com/ |
Installation | https://releases.ansible.com/ansible/rpm/ |
Ab hier werden root
-Rechte zur Ausführung der nachfolgenden Befehle benötigt. Um der Benutzer root
zu werden, geben Sie bitte nachfolgenden Befehl ein:
$ su - Password:
Vorbereitung
Zur Installation von Ansible über ein rpm
-Paket, soll hier das Repository eines Drittanbieters genutzt werden, da Ansible nicht im CentOS-Repository enthalten ist.
Nachfolgend soll das Repository des Drittanbieters EPEL genutzt werden. Eine Anleitung, wie das Repository des Drittanbieters EPEL eingebunden werden könnte, kann unter nachfolgendem internen Link nachgelesen werden:
Installation
CentOS
Zur Installation von Ansible wird nachfolgendes Paket benötigt:
policycoreutils-python-utils
- ist imBaseOS
-Repository enthalten - und ist erforderlich, wenn SELinux-Konfigurationen in Playbooks durchgeführt werden sollen.
Mit nachfolgendem Befehl, wird das Pakete ansible
installiert:
# dnf install ansible Last metadata expiration check: 0:05:02 ago on Sa 21 Dez 2019 07:52:47 CET. Dependencies resolved. ================================================================================ Package Arch Version Repository Size ================================================================================ Installing: ansible noarch 2.8.5-2.el8 epel 15 M Installing dependencies: python3-pyyaml x86_64 3.12-12.el8 BaseOS 193 k python3-setuptools noarch 39.2.0-4.el8 BaseOS 162 k libsodium x86_64 1.0.18-2.el8 epel 162 k python3-bcrypt x86_64 3.1.6-2.el8.1 epel 44 k python3-pynacl x86_64 1.3.0-5.el8 epel 100 k sshpass x86_64 1.06-9.el8 epel 27 k python3-babel noarch 2.5.1-3.el8 AppStream 4.8 M python3-jinja2 noarch 2.10.1-2.el8_0 AppStream 538 k python3-jmespath noarch 0.9.0-11.el8 AppStream 45 k python3-markupsafe x86_64 0.23-19.el8 AppStream 39 k python3-pyasn1 noarch 0.3.7-6.el8 AppStream 126 k python3-pytz noarch 2017.2-9.el8 AppStream 54 k Installing weak dependencies: python3-paramiko noarch 2.4.3-1.el8 epel 289 k Transaction Summary ================================================================================ Install 14 Packages Total download size: 21 M Installed size: 105 M Is this ok [y/N]: y Downloading Packages: (1/14): python3-setuptools-39.2.0-4.el8.noarch. 122 kB/s | 162 kB 00:01 (2/14): python3-pyyaml-3.12-12.el8.x86_64.rpm 143 kB/s | 193 kB 00:01 (3/14): python3-bcrypt-3.1.6-2.el8.1.x86_64.rpm 109 kB/s | 44 kB 00:00 (4/14): libsodium-1.0.18-2.el8.x86_64.rpm 316 kB/s | 162 kB 00:00 (5/14): python3-pynacl-1.3.0-5.el8.x86_64.rpm 381 kB/s | 100 kB 00:00 (6/14): sshpass-1.06-9.el8.x86_64.rpm 199 kB/s | 27 kB 00:00 (7/14): python3-paramiko-2.4.3-1.el8.noarch.rpm 465 kB/s | 289 kB 00:00 (8/14): python3-jinja2-2.10.1-2.el8_0.noarch.rp 270 kB/s | 538 kB 00:01 (9/14): python3-jmespath-0.9.0-11.el8.noarch.rp 202 kB/s | 45 kB 00:00 (10/14): python3-markupsafe-0.23-19.el8.x86_64. 170 kB/s | 39 kB 00:00 (11/14): python3-pyasn1-0.3.7-6.el8.noarch.rpm 252 kB/s | 126 kB 00:00 (12/14): python3-pytz-2017.2-9.el8.noarch.rpm 207 kB/s | 54 kB 00:00 (13/14): python3-babel-2.5.1-3.el8.noarch.rpm 407 kB/s | 4.8 MB 00:12 (14/14): ansible-2.8.5-2.el8.noarch.rpm 923 kB/s | 15 MB 00:16 -------------------------------------------------------------------------------- Total 1.1 MB/s | 21 MB 00:19 warning: /var/cache/dnf/epel-6519ee669354a484/packages/ansible-2.8.5-2.el8.noarch.rpm: Header V3 RSA/SHA256 Signature, key ID 2f86d6a1: NOKEY Extra Packages for Enterprise Linux 8 - x86_64 1.6 MB/s | 1.6 kB 00:00 Importing GPG key 0x2F86D6A1: Userid : "Fedora EPEL (8) <epel@fedoraproject.org>" Fingerprint: 94E2 79EB 8D8F 25B2 1810 ADF1 21EA 45AB 2F86 D6A1 From : /etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-8 Is this ok [y/N]: y Key imported successfully Running transaction check Transaction check succeeded. Running transaction test Transaction test succeeded. Running transaction Preparing : 1/1 Installing : python3-jmespath-0.9.0-11.el8.noarch 1/14 Installing : python3-setuptools-39.2.0-4.el8.noarch 2/14 Installing : python3-pytz-2017.2-9.el8.noarch 3/14 Installing : python3-babel-2.5.1-3.el8.noarch 4/14 Installing : python3-pyasn1-0.3.7-6.el8.noarch 5/14 Installing : python3-markupsafe-0.23-19.el8.x86_64 6/14 Installing : python3-jinja2-2.10.1-2.el8_0.noarch 7/14 Installing : sshpass-1.06-9.el8.x86_64 8/14 Installing : python3-bcrypt-3.1.6-2.el8.1.x86_64 9/14 Installing : libsodium-1.0.18-2.el8.x86_64 10/14 Installing : python3-pynacl-1.3.0-5.el8.x86_64 11/14 Installing : python3-paramiko-2.4.3-1.el8.noarch 12/14 Installing : python3-pyyaml-3.12-12.el8.x86_64 13/14 Installing : ansible-2.8.5-2.el8.noarch 14/14 Running scriptlet: ansible-2.8.5-2.el8.noarch 14/14 Verifying : python3-pyyaml-3.12-12.el8.x86_64 1/14 Verifying : python3-setuptools-39.2.0-4.el8.noarch 2/14 Verifying : ansible-2.8.5-2.el8.noarch 3/14 Verifying : libsodium-1.0.18-2.el8.x86_64 4/14 Verifying : python3-bcrypt-3.1.6-2.el8.1.x86_64 5/14 Verifying : python3-paramiko-2.4.3-1.el8.noarch 6/14 Verifying : python3-pynacl-1.3.0-5.el8.x86_64 7/14 Verifying : sshpass-1.06-9.el8.x86_64 8/14 Verifying : python3-babel-2.5.1-3.el8.noarch 9/14 Verifying : python3-jinja2-2.10.1-2.el8_0.noarch 10/14 Verifying : python3-jmespath-0.9.0-11.el8.noarch 11/14 Verifying : python3-markupsafe-0.23-19.el8.x86_64 12/14 Verifying : python3-pyasn1-0.3.7-6.el8.noarch 13/14 Verifying : python3-pytz-2017.2-9.el8.noarch 14/14 Installed: ansible-2.8.5-2.el8.noarch python3-paramiko-2.4.3-1.el8.noarch python3-pyyaml-3.12-12.el8.x86_64 python3-setuptools-39.2.0-4.el8.noarch libsodium-1.0.18-2.el8.x86_64 python3-bcrypt-3.1.6-2.el8.1.x86_64 python3-pynacl-1.3.0-5.el8.x86_64 sshpass-1.06-9.el8.x86_64 python3-babel-2.5.1-3.el8.noarch python3-jinja2-2.10.1-2.el8_0.noarch python3-jmespath-0.9.0-11.el8.noarch python3-markupsafe-0.23-19.el8.x86_64 python3-pyasn1-0.3.7-6.el8.noarch python3-pytz-2017.2-9.el8.noarch Complete!
Mit nachfolgendem Befehl kann überprüft werden, welche Inhalte mit dem Paket ansible
installiert wurden.
# rpm -qil ansible Name : ansible Version : 2.8.5 Release : 2.el8 Architecture: noarch Install Date: Sa 21 Dez 2019 07:58:44 CET Group : Unspecified Size : 82465568 License : GPLv3+ Signature : RSA/SHA256, Fr 11 Okt 2019 02:18:24 CEST, Key ID 21ea45ab2f86d6a1 Source RPM : ansible-2.8.5-2.el8.src.rpm Build Date : Fr 11 Okt 2019 02:09:46 CEST Build Host : buildvm-20.phx2.fedoraproject.org Relocations : (not relocatable) Packager : Fedora Project Vendor : Fedora Project URL : http://ansible.com Bug URL : https://bugz.fedoraproject.org/ansible Summary : SSH-based configuration management, deployment, and task execution system Description : Ansible is a radically simple model-driven configuration management, multi-node deployment, and remote task execution system. Ansible works over SSH and does not require any software or daemons to be installed on remote nodes. Extension modules can be written in any language and are transferred to managed machines automatically. /etc/ansible /etc/ansible/ansible.cfg /etc/ansible/hosts /etc/ansible/roles /usr/bin/ansible /usr/bin/ansible-config /usr/bin/ansible-connection /usr/bin/ansible-console /usr/bin/ansible-doc /usr/bin/ansible-galaxy /usr/bin/ansible-inventory /usr/bin/ansible-playbook /usr/bin/ansible-pull /usr/bin/ansible-vault ...
Mit nachfolgendem Befehl, wird das Pakete policycoreutils-python-utils
installiert:
# dnf install policycoreutils-python-utils Last metadata expiration check: 0:05:29 ago on Fri 27 Mar 2020 08:05:25 AM CET. Dependencies resolved. ================================================================================ Package Arch Version Repo Size ================================================================================ Installing: policycoreutils-python-utils noarch 2.9-3.el8_1.1 BaseOS 250 k Installing dependencies: checkpolicy x86_64 2.9-1.el8 BaseOS 348 k python3-audit x86_64 3.0-0.10.20180831git0047a6c.el8 BaseOS 85 k python3-libsemanage x86_64 2.9-1.el8 BaseOS 127 k python3-policycoreutils noarch 2.9-3.el8_1.1 BaseOS 2.2 M python3-setools x86_64 4.2.2-1.el8 BaseOS 600 k Transaction Summary ================================================================================ Install 6 Packages Total download size: 3.6 M Installed size: 11 M Is this ok [y/N]: y Downloading Packages: (1/6): python3-audit-3.0-0.10.20180831git0047a6 43 kB/s | 85 kB 00:01 (2/6): python3-libsemanage-2.9-1.el8.x86_64.rpm 302 kB/s | 127 kB 00:00 (3/6): policycoreutils-python-utils-2.9-3.el8_1 98 kB/s | 250 kB 00:02 (4/6): checkpolicy-2.9-1.el8.x86_64.rpm 128 kB/s | 348 kB 00:02 (5/6): python3-setools-4.2.2-1.el8.x86_64.rpm 548 kB/s | 600 kB 00:01 (6/6): python3-policycoreutils-2.9-3.el8_1.1.no 891 kB/s | 2.2 MB 00:02 -------------------------------------------------------------------------------- Total 665 kB/s | 3.6 MB 00:05 Running transaction check Transaction check succeeded. Running transaction test Transaction test succeeded. Running transaction Preparing : 1/1 Installing : python3-setools-4.2.2-1.el8.x86_64 1/6 Installing : python3-libsemanage-2.9-1.el8.x86_64 2/6 Installing : python3-audit-3.0-0.10.20180831git0047a6c.el8.x86_64 3/6 Installing : checkpolicy-2.9-1.el8.x86_64 4/6 Installing : python3-policycoreutils-2.9-3.el8_1.1.noarch 5/6 Installing : policycoreutils-python-utils-2.9-3.el8_1.1.noarch 6/6 Running scriptlet: policycoreutils-python-utils-2.9-3.el8_1.1.noarch 6/6 Verifying : checkpolicy-2.9-1.el8.x86_64 1/6 Verifying : policycoreutils-python-utils-2.9-3.el8_1.1.noarch 2/6 Verifying : python3-audit-3.0-0.10.20180831git0047a6c.el8.x86_64 3/6 Verifying : python3-libsemanage-2.9-1.el8.x86_64 4/6 Verifying : python3-policycoreutils-2.9-3.el8_1.1.noarch 5/6 Verifying : python3-setools-4.2.2-1.el8.x86_64 6/6 Installed: policycoreutils-python-utils-2.9-3.el8_1.1.noarch checkpolicy-2.9-1.el8.x86_64 python3-audit-3.0-0.10.20180831git0047a6c.el8.x86_64 python3-libsemanage-2.9-1.el8.x86_64 python3-policycoreutils-2.9-3.el8_1.1.noarch python3-setools-4.2.2-1.el8.x86_64 Complete!
Mit nachfolgendem Befehl kann überprüft werden, welche Inhalte mit dem Paket policycoreutils-python-utils
installiert wurden.
# rpm -qil policycoreutils-python-utils Name : policycoreutils-python-utils Version : 2.9 Release : 3.el8_1.1 Architecture: noarch Install Date: Fri 27 Mar 2020 08:11:05 AM CET Group : Unspecified Size : 139789 License : GPLv2 Signature : RSA/SHA256, Wed 05 Feb 2020 01:09:20 AM CET, Key ID 05b555b38483c65d Source RPM : policycoreutils-2.9-3.el8_1.1.src.rpm Build Date : Tue 04 Feb 2020 08:03:14 PM CET Build Host : aah11.rdu2.centos.org Relocations : (not relocatable) Packager : CentOS Buildsys <bugs@centos.org> Vendor : CentOS URL : https://github.com/SELinuxProject/selinux Summary : SELinux policy core python utilities Description : The policycoreutils-python-utils package contains the management tools use to manage an SELinux environment. /etc/dbus-1/system.d/org.selinux.conf /usr/bin/audit2allow /usr/bin/audit2why /usr/bin/chcat /usr/bin/sandbox /usr/sbin/semanage /usr/share/bash-completion/completions/semanage /usr/share/man/man1/audit2allow.1.gz /usr/share/man/man1/audit2why.1.gz /usr/share/man/man8/chcat.8.gz /usr/share/man/man8/sandbox.8.gz /usr/share/man/man8/semanage-boolean.8.gz /usr/share/man/man8/semanage-dontaudit.8.gz /usr/share/man/man8/semanage-export.8.gz /usr/share/man/man8/semanage-fcontext.8.gz /usr/share/man/man8/semanage-ibendport.8.gz /usr/share/man/man8/semanage-ibpkey.8.gz /usr/share/man/man8/semanage-import.8.gz /usr/share/man/man8/semanage-interface.8.gz /usr/share/man/man8/semanage-login.8.gz /usr/share/man/man8/semanage-module.8.gz /usr/share/man/man8/semanage-node.8.gz /usr/share/man/man8/semanage-permissive.8.gz /usr/share/man/man8/semanage-port.8.gz /usr/share/man/man8/semanage-user.8.gz /usr/share/man/man8/semanage.8.gz /usr/share/man/ru/man1/audit2allow.1.gz /usr/share/man/ru/man1/audit2why.1.gz /usr/share/man/ru/man8/chcat.8.gz /usr/share/man/ru/man8/sandbox.8.gz /usr/share/man/ru/man8/semanage-boolean.8.gz /usr/share/man/ru/man8/semanage-dontaudit.8.gz /usr/share/man/ru/man8/semanage-export.8.gz /usr/share/man/ru/man8/semanage-fcontext.8.gz /usr/share/man/ru/man8/semanage-ibendport.8.gz /usr/share/man/ru/man8/semanage-ibpkey.8.gz /usr/share/man/ru/man8/semanage-import.8.gz /usr/share/man/ru/man8/semanage-interface.8.gz /usr/share/man/ru/man8/semanage-login.8.gz /usr/share/man/ru/man8/semanage-module.8.gz /usr/share/man/ru/man8/semanage-node.8.gz /usr/share/man/ru/man8/semanage-permissive.8.gz /usr/share/man/ru/man8/semanage-port.8.gz /usr/share/man/ru/man8/semanage-user.8.gz /usr/share/man/ru/man8/semanage.8.gz
Zum Abschluss kann mit nachfolgendem Befehl überprüft werden, ob ein Aufruf möglich ist und Ansible nutzbar ist:
# ansible --version ansible 2.8.5 config file = /etc/ansible/ansible.cfg configured module search path = ['/root/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules'] ansible python module location = /usr/lib/python3.6/site-packages/ansible executable location = /usr/bin/ansible python version = 3.6.8 (default, Oct 7 2019, 17:58:22) [GCC 8.2.1 20180905 (Red Hat 8.2.1-3)]
ArchLinux
Mit nachfolgendem Befehl, wird das Pakete ansible
installiert:
# pacman -S ansible --noconfirm resolving dependencies... looking for conflicting packages... Packages (24) libnsl-1.2.0-2 libsodium-1.0.18-1 libyaml-0.2.2-1 python-3.8.1-1 python-appdirs-1.4.3-5 python-asn1crypto-1.2.0-3 python-bcrypt-3.1.7-3 python-cffi-1.13.2-2 python-cryptography-2.8-1 python-idna-2.8-3 python-jinja-2.10.3-3 python-markupsafe-1.1.1-3 python-ordered-set-3.1.1-1 python-packaging-19.2-5 python-paramiko-2.6.0-3 python-ply-3.11-4 python-pyasn1-0.4.8-1 python-pycparser-2.19-3 python-pynacl-1.3.0-3 python-pyparsing-2.4.6-1 python-setuptools-1:43.0.0-1 python-six-1.13.0-2 python-yaml-5.1.2-3 ansible-2.9.2-1 Total Download Size: 52.42 MiB Total Installed Size: 307.49 MiB :: Proceed with installation? [Y/n] :: Retrieving packages... libnsl-1.2.0-2-x... 57.4 KiB 660 KiB/s 00:00 [######################] 100% python-3.8.1-1-x... 37.2 MiB 1294 KiB/s 00:29 [######################] 100% libyaml-0.2.2-1-... 54.7 KiB 1656 KiB/s 00:00 [######################] 100% python-ply-3.11-... 73.3 KiB 1559 KiB/s 00:00 [######################] 100% python-pycparser... 164.2 KiB 1493 KiB/s 00:00 [######################] 100% python-cffi-1.13... 210.1 KiB 1501 KiB/s 00:00 [######################] 100% python-six-1.13.... 20.9 KiB 1496 KiB/s 00:00 [######################] 100% python-idna-2.8-... 66.4 KiB 1443 KiB/s 00:00 [######################] 100% python-appdirs-1... 14.2 KiB 2033 KiB/s 00:00 [######################] 100% python-pyparsing... 110.4 KiB 1512 KiB/s 00:00 [######################] 100% python-packaging... 38.9 KiB 1692 KiB/s 00:00 [######################] 100% python-ordered-s... 12.5 KiB 959 KiB/s 00:00 [######################] 100% python-setuptool... 296.1 KiB 1410 KiB/s 00:00 [######################] 100% python-asn1crypt... 163.9 KiB 1490 KiB/s 00:00 [######################] 100% python-cryptogra... 340.7 KiB 1420 KiB/s 00:00 [######################] 100% python-pyasn1-0.... 108.2 KiB 1546 KiB/s 00:00 [######################] 100% python-markupsaf... 22.4 KiB 1320 KiB/s 00:00 [######################] 100% python-yaml-5.1.... 177.2 KiB 1441 KiB/s 00:00 [######################] 100% python-bcrypt-3.... 30.1 KiB 1309 KiB/s 00:00 [######################] 100% libsodium-1.0.18... 158.6 KiB 1482 KiB/s 00:00 [######################] 100% python-pynacl-1.... 76.1 KiB 1522 KiB/s 00:00 [######################] 100% python-paramiko-... 247.7 KiB 1424 KiB/s 00:00 [######################] 100% python-jinja-2.1... 199.2 KiB 1364 KiB/s 00:00 [######################] 100% ansible-2.9.2-1-any 12.7 MiB 1342 KiB/s 00:10 [######################] 100% (24/24) checking keys in keyring [######################] 100% (24/24) checking package integrity [######################] 100% (24/24) loading package files [######################] 100% (24/24) checking for file conflicts [######################] 100% (24/24) checking available disk space [######################] 100% :: Processing package changes... ( 1/24) installing libnsl [######################] 100% ( 2/24) installing python [######################] 100% Optional dependencies for python python-setuptools [pending] python-pip sqlite [installed] mpdecimal: for decimal xz: for lzma [installed] tk: for tkinter ( 3/24) installing libyaml [######################] 100% ( 4/24) installing python-yaml [######################] 100% ( 5/24) installing python-ply [######################] 100% ( 6/24) installing python-pycparser [######################] 100% ( 7/24) installing python-cffi [######################] 100% ( 8/24) installing python-six [######################] 100% ( 9/24) installing python-bcrypt [######################] 100% (10/24) installing python-idna [######################] 100% (11/24) installing python-appdirs [######################] 100% (12/24) installing python-pyparsing [######################] 100% (13/24) installing python-packaging [######################] 100% (14/24) installing python-ordered-set [######################] 100% (15/24) installing python-setuptools [######################] 100% (16/24) installing python-asn1crypto [######################] 100% (17/24) installing python-cryptography [######################] 100% (18/24) installing python-pyasn1 [######################] 100% (19/24) installing libsodium [######################] 100% (20/24) installing python-pynacl [######################] 100% (21/24) installing python-paramiko [######################] 100% (22/24) installing python-markupsafe [######################] 100% (23/24) installing python-jinja [######################] 100% Optional dependencies for python-jinja python-babel: for i18n support (24/24) installing ansible [######################] 100% Optional dependencies for ansible sshpass: for ssh connections with password python-passlib: crypt values for vars_prompt python-pyopenssl: openssl modules python-netaddr: for the ipaddr filter python-systemd: log to journal python-pywinrm: connect to Windows machines python-dnspython: for dig lookup python-ovirt-engine-sdk: ovirt support python-boto3: aws_s3 module python-jmespath: json_query support acme-tiny: openssl_certificate module :: Running post-transaction hooks... (1/1) Arming ConditionNeedsUpdate...
Mit nachfolgendem Befehl kann überprüft werden, welche Inhalte mit dem Paket ansible
installiert wurden.
# pacman -Ql ansible ansible /etc/ ansible /etc/ansible/ ansible /etc/ansible/ansible.cfg ansible /usr/ ansible /usr/bin/ ansible /usr/bin/ansible ansible /usr/bin/ansible-config ansible /usr/bin/ansible-connection ansible /usr/bin/ansible-console ansible /usr/bin/ansible-doc ansible /usr/bin/ansible-galaxy ansible /usr/bin/ansible-inventory ansible /usr/bin/ansible-playbook ansible /usr/bin/ansible-pull ansible /usr/bin/ansible-test ansible /usr/bin/ansible-vault ansible /usr/lib/ ansible /usr/lib/python3.8/ ... [Kürzung der Ausgabe] ... ansible /usr/share/ ansible /usr/share/ansible/ ansible /usr/share/ansible/doc/ ansible /usr/share/ansible/doc/examples/ ansible /usr/share/ansible/doc/examples/ansible.cfg ansible /usr/share/ansible/doc/examples/hosts ansible /usr/share/ansible/doc/examples/scripts/ ansible /usr/share/ansible/doc/examples/scripts/ConfigureRemotingForAnsible.ps1 ansible /usr/share/ansible/doc/examples/scripts/upgrade_to_ps3.ps1 ansible /usr/share/doc/ ansible /usr/share/doc/ansible/ ansible /usr/share/doc/ansible/COPYING ansible /usr/share/man/ ansible /usr/share/man/man1/ ansible /usr/share/man/man1/ansible-config.1.gz ansible /usr/share/man/man1/ansible-console.1.gz ansible /usr/share/man/man1/ansible-doc.1.gz ansible /usr/share/man/man1/ansible-galaxy.1.gz ansible /usr/share/man/man1/ansible-inventory.1.gz ansible /usr/share/man/man1/ansible-playbook.1.gz ansible /usr/share/man/man1/ansible-pull.1.gz ansible /usr/share/man/man1/ansible-vault.1.gz ansible /usr/share/man/man1/ansible.1.gz
Zum Abschluss kann mit nachfolgendem Befehl überprüft werden, ob ein Aufruf möglich ist und Ansible nutzbar ist:
# ansible --version ansible 2.9.2 config file = /etc/ansible/ansible.cfg configured module search path = ['/root/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules'] ansible python module location = /usr/lib/python3.8/site-packages/ansible executable location = /usr/bin/ansible python version = 3.8.1 (default, Dec 21 2019, 20:57:38) [GCC 9.2.0]
Vorbereitung
HINWEIS - Nachfolgende Schritte sind NICHT mehr durchzuführen, wenn die Installation wie unter nachfolgendem internen Link fortgesetzte werden soll:
Für die spätere Kommunikation via SSH, kann mit nachfolgendem Befehl ein SSH-Schlüsselpaar erzeugt werden, welches dann später zur Anmeldung an den entsprechenden Servern verwendet werden kann.
ssh-keygen
Nachfolgender Befehl erzeugt eine SSH-Schlüsselpaar vom Typ ed25519
:
$ ssh-keygen -t ed25519 -a 97 -C klaus@tachtler.net -f ~/.ssh/id_ed25519
$ ssh-keygen -t ed25519 -a 97 -C klaus@tachtler.net -f ~/.ssh/id_ed25519 Generating public/private ed25519 key pair. Created directory '/home/klaus/.ssh'. Enter passphrase (empty for no passphrase): Enter same passphrase again: Your identification has been saved in /home/klaus/.ssh/id_ed25519. Your public key has been saved in /home/klaus/.ssh/id_ed25519.pub. The key fingerprint is: SHA256:s8BZ2XNiOgyZUka3M6xMG1jp2dpYwMzv/jiz0E9yOSk klaus@tachtler.net The key's randomart image is: +--[ED25519 256]--+ | ..++.. .+ | |. ++.+o+o o | | ..Co=O. . | | o@+.= | | +O S | | o +. . | | .. . o | | +oD.* | | .+=.=.. | +----[SHA256]-----+
Erklärungen:
-t ed25519
-t dsa | ecdsa | ed25519 | rsa
- Gibt den Typ des zu erstellenden Schlüssels an.
-a 97
-a rounds
- Beim Speichern eines privaten Schlüssels gibt diese Option die Anzahl der KDF (Schlüsselableitungsfunktion) verwendeten Runden an. Höhere Zahlen ergeben langsamere „Passphrasenüberprüfung“ und erhöhte Widerstandsfähigkeit gegen das Knacken des Passworts erzwingen (falls die Schlüssel gestohlen werden).
Bei der Überprüfung von DH-GEX-Kandidaten (mit dem Befehl -T
). Diese Option gibt die Anzahl der durchzuführenden Primzahltests an.
-C klaus@tachtler.net
-C comment
- Liefert einen neuen Kommentar.
-f ~/.ssh/id_ed25519
-f filename
- Gibt den Dateinamen der Schlüsseldatei an.
Nachfolgender Parameter muss nicht mehr ab OpenSSH Version 7.8 angegeben werden:
-o
- Veranlasste private Schlüssel mit dem neuen OpenSSH-Format statt dem kompatibleren PEM-Format zu speichern. Das neue Format hat eine erhöhte Widerstandsfähigkeit gegen das Knacken von Brute-Force-Passwörtern, wird aber von Versionen von OpenSSH vor Version 6.5 nicht unterstützt. Ed25519-Schlüssel verwenden immer das neue private Schlüsselformat.
HINWEIS - Die Option -o
existierte in OpenSSH Versionen 6.5-7.7. Seit OpenSSH Version 7.8 ist das -o
das Standardverhalten und die Option ist nicht mehr dokumentiert (wird einfach stillschweigend ignoriert, wenn sie benutzt wird).
HINWEIS - In älteren Versionen würde ssh-keygen
standardmäßig das PEM-Format für RSA-, DSA- und ECDSA-Schlüssel verwenden (nicht für Ed25519).
HINWEIS - In OpenSSH Version 7.8 und neuer kann der Schlüssel im PEM-Format erhalten, indem Sie das -m
PEM-Flag gesetzte wird.
Falls die Erstellung funktioniert hat, sollten nachfolgende Dateien in nachfolgendem Verzeichnis erstellt worden sein:
~/.ssh
(„Home“-Verzeichnis des angemeldeten Benutzers - hier/home/klaus/.ssh
)
$ ls -l ~/.ssh total 8 -rw-------. 1 klaus klaus 464 Dec 22 07:05 id_ed25519 -rw-r--r--. 1 klaus klaus 100 Dec 22 07:05 id_ed25519.pub
Konfiguration
/etc/ansible/hosts
Die Konfigurationsdatei /etc/ansible/hosts
enthält die via SSH
zu erreichenden Server. Nachfolgende ein Beispiel für den Inhalt dieser Konfigurationsdatei und eine mögliche Ergänzung dieser, durch hinzufügen z.B. eigener IP-Adressen:
# cat /etc/ansible/hosts # This is the default ansible 'hosts' file. # # It should live in /etc/ansible/hosts # # - Comments begin with the '#' character # - Blank lines are ignored # - Groups of hosts are delimited by [header] elements # - You can enter hostnames or ip addresses # - A hostname/ip can be a member of multiple groups # Ex 1: Ungrouped hosts, specify before any group headers. ## green.example.com ## blue.example.com ## 192.168.100.1 ## 192.168.100.10 # Ex 2: A collection of hosts belonging to the 'webservers' group ## [webservers] ## alpha.example.org ## beta.example.org ## 192.168.1.100 ## 192.168.1.110 # If you have multiple hosts following a pattern you can specify # them like this: ## www[001:006].example.com # Ex 3: A collection of database servers in the 'dbservers' group ## [dbservers] ## ## db01.intranet.mydomain.net ## db02.intranet.mydomain.net ## 10.25.1.56 ## 10.25.1.57 # Here's another example of host ranges, this time there are no # leading 0s: ## db-[99:101]-node.example.com # Tachtler 192.168.122.66 192.168.122.56
Als nächstes sollte überprüft werden ob ein SSH-Zugriff möglich ist, wobei auch gleich der SSH-Schlüssel des Servers überprüft und vor allem bestätigt werden kann, was mit nachfolgendem Befehlen erfolgen kann:
# ssh root@192.168.122.66 The authenticity of host '192.168.122.66 (192.168.122.66)' can't be established. ECDSA key fingerprint is SHA256:PFyOCzDhZlr1dw1PAT9vJ6u4yt1bvxgWiqqYfVek9IA. Are you sure you want to continue connecting (yes/no)? yes Warning: Permanently added '192.168.122.66' (ECDSA) to the list of known hosts. root@192.168.122.66's password: Last login: Sun Dec 22 07:08:24 2019
und
# ssh root@192.168.122.56 The authenticity of host '192.168.122.56 (192.168.122.56)' can't be established. ECDSA key fingerprint is SHA256:PFyOCzDhZlr1dw1PAT9vJ6u4yt1bvxgWiqqYfVek9IA. Are you sure you want to continue connecting (yes/no)? yes Warning: Permanently added '192.168.122.56' (ECDSA) to the list of known hosts. root@192.168.122.56's password: Last login: Sun Dec 22 07:09:56 2019
Durch Aufruf des nachfolgenden Befehls, kann überprüft werden, ob alle Server via SSH
erreichbar sind:
# ansible all -m ping -u root --ask-pass SSH password: 192.168.122.66 | SUCCESS => { "ansible_facts": { "discovered_interpreter_python": "/usr/libexec/platform-python" }, "changed": false, "ping": "pong" } 192.168.122.56 | SUCCESS => { "ansible_facts": { "discovered_interpreter_python": "/usr/libexec/platform-python" }, "changed": false, "ping": "pong" }
Ein weiterer Test könnte wie nachfolgend gezeigt durchgeführt werden, um bestätigen zu können, das auch Befehle auf den entsprechenden Server ausgeführt werden können, wie nachfolgender Befehl zeigt:
# ansible all -a "/bin/echo hello" -u root --ask-pass SSH password: 192.168.122.66 | CHANGED | rc=0 >> hello 192.168.122.56 | CHANGED | rc=0 >> hello
HINWEIS - Dies sind nur erste Tests, um die grundsätzlich Funktionalität von Ansible überprüfen zu können!
ACHTUNG - In PRODuktiven Umgebungen sollte
- KEIN Login mit dem
root
-Benutzer viaSSH
möglich sein! - KEINE Passwort Authentifizierung durchgeführt werden!
- Die Nutzung von SSH-Schlüsseln sollte ein MUSS sein!
/etc/ansible/ansible.cfg
Die Konfigurationsdatei /etc/ansible/ansible.conf
stallt die Hauptkonfigurationsdatei von Ansible dar. Nachfolgende Einstellungen erweitern die Standard Nutzungsmöglichkeiten von Ansible.
[privilege_escalation]
Um als nicht privilegierter Benutzer auch Aktionen durchführen zu können, welche root
-Benutzer Berechtigungen voraussetzen, kann mit nachfolgender Anpassung der Konfigurationsddatei /etc/ansible/ansible.conf
, bestimmt werden, ob für eine Aktion die root
Berechtigungen erfodert,
become=True
- diese automatisch erlagt werden sollenbecome_method=sudo
- welcher Befehl zur Rechteerlangung ausgeführt werden sollbecome_user=root
- der Benutzer, dessen Rechte erlangt werden sollenbecome_ask_pass=True
- ob nach einem Passwort gefragt werden soll
Nachfolgende Änderungen sind dafür durchzuführen.
(Nur relevanter Ausschnitt):
[privilege_escalation] # Tachtler # default: #become=True # default: #become_method=sudo # default: #become_user=root # default: #become_ask_pass=False become=True become_method=sudo become_user=root become_ask_pass=True
Playbooks
Playbooks sind die Konfigurations-, Bereitstellungs- und Orchestrierungssprache von Ansible. Sie können eine Richtlinie beschreiben, die vom Remote-Systemen durchgesetzt werden soll, oder eine Reihe von Schritten in einem allgemeinen IT-Prozess sein.
Wenn Ansible-Module die Werkzeuge in einer Werkstatt sind, sind Playbooks die Bedienungsanleitungen, der Bestand an Hosts und das Rohmaterial zugleich.
Auf einer grundlegenden Ebene können Playbooks zur Verwaltung von Konfigurationen und Bereitstellungen auf Remote-Systemen verwendet werden. Auf einer fortgeschrittenen Ebene können mehrstufige Rollouts mit laufenden Updates sequenzieren und Aktionen an andere Hosts delegieren, wobei unterwegs mit Überwachungsservern und Load Balancern interagieren werden kann.
Playbooks sind so konzipiert, dass sie gut lesbar sind und werden in einer einfachen Textsprache YAML entwickelt.
*Quelle: https://docs.ansible.com/ansible/2.8/user_guide/playbooks.html
sudoers.yml
Nachfolgendes Playbook hat die Aufgabe folgende Konfigurationen durchzuführen:
- Für den Benutzer
klaus
- überprüfen, ob eine Gruppe
wheel
existiert und - optional - in einer neuen Datei
/etc/sudoers.d/020_nopasswd_all_for_wheel
den Eintrag%wheel ALL=(ALL) NOPASSWD: ALL
vorhalten - dies zu
validieren
und - den Benutzer
klaus
zusätzlich in die Gruppewheels
aufzunehmen und - den
öffentlichen SSH-Schlüssel
des Benutzerklaus
nach/home/klaus/.ssh/ida_ed25519.pub
bzw. den Inhaltexklusiv
nach /home/klaus/.ssh/authorized_keys
zu kopieren.
Erklärung
Um zukünftig zu vermeiden, das eine Login via SSH mit dem Benutzer root
erfolgen muss, soll der Benutzer, hier klaus
ebenfalls die Möglichkeit haben, sich via SSH auf die einzelnen Server zu verbinden.
Der Benutzer, hier klaus
, soll sich auch durch Nutzung eines SSH-Schlüssels auf den jeweiligen Server verbinden können, um später in der Konfigurationsdatei des SSH-Daemons (Dienstes) dann die Möglichkeiten
- ein Login via Benutzer
root
nicht mehr durchzuführen und - ein Login via Passwort-Authentifizierung, ebenfalls nicht mehr durchführen zu können
umzusetzen.
WICHTIG - Durch die Aufnahme eines Benutzers, hier klaus
, in die Gruppe wheel
erhält dieser die Möglichkeit, nach einer erfolgreichen Anmeldung am jeweiligen Server, sudo
(das Wechseln auf den Benutzer root
, bzw. Erlangung dessen Rechte) optional - ohne Passworteingabe zu erlangen!
WICHTIG - Damit kann nun ermöglicht werden, dass der Benutzer, hier klaus
, sich auf einem Server via SSH-Schlüssel verbinden kann und Befehle auf dem jeweiligen Server ausführen kann, auch mit Rechten des Benutzers root
via sudo
.
HINWEIS - Nachfolgend soll auch die Nutzung des SSH-Agents via ssh-add
erfolgen, wie unter nachfolgendem externen Links aus der Dokumentation von zu entnehmen ist:
- „Zitat“ - „Ansible stellt keinen Kanal zur Verfügung, der die Kommunikation zwischen dem Benutzer und dem SSH-Prozess erlaubt, um ein Passwort manuell zu akzeptieren und einen SSH-Schlüssel zu entschlüsseln, wenn das SSH-Verbindungs-Plugin verwendet wird (was der Standard ist). Die Verwendung des
ssh-agent
wird dringend empfohlen.“
Playbook
Nachfolgend nun das Playbook, welches z.B. aktuell zur Vereinfachung im Verzeichnis
/etc/ansible
mit dem Namen
/etc/ansible/sudoers.yml
in der Programmiersprache YAML verfasst ist:
- hosts: all vars: sudoers: - klaus tasks: - name: Make sure we have a 'wheel' group group: name: wheel state: present # Tachtler - optional - # - name: Allow 'wheel' group to have passwordless sudo # copy: # content: '%wheel ALL=(ALL) NOPASSWD: ALL' # dest: /etc/sudoers.d/020_nopasswd_all_for_wheel # owner: root # group: root # mode: "0440" # validate: visudo -cf %s - name: Add sudoers users to 'wheel' group user: name: "{{ item }}" groups: wheel append: yes with_items: "{{ sudoers }}" - name: Set exclusive authorized key for sudoers taken from file authorized_key: user: "{{ item }}" key: "{{ lookup('file', '/home/{{ item }}/.ssh/id_ed25519.pub') }}" state: present exclusive: True with_items: "{{ sudoers }}"
Nachfolgende Ansible-Module kommen hier zum Einsatz:
Ausführung
Zur Ausführung, soll mit nachfolgendem Befehl in das Verzeichnis
/etc/ansible
gewechselt werden:
# cd /etc/ansible
Nachfolgender Befehl, rollt das Playbook /etc/ansible/sudoers.yml
auf allen Servern aus:
# ansible-playbook -v sudoers.yml -u root --ask-pass
# ansible-playbook -v sudoers.yml -u root --ask-pass Using /etc/ansible/ansible.cfg as config file SSH password: PLAY [all] ********************************************************************* TASK [Gathering Facts] ********************************************************* ok: [192.168.122.66] ok: [192.168.122.56] TASK [Make sure we have a 'wheel' group] *************************************** ok: [192.168.122.56] => {"changed": false, "gid": 10, "name": "wheel", "state": "present", "system": false} ok: [192.168.122.66] => {"changed": false, "gid": 10, "name": "wheel", "state": "present", "system": false} TASK [Add sudoers users to 'wheel' group] ************************************** changed: [192.168.122.56] => (item=klaus) => {"ansible_loop_var": "item", "append": true, "changed": true, "comment": "Klaus Tachtler", "group": 1000, "groups": "wheel", "home": "/home/klaus", "item": "klaus", "move_home": false, "name": "klaus", "shell": "/bin/bash", "state": "present", "uid": 1000} changed: [192.168.122.66] => (item=klaus) => {"ansible_loop_var": "item", "append": true, "changed": true, "comment": "Klaus Tachtler", "group": 1000, "groups": "wheel", "home": "/home/klaus", "item": "klaus", "move_home": false, "name": "klaus", "shell": "/bin/bash", "state": "present", "uid": 1000} TASK [Set exclusive authorized key for sudoers taken from file] **************** changed: [192.168.122.66] => (item=klaus) => {"ansible_loop_var": "item", "changed": true, "comment": null, "exclusive": true, "follow": false, "item": "klaus", "key": "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIEjK0ugoSsSgnQ+F9hGh0+hd94vP6Pdu4IwcAnTCQ5Jo klaus@tachtler.net", "key_options": null, "keyfile": "/home/klaus/.ssh/authorized_keys", "manage_dir": true, "path": null, "state": "present", "user": "klaus", "validate_certs": true} changed: [192.168.122.56] => (item=klaus) => {"ansible_loop_var": "item", "changed": true, "comment": null, "exclusive": true, "follow": false, "item": "klaus", "key": "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIEjK0ugoSsSgnQ+F9hGh0+hd94vP6Pdu4IwcAnTCQ5Jo klaus@tachtler.net", "key_options": null, "keyfile": "/home/klaus/.ssh/authorized_keys", "manage_dir": true, "path": null, "state": "present", "user": "klaus", "validate_certs": true} PLAY RECAP ********************************************************************* 192.168.122.56 : ok=4 changed=2 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 192.168.122.66 : ok=4 changed=2 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
Erklärung:
ansible-playbook
Das ist das „Programm“, mit dem Playbooks ausgeführt werden können.
-v
Der Parameter -v
ermöglicht die Ausgabe von erweiterten Informationen (verbose) währen der Ausführung.
sudoers.yml
Das auszuführende Playbook
-u root
Der Parameter -u root
bedingt die Ausführung unter dem Benutzer root
, um sich mit diesen via SSH auf die einzelnen Server zu verbinden.
--ask-pass
Der Parameter –ask-pass
erzwingt die Eingabe des Passworts des root
, um sich mit diesen via SSH auf die einzelnen Server zu verbinden.
Überprüfung
Nach der Ausführung des Playbooks, sollten nachfolgend Schritte ausgeführt werden um überprüfen zu können, ob alles umgesetzt wurde, was in der vorhergehenden Liste mit diesem Playbook erreicht werden sollte.
Siehe auch dazu, den nachfolgenden internen Link: Ansible - Playbooks - sudoers.yml
Damit später keine Problem bei der Verbindung auf die einzelnen Server via SSH auftreten und weil Ansible nur bedingt während der Ausführung eines Playbook mit dem Nutzer interagieren kann, soll hier mit dem Benutzer klaus
eine SSH-Verbindung (noch mit Passwort-Authentifizierung) auf jeden einzelnen Server durchgeführt werden, falls dies nicht bereits geschehen sein sollte, wie nachfolgende Befehle zeigen:
$ ssh klaus@192.168.122.66 The authenticity of host '192.168.122.66 (192.168.122.66)' can't be established. ECDSA key fingerprint is SHA256:PFyOCzDhZlr1dw1PAT9vJ6u4yt1bvxgWiqqYfVek9IA. Are you sure you want to continue connecting (yes/no)? yes Warning: Permanently added '192.168.122.66' (ECDSA) to the list of known hosts. Enter passphrase for key '/home/klaus/.ssh/id_ed25519': Last login: Sun Dec 22 06:47:56 2019 from 192.168.122.1
$ ssh klaus@192.168.122.56 The authenticity of host '192.168.122.56 (192.168.122.56)' can't be established. ECDSA key fingerprint is SHA256:PFyOCzDhZlr1dw1PAT9vJ6u4yt1bvxgWiqqYfVek9IA. Are you sure you want to continue connecting (yes/no)? yes Warning: Permanently added '192.168.122.56' (ECDSA) to the list of known hosts. Enter passphrase for key '/home/klaus/.ssh/id_ed25519': Last login: Sun Dec 22 06:48:09 2019 from 192.168.122.1
Nachfolgend soll auch die Nutzung des SSH-Agents via ssh-add
erfolgen, wie unter nachfolgendem externen Links aus der Dokumentation von zu entnehmen ist:
- „Zitat“ - „Ansible stellt keinen Kanal zur Verfügung, der die Kommunikation zwischen dem Benutzer und dem SSH-Prozess erlaubt, um ein Passwort manuell zu akzeptieren und einen SSH-Schlüssel zu entschlüsseln, wenn das SSH-Verbindungs-Plugin verwendet wird (was der Standard ist). Die Verwendung des
ssh-agent
wird dringend empfohlen.“
$ ssh-add ~/.ssh/id_ed25519 Enter passphrase for /home/klaus/.ssh/id_ed25519: Identity added: /home/klaus/.ssh/id_ed25519 (klaus@tachtler.net)
Um zu überprüfen, ob der SSH-Schlüssel auch im SSH-Agent geladen ist, kann nachfolgender Befehl verwendet werden:
$ ssh-add -l 256 SHA256:w8BZ2YNiOgyZUke3M6xMG1jp2drYwMzv/jiz0W9yOSk klaus@tachtler.net (ED25519)
Wenn der SSH-Schlüssel wieder aus dem SSH-Agent entladen werden soll, kann nachfolgender Befehl genutzt werden:
$ ssh-add -d ~/.ssh/id_ed25519 Identity removed: /home/klaus/.ssh/id_ed25519 (klaus@tachtler.net)
Wenn der SSH-Schlüssel nur für einen gewissen Zeitraum in den SSH-Agent geladen werden soll, kann nachfolgenden Befehl verwendet werden (hier eine Zeitspanne von 30 Minuten)
$ ssh-add -t 30m ~/.ssh/id_ed25519 Enter passphrase for /home/klaus/.ssh/id_ed25519: Identity added: /home/klaus/.ssh/id_ed25519 (klaus@tachtler.net) Lifetime set to 1800 seconds
Abschließend können nun nachfolgende Befehle als angemeldeter Benutzer klaus
ausgeführt werden,
- ohne die Angabe und die Nutzung des Benutzer
root
- Parameter-u root
- ohne die Angabe eines Passworts zur Verbindung via SSH - Parameter
–ask-pass
HINWEIS - Die Ausführungen der Befehle erfolgen als angemeldeter Benutzer klaus
HINWEIS - Das BECOME password:
ist das des Benutzers klaus
Durch den erneuten Aufruf des nachfolgenden Befehls, kann überprüft werden, ob alle Server via SSH
erreichbar sind:
$ ansible all -m ping BECOME password: 192.168.122.66 | SUCCESS => { "ansible_facts": { "discovered_interpreter_python": "/usr/libexec/platform-python" }, "changed": false, "ping": "pong" } 192.168.122.56 | SUCCESS => { "ansible_facts": { "discovered_interpreter_python": "/usr/libexec/platform-python" }, "changed": false, "ping": "pong" }
Ein weiterer Test könnte ebenfalls wiederholt werden, um bestätigen zu können, das auch Befehle auf den entsprechenden Server ausgeführt werden können, wie nachfolgender Befehl zeigt:
$ ansible all -a "/bin/echo hello" BECOME password: 192.168.122.66 | CHANGED | rc=0 >> hello 192.168.122.56 | CHANGED | rc=0 >> hello
Ein Abschließender Test soll überprüfen, ob auch Befehle via SSH
ausgeführt werden können, welche root
-Benutzer Berechtigungen voraussetzen, wie nachfolgender Befehl zeigt:
$ ansible all -a "ls /root" --become --become-method sudo --become-user root --ask-become-pass BECOME password: 192.168.122.56 | CHANGED | rc=0 >> anaconda-ks.cfg 192.168.122.66 | CHANGED | rc=0 >> anaconda-ks.cfg
HINWEIS - Wenn die Änderungen an der Konfigurationsdatei /etc/ansible/ansible.cfg
wie in nachfolgenden internen Link beschrieben durchgeführt worden sind, können die Parameter
--become --become-method sudo --become-user root --ask-become-pass
auch weggelassen werden!
OHNE Änderung:
$ ansible all -a "ls /root" 192.168.122.66 | FAILED | rc=2 >> ls: cannot open directory '/root': Permission deniednon-zero return code 192.168.122.56 | FAILED | rc=2 >> ls: cannot open directory '/root': Permission deniednon-zero return code
MIT Änderung:
$ ansible all -a "ls /root" BECOME password: 192.168.122.66 | CHANGED | rc=0 >> anaconda-ks.cfg 192.168.122.56 | CHANGED | rc=0 >> anaconda-ks.cfg