Ansible je nástroj pro poskytování, správu konfigurace a nasazení aplikací s otevřeným zdrojovým kódem umožňující infrastrukturu jako kód. Běží na mnoha systémech podobných Unixu a může konfigurovat systémy podobné Unixu i Microsoft Windows.
Předpoklady
Abyste mohli postupovat podle tohoto průvodce, potřebujete následující:
- python nainstalovaný v místním systému
- Python pip nainstalován
- Ansible nainstalován lokálně
Kroky
- Instalovat závislosti
- Vygenerujte heslo pomocí balíčku passlib
- Vytvořte příručku definující požadované úkoly
- Celou příručku
1. Instalovat závislosti
Aby to fungovalo, potřebujeme ansible a balíček passlib.
Nainstalujte balíček ansible passlib:
sudo pip install passlib
Nainstalujte ansible
sudo pip install ansible
2. Vygenerujte heslo pomocí balíčku passlib
Ansible přidá heslo tak, jak je pro uživatele. Heslo je zašifrováno, takže výchozí heslo nebude fungovat.
Získejte zašifrované heslo pomocí tohoto příkazu:
python -c "from passlib.hash import sha512_crypt; import getpass; print(sha512_crypt.using(rounds=5000).hash(getpass.getpass()))"
Výstup:
➜ python -c "from passlib.hash import sha512_crypt; import getpass; print(sha512_crypt.using(rounds=5000).hash(getpass.getpass()))"
Password:
$6$8IAGh7Gu2ugAB.sF$zHldDAEBMoiFUPq2RsGpQ.TRwbPOz3/S5ATs5TbfWDLypYjLGfKN8SNxu1Sx5nNfzQgDJqBh37jT9ln7EIHcq0
3. Vytvořte ansible playbook definující požadované úkoly
Nyní, když jsou nainstalovány všechny závislosti, pojďme definovat naši příručku.
Nejprve musíte definovat název, hostitele a další informace, jako jsou proměnné:
- name: Create user on a linux server
hosts: remote-server
become: yes
gather_facts: false
vars:
- user: <username here>
- password: <Password hash generated>
Další část je určena pro úkoly.
Přípustný úkol vytvořit uživatele linuxu
Protože chceme vytvořit uživatele, použijeme ansible user
modul. Více o uživatelském modulu naleznete zde.
Tato úloha vytvoří uživatele se zadaným name
a password
které budou interpolovány z proměnných definovaných dříve:
- name: Create a login user
user:
name: "{{ user }}"
password: "{{ password }}"
groups:
- wheel
state: present
Volitelné:Možnost přidat veřejný klíč k autorizovaným_klíčům pro uživatele
Abychom umožnili přihlášení na server bez hesla, můžeme přidat náš veřejný ssh klíč k autorizovaným klíčům na serveru. K tomu se používá modul ansible authorised_key.
- name: Add public key to authorized_keys
authorized_key:
user: "{{ user }}"
state: present
key: "{{ lookup('file', '~/.ssh/id_rsa.pub') }}"
Volitelné:Možnost zakázat přístup root ssh
Dalším krokem je odepřít přihlášení root přes ssh. Je dobrým zvykem umožnit přihlášení uživatelům bez oprávnění root. Používáme lineinfile
modul, který zajistí, že v zadaném souboru bude přítomen konkrétní řádek. Pro shodu řádku používáme regulární výraz.
- name: Deny root from logging in
ansible.builtin.lineinfile:
dest: /etc/ssh/sshd_config
regexp: '^(#)?PermitRootLogin \w*$'
line: 'PermitRootLogin no'
state: present
Volitelné:Možnost přidat uživatele do seznamu povolených uživatelů
Dobrým bezpečnostním postupem je umožnit přihlášení do systému pouze určeným uživatelům. Tento úkol to udělá.
- name: Allow specific users to log in
ansible.builtin.lineinfile:
dest: /etc/ssh/sshd_config
regexp: '^AllowUsers'
line: 'AllowUsers {{ user }}'
state: present
Volitelné:Přidejte uživatele do souboru sudoers, aby mohli spouštět příkazy sudo:
Pokud chcete, aby vytvořený uživatel spustil příkaz sudo bez výzvy k zadání hesla, zahrňte tuto úlohu.
Zde používáme lineinfile
modul k vyhledání regulárního výrazu vyhovujícího uživateli a poté ověření, že vše funguje podle očekávání pomocí příkazu visudo -cf %s
:
- name: Add {{ user }} to sudoers file
ansible.builtin.lineinfile:
path: /etc/sudoers
regexp: '^{{ user }}'
line: '{{ user }} ALL=(ALL) NOPASSWD: ALL'
validate: 'visudo -cf %s'
4. Celá příručka
Takto bude vypadat celý playbook. Uložte tento obsah do .yaml
nebo .yml
soubor. V mém případě create-user.yaml
:
---
- name: Create user on a linux server
hosts: remote-server
become: yes
gather_facts: false
vars:
- user: user1
- password: $6$8IAGh7Gu2ugAB.sF$zHldDAEBMoiFUPq2RsGpQ.TRwbPOz3/S5ATs5TbfWDLypYjLGfKN8SNxu1Sx5nNfzQgDJqBh37jT9ln7EIHcq0
tasks:
- name: Create a login user
user:
name: "{{ user }}"
password: "{{ password }}"
groups:
- wheel
state: present
- name: Add public key to authorized_keys
authorized_key:
user: "{{ user }}"
state: present
key: "{{ lookup('file', '~/.ssh/id_rsa.pub') }}"
- name: Deny root from logging in
ansible.builtin.lineinfile:
dest: /etc/ssh/sshd_config
regexp: '^(#)?PermitRootLogin \w*$'
line: 'PermitRootLogin no'
state: present
- name: Allow specific users to log in
ansible.builtin.lineinfile:
dest: /etc/ssh/sshd_config
regexp: '^AllowUsers'
line: 'AllowUsers {{ user }}'
state: present
- name: Add {{ user }} to sudoers file
ansible.builtin.lineinfile:
path: /etc/sudoers
regexp: '^{{ user }}'
line: '{{ user }} ALL=(ALL) NOPASSWD: ALL'
validate: 'visudo -cf %s'
5. Spuštění příručky
Nyní, když máme playbook vytvořený v souboru create-user.yaml
v aktuálním adresáři musíme poskytnout soubor hosts, který bude definovat připojení k našemu serveru. Z definice playbooku definujeme náš server jako remote-server
. Nyní to přidejte do souboru hosts.
Vytvořte soubor hosts.yaml
s následujícím obsahem definujícím remote-server
:
all:
hosts:
remote-server:
ansible_ssh_host: 138.68.150.24
ansible_ssh_user: root
Nyní musíme vyvolat ansible-playbook
příkaz takto:
ansible-playbook -i hosts.yaml create-user.yaml -vv
Ve výše uvedeném příkazu -i
určuje soubor inventáře. -vv
umožňuje upovídanost.
Toto je výstup z mého serveru:
➜ ansible-playbook -i hosts.yaml create-user.yaml -vv
ansible-playbook [core 2.11.1]
config file = None
configured module search path = ['/Users/citizix/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules']
ansible python module location = /usr/local/lib/python3.9/site-packages/ansible
ansible collection location = /Users/citizix/.ansible/collections:/usr/share/ansible/collections
executable location = /usr/local/bin/ansible-playbook
python version = 3.9.5 (default, May 4 2021, 03:36:27) [Clang 12.0.0 (clang-1200.0.32.29)]
jinja version = 2.11.3
libyaml = False
No config file found; using defaults
redirecting (type: modules) ansible.builtin.authorized_key to ansible.posix.authorized_key
Skipping callback 'default', as we already have a stdout callback.
Skipping callback 'minimal', as we already have a stdout callback.
Skipping callback 'oneline', as we already have a stdout callback.
PLAYBOOK: create-user.yaml *********************************************************************************************************************************************************************************
1 plays in create-user.yaml
PLAY [Create user on a linux server] ***********************************************************************************************************************************************************************
META: ran handlers
TASK [Create a login user] *********************************************************************************************************************************************************************************
task path: /Users/citizix/projects/ansible/create-user.yaml:9
changed: [remote-server] => {"ansible_facts": {"discovered_interpreter_python": "/usr/libexec/platform-python"}, "changed": true, "comment": "", "create_home": true, "group": 1000, "groups": "wheel", "home": "/home/rocky", "name": "rocky", "password": "NOT_LOGGING_PASSWORD", "shell": "/bin/bash", "state": "present", "system": false, "uid": 1000}
TASK [Add public key to authorized_keys] *******************************************************************************************************************************************************************
task path: /Users/citizix/projects/ansible/create-user.yaml:17
redirecting (type: modules) ansible.builtin.authorized_key to ansible.posix.authorized_key
changed: [remote-server] => {"changed": true, "comment": null, "exclusive": false, "follow": false, "key": "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQC6gM14zM0+L+ERQFVFYbHBAjtyghKKx/N+qsFXxrcJqVqsyn1lp/erPqg3g6WSu/bwiAB+E22RyG9icS7Td8ssWi9vDE73DHgC5NGLm4KeP2FospEFjY6v8XVjkwQZJ+8YyCfXJ4E5cm0FGKZREakDlYeaonTaIjxkXlsZB3Yl93+KZvZ0g1WiBOU6N6NWpEQVvxYccWK4+EuQiCryELL0o4dCNrwLaYOyv/NbSYQ09m3+mvN0VRnTzo7qSOqy1U6oCVA9bhd+tRyoUsUqp3Up8jdfzEGfWr/Pqskjtl8YXySPHLEROXX/Om4AyT62EQxcPMzedPJ6HGLHnlk4EO9cBLawymdWO7AlghujksVBu9S+alOkAmJkkPzeq76WOjCTmoNxlQmEDlucukiujfWKl4hACdNVtARptvuc5+4uMYA4j4Ql+XtQ964UQa4HiGiNpoiDegzDq9GMEsQW4W5frRuOIm4R7thYGatRBkNFw+uemE5HclF8LXOuPkShhFqpDPgI1oH99covroXggV8/ovEf9ZSoshNLMHX5kXWGAWF983Cn2N5RpmqN8rfcGVq6C93njExvHDfl7bHkhT10axOLV/V4vX4lSktWVV4//vq2wMQLi5F1l7ai8scA3eYeSaWnDaJj2jnz6V5JBOPIOH/3lf7qq4oquZhmuWq3w== citizix", "key_options": null, "keyfile": "/home/rocky/.ssh/authorized_keys", "manage_dir": true, "path": null, "state": "present", "user": "rocky", "validate_certs": true}
TASK [Deny root from logging in] ***************************************************************************************************************************************************************************
task path: /Users/citizix/projects/ansible/create-user.yaml:23
changed: [remote-server] => {"backup": "", "changed": true, "msg": "line replaced"}
TASK [Allow specific users to log in] **********************************************************************************************************************************************************************
task path: /Users/citizix/projects/ansible/create-user.yaml:30
changed: [remote-server] => {"backup": "", "changed": true, "msg": "line added"}
TASK [Add my pub key to authorized_keys] *******************************************************************************************************************************************************************
task path: /Users/citizix/projects/ansible/create-user.yaml:37
ok: [remote-server] => {"changed": false, "comment": null, "exclusive": false, "follow": false, "key": "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQC6gM14zM0+L+ERQFVFYbHBAjcsTGZKKx/N+qsFXxrcJqVqsyn1lp/erPqg3g6WSu/bwiAB+E22RyG9icS7Td8ssWi9vDE73DHgC5NGLm4KeP2FospEFjY6v8XVjkwQZJ+8YyCfXJ4E5cm0FGKZREakDlYeaonTaIjxkXlsZB3Yl93+KZvZ0g1WiBOU6N6NWpEQVvxYccWK4+EuQiCryELL0o4dCNrwLaYOyv/NbSYQ09m3+mvN0VRnTzo7qSOqy1U6oCVA9bhd+tRyoUsUqp3Up8jdfzEGfWr/Pqskjtl8YXySPHLEROXX/Om4AyT62EQxcPMzedPJ6HGLHnlk4EO9cBLawymdWO7AlghujksVBu9S+alOkAmJkkPzeq76WOjCTmoNxlQmEDlucukiujfWKl4hACdNVtARptvuc5+4uMYA4j4Ql+XtQ964UQa4HiGiNpoiDegzDq9GMEsQW4W5frRuOIm4R7thYGatRBkNFw+uemE5HclF8LXOuPkShhFqpDPgI1oH99covroXggV8/ovEf9ZSoshNLMHX5kXWGAWF983Cn2N5RpmqN8rfcGVq6C93njExvHDfl7bHkhT10axOLV/V4vX4lSktWVV4//vq2wMQLi5F1l7ai8scA3eYeSaWnDaJj2jnz6V5JBOPIOH/3lf7qq4oquZhmuWq3w== [email protected]", "key_options": null, "keyfile": "/home/rocky/.ssh/authorized_keys", "manage_dir": true, "path": null, "state": "present", "user": "rocky", "validate_certs": true}
TASK [Add rocky to sudoers file] ***************************************************************************************************************************************************************************
task path: /Users/citizix/projects/ansible/create-user.yaml:43
changed: [remote-server] => {"backup": "", "changed": true, "msg": "line replaced"}
META: ran handlers
META: ran handlers
PLAY RECAP *************************************************************************************************************************************************************************************************
remote-server : ok=6 changed=5 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0