Ansible ad-hoc komande predstavljaju brz način za izvršavanje zadataka bez potrebe za njihovim čuvanjem za buduću upotrebu. Ovaj tekst detaljno objašnjava šta su i kako se koriste Ansible ad-hoc komande.
U Ansible-u, za određene operacije nije neophodno kreirati poseban playbook; umesto toga, možete koristiti ad-hoc komande. To su u suštini jednolinijske naredbe koje omogućavaju izvršavanje pojedinačnih zadataka na udaljenim hostovima. Ove komande se nalaze u putanji /usr/bin/ansible.
Zadaci kao što su provera dostupnosti hostova putem pinga, kopiranje datoteka, ponovno pokretanje servera ili instaliranje paketa mogu se lako obaviti pomoću Ansible ad-hoc komandi. U nastavku je lista osnovnih komandi koje bi trebalo da poznajete.
Osnovne komande
Sledeća ad-hoc komanda koristi ping modul za proveru dostupnosti svih hostova navedenih u inventaru. Opcija `-m` specificira modul koji se koristi.
<strong>[email protected]:/home/techblog.co.rs# ansible all -m ping</strong>
node1 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false,
"ping": "pong"
}
Ova komanda koristi setup modul na grupi hostova pod nazivom ‘Client’, koja je definisana u inventaru ‘`/etc/ansible/hosts`’.
[email protected]:/home/techblog.co.rs# ansible Client -m setup -a "filter=ansible_distribution*"
node1 | SUCCESS => {
"ansible_facts": {
"ansible_distribution": "Ubuntu",
"ansible_distribution_file_parsed": true,
"ansible_distribution_file_path": "/etc/os-release",
"ansible_distribution_file_variety": "Debian",
"ansible_distribution_major_version": "18",
"ansible_distribution_release": "cosmic",
"ansible_distribution_version": "18.10",
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false
}
Ova komanda se koristi za verifikaciju SSH lozinke. Potrebno je dodati opciju `–ask-pass` na kraju komande. Nakon izvršavanja, sistem će tražiti da unesete SSH lozinku.
[email protected]:/home/techblog.co.rs# ansible Client -m ping --ask-pass
SSH password:
node1 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false,
"ping": "pong"
}
Sledeća komanda omogućava izvršavanje ad-hoc komandi kao korisnik koji nije root, ali sa root privilegijama. Opcija `–become` omogućava root privilegije, dok `-K` traži unos lozinke.
[email protected]:/home/techblog.co.rs# ansible Client -m shell -a 'fdisk -l' -u techblog.co.rs --become -K
BECOME password:
node1 | CHANGED | rc=0 >>
Disk /dev/loop0: 14.5 MiB, 15208448 bytes, 29704 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk /dev/loop2: 42.1 MiB, 44183552 bytes, 86296 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk /dev/loop3: 149.9 MiB, 157184000 bytes, 307000 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk /dev/loop5: 140.7 MiB, 147501056 bytes, 288088 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk /dev/loop6: 151.2 MiB, 158584832 bytes, 309736 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk /dev/loop7: 14.8 MiB, 15458304 bytes, 30192 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk /dev/sda: 500 GiB, 536870912000 bytes, 1048576000 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0xcef957f5
Device Boot Start End Sectors Size Id Type
/dev/sda1 2048 462639103 462637056 220.6G 83 Linux
/dev/sda2 * 462639104 464592895 1953792 954M 83 Linux
/dev/sda3 464592896 482168831 17575936 8.4G 82 Linux swap / Solaris
/dev/sda4 482168832 1048573951 566405120 270.1G 83 Linux
Disk /dev/loop8: 4 MiB, 4218880 bytes, 8240 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Ova ad-hoc komanda se koristi za ponovno pokretanje sistema sa opcijom `-f` koja određuje broj forkova.
[email protected]:/home/techblog.co.rs# ansible Client -a "/sbin/reboot" -f 1
Prenos podataka
Sledeća Ansible ad-hoc komanda se koristi za kopiranje datoteke sa izvorišne lokacije na odredišnu, za grupu hostova (client) definisanu u inventarnoj datoteci. Nakon unosa lozinke, izlaz će prikazati „changed“: „true“, što znači da je datoteka uspešno kopirana.
[email protected]:/home/techblog.co.rs# ansible Client -m copy -a 'src=/home/techblog.co.rs/nginx.yml dest=/home/techblog.co.rs/Desktop/ owner=root mode=0644' -u root --become -K
BECOME password:
node1 | CHANGED => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": true,
"checksum": "5631822866afd5f19b928edb3ba018385df22dd3",
"dest": "/home/techblog.co.rs/Desktop/nginx.yml",
"gid": 0,
"group": "root",
"md5sum": "0d6ffe1069fc25ad4f8ad700277c4634",
"mode": "0644",
"owner": "root",
"size": 280,
"src": "/root/.ansible/tmp/ansible-tmp-1562253463.3-214622150088155/source",
"state": "file",
"uid": 0
}
Izvršite donju komandu kako biste proverili da li je modul za kopiranje radio ispravno. Kopirana datoteka bi trebalo da se pojavi na odredišnoj lokaciji navedenoj u prethodnoj komandi.
[email protected]:/home/techblog.co.rs# ls Desktop/
nginx.yml
Kreiramo novi direktorijum kako bismo demonstrirali module za preuzimanje u sledećim ad-hoc komandama.
[email protected]:/home/techblog.co.rs# mkdir example
[email protected]:/home/techblog.co.rs# ls
Desktop Documents example examples.desktop nginx_new.yml nginx.yml
Sledeća Ansible ad-hoc komanda koristi se za preuzimanje datoteke sa udaljenog hosta. U ovom primeru, koristimo modul za preuzimanje kako bismo dobili datoteku sa servera node1 na lokalno odredište na Ansible čvoru.
[email protected]:/home/techblog.co.rs# ansible node1 -m fetch -a 'src=/etc/sudoers.d/nginx.yml dest=/home/techblog.co.rs/example/ flat=yes'
node1 | SUCCESS => {
"changed": false,
"checksum": "5631822866afd5f19b928edb3ba018385df22dd3",
"dest": "/home/techblog.co.rs/example/nginx.yml",
"file": "/etc/sudoers.d/nginx.yml",
"md5sum": "0d6ffe1069fc25ad4f8ad700277c4634"
}
Proverite da li je datoteka uspešno preuzeta na odredišnu lokaciju navedenu u komandi.
[email protected]:/home/techblog.co.rs# ls example
nginx.yml
Upravljanje paketima
Sledeća komanda instalira Nginx na grupu hostova (client) koristeći apt modul.
[email protected]:/home/techblog.co.rs# ansible Client -m apt -a 'name=nginx state=latest' --become
node1 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"cache_update_time": 1562411227,
"cache_updated": false,
"changed": false
}
Sledeća komanda uklanja Nginx sa grupe hostova (client) koristeći apt modul, brišući sve povezane konfiguracije.
[email protected]:/home/techblog.co.rs# ansible Client -m apt -a 'name=nginx state=absent purge=yes' --become
node1 | CHANGED => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": true,
"stderr": "",
"stderr_lines": [],
"stdout": "Reading package lists...nBuilding dependency tree...nReading state information...nThe following packages were automatically installed and are no longer required:n libnginx-mod-http-geoip libnginx-mod-http-image-filtern libnginx-mod-http-xslt-filter libnginx-mod-mail libnginx-mod-streamn nginx-common nginx-corenUse 'sudo apt autoremove' to remove them.nThe following packages will be REMOVED:n nginx*n0 upgraded, 0 newly installed, 1 to remove and 241 not upgraded.nAfter this operation, 44.0 kB disk space will be freed.n(Reading database ... r(Reading database ... 5%r(Reading database ... 10%r(Reading database ... 15%r(Reading database ... 20%r(Reading database ... 25%r(Reading database ... 30%r(Reading database ... 35%r(Reading database ... 40%r(Reading database ... 45%r(Reading database ... 50%r(Reading database ... 55%r(Reading database ... 60%r(Reading database ... 65%r(Reading database ... 70%r(Reading database ... 75%r(Reading database ... 80%r(Reading database ... 85%r(Reading database ... 90%r(Reading database ... 95%r(Reading database ... 100%r(Reading database ... 180191 files and directories currently installed.)rnRemoving nginx (1.15.5-0ubuntu2.1) ...rn",
"stdout_lines": [
"Reading package lists...",
"Building dependency tree...",
"Reading state information...",
"The following packages were automatically installed and are no longer required:",
" libnginx-mod-http-geoip libnginx-mod-http-image-filter",
" libnginx-mod-http-xslt-filter libnginx-mod-mail libnginx-mod-stream",
" nginx-common nginx-core",
"Use 'sudo apt autoremove' to remove them.",
"The following packages will be REMOVED:",
" nginx*",
"0 upgraded, 0 newly installed, 1 to remove and 241 not upgraded.",
"After this operation, 44.0 kB disk space will be freed.",
"(Reading database ... ",
"(Reading database ... 5%",
"(Reading database ... 10%",
"(Reading database ... 15%",
"(Reading database ... 20%",
"(Reading database ... 25%",
"(Reading database ... 30%",
"(Reading database ... 35%",
"(Reading database ... 40%",
"(Reading database ... 45%",
"(Reading database ... 50%",
"(Reading database ... 55%",
"(Reading database ... 60%",
"(Reading database ... 65%",
"(Reading database ... 70%",
"(Reading database ... 75%",
"(Reading database ... 80%",
"(Reading database ... 85%",
"(Reading database ... 90%",
"(Reading database ... 95%",
"(Reading database ... 100%",
"(Reading database ... 180191 files and directories currently installed.)",
"Removing nginx (1.15.5-0ubuntu2.1) ..."
]
}
Upravljanje servisima
Sledeća Ansible ad-hoc komanda koristi modul za upravljanje servisima kako bi pokrenula Nginx na hostu. Stanje servisa treba da bude ‘started’.
[email protected]:/home/techblog.co.rs# ansible Client -m service -a 'name=nginx state=started enabled=yes' --become
node1 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false,
"enabled": true,
"name": "nginx",
"state": "started",
"status": {
"ActiveEnterTimestamp": "Sat 2019-07-06 08:28:02 EDT",
"ActiveEnterTimestampMonotonic": "31411371",
"ActiveExitTimestampMonotonic": "0",
"ActiveState": "active",
"After": "sysinit.target system.slice systemd-journald.socket basic.target network.target",
"AllowIsolate": "no",
"AmbientCapabilities": "",
"AssertResult": "yes",
"AssertTimestamp": "Sat 2019-07-06 08:27:59 EDT",
"AssertTimestampMonotonic": "27694868",
"Before": "multi-user.target shutdown.target",
"BlockIOAccounting": "no",
"BlockIOWeight": "[not set]",
"CapabilityBoundingSet": "cap_chown cap_dac_override cap_dac_read_search cap_fowner cap_fsetid cap_kill cap_setgid cap_setuid cap_setpcap cap_linux_immutable cap_net_bind_service cap_net_broadcast cap_net_admin cap_net_raw cap_ipc_lock cap_ipc_owner cap_sys_module cap_sys_rawio cap_sys_chroot cap_sys_ptrace cap_sys_pacct cap_sys_admin cap_sys_boot cap_sys_nice cap_sys_resource cap_sys_time cap_sys_tty_config cap_mknod cap_lease cap_audit_write cap_audit_control cap_setfcap cap_mac_override cap_mac_admin cap_syslog cap_wake_alarm cap_block_suspend",
"CollectMode": "inactive",
"ConditionResult": "yes",
"ConditionTimestamp": "Sat 2019-07-06 08:27:59 EDT",
"ConditionTimestampMonotonic": "27694867",
"ConfigurationDirectoryMode": "0755",
"Conflicts": "shutdown.target",
"ControlGroup": "/system.slice/nginx.service",
"ControlPID": "0",
"ExecMainStartTimestamp": "Sat 2019-07-06 08:28:02 EDT",
"ExecMainStartTimestampMonotonic": "31411353",
"ExecMainStatus": "0",
"ExecReload": "{ path=/usr/sbin/nginx ; argv[]=/usr/sbin/nginx -g daemon on; master_process on; -s reload ; ignore_errors=no ; start_time=[n/a] ; stop_time=[n/a] ; pid=0 ; code=(null) ; status=0/0 }",
"ExecStart": "{ path=/usr/sbin/nginx ; argv[]=/usr/sbin/nginx -g daemon on; master_process on; ; ignore_errors=no ; start_time=[n/a] ; stop_time=[n/a] ; pid=0 ; code=(null) ; status=0/0 }",
"ExecStartPre": "{ path=/usr/sbin/nginx ; argv[]=/usr/sbin/nginx -t -q -g daemon on; master_process on; ; ignore_errors=no ; start_time=[n/a] ; stop_time=[n/a] ; pid=0 ; code=(null) ; status=0/0 }",
"ExecStop": "{ path=/sbin/start-stop-daemon ; argv[]=/sbin/start-stop-daemon --quiet --stop --retry QUIT/5 --pidfile /run/nginx.pid ; ignore_errors=yes ; start_time=[n/a] ; stop_time=[n/a] ; pid=0 ; code=(null) ; status=0/0 }",
"FailureAction": "none",
"FileDescriptorStoreMax": "0",
"FragmentPath": "/lib/systemd/system/nginx.service",
"GID": "[not set]",
"GuessMainPID": "yes",
"IOAccounting": "no",
"IOSchedulingClass": "0",
"IOSchedulingPriority": "0",
"IOWeight": "[not set]",
}
}
Sledeća komanda koristi modul za upravljanje servisima kako bi zaustavila Nginx na hostu. Stanje servisa bi trebalo da bude ‘stopped’.
[email protected]:/home/techblog.co.rs# ansible Client -m service -a 'name=nginx state=stopped' --become
node1 | CHANGED => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": true,
"name": "nginx",
"state": "stopped",
"status": {
"ActiveEnterTimestamp": "Sat 2019-07-06 08:28:02 EDT",
"ActiveEnterTimestampMonotonic": "31411371",
"ActiveExitTimestampMonotonic": "0",
"ActiveState": "active",
"After": "sysinit.target system.slice systemd-journald.socket basic.target network.target",
"AllowIsolate": "no",
"AmbientCapabilities": "",
"AssertResult": "yes",
"AssertTimestamp": "Sat 2019-07-06 08:27:59 EDT",
"AssertTimestampMonotonic": "27694868",
"Before": "multi-user.target shutdown.target",
"BlockIOAccounting": "no",
"BlockIOWeight": "[not set]",
"CPUAccounting": "no",
"CPUQuotaPerSecUSec": "infinity",
"CanReload": "yes",
"CanStart": "yes",
"CanStop": "yes",
"CapabilityBoundingSet": "cap_chown cap_dac_override cap_dac_read_search cap_fowner cap_fsetid cap_kill cap_setgid cap_setuid cap_setpcap cap_linux_immutable cap_net_bind_service cap_net_broadcast cap_net_admin cap_net_raw cap_ipc_lock cap_ipc_owner cap_sys_module cap_sys_rawio cap_sys_chroot cap_sys_ptrace cap_sys_pacct cap_sys_admin cap_sys_boot cap_sys_nice cap_sys_resource cap_sys_time cap_sys_tty_config cap_mknod cap_lease cap_audit_write cap_audit_control cap_setfcap cap_mac_override cap_mac_admin cap_syslog cap_wake_alarm cap_block_suspend",
"CollectMode": "inactive",
"ConditionResult": "yes",
"ConditionTimestamp": "Sat 2019-07-06 08:27:59 EDT",
"ConditionTimestampMonotonic": "27694867",
"ConfigurationDirectoryMode": "0755",
"Conflicts": "shutdown.target",
"ControlGroup": "/system.slice/nginx.service",
"ControlPID": "0",
"DefaultDependencies": "yes",
"Delegate": "no",
"Description": "A high performance web server and a reverse proxy server",
"DevicePolicy": "auto",
"Documentation": "man:nginx(8)",
"DynamicUser": "no",
}
}
Provera sistema
Sledeća Ansible ad-hoc komanda koristi shell modul za proveru dostupnog diska na root particijama.
[email protected]:/home/techblog.co.rs# ansible Client -m shell -a 'df -h /dev/sda2' --become
node1 | CHANGED | rc=0 >>
Filesystem Size Used Avail Use% Mounted on
/dev/sda2 923M 113M 748M 14% /boot
Ova komanda koristi shell modul za proveru slobodne RAM memorije na hostu.
[email protected]:/home/techblog.co.rs# ansible Client -m shell -a 'free -m' --become
node1 | CHANGED | rc=0 >>
total used free shared buff/cache available
Mem: 5101 854 2760 27 1487 3947
Swap: 8581 0 8581
Ova komanda proverava vreme neprekidnog rada svakog servera koji je aktivan.
[email