GNU/Linux >> Belajar Linux >  >> Linux

RHCE Ansible Series #2:Menjalankan Perintah Ad-Hoc

Di bagian pertama dari seri Ansible, Anda berkenalan dengan Ansible dan belajar menginstalnya.

Dalam tutorial ini, Anda akan belajar cara mengelola inventaris statis di Ansible. Anda juga akan memahami berbagai pengaturan konfigurasi Ansible.

Selanjutnya, Anda akan menjelajahi beberapa modul Ansible dan Anda akan menjalankan perintah Ansible Ad-Hoc.

Sebelum Anda melihat semua itu, saya ingin berterima kasih kepada semua anggota LHB Pro. Seri Ansible ini dimungkinkan dengan dukungan mereka. Jika Anda belum menjadi anggota pro, harap pertimbangkan untuk berlangganan.

Membuat pengguna yang Memungkinkan

Meskipun Anda dapat menggunakan pengguna root di Ansible untuk menjalankan perintah Ad-Hoc dan playbook, ini jelas tidak direkomendasikan dan tidak dianggap sebagai praktik terbaik karena risiko keamanan yang dapat timbul dengan mengizinkan akses ssh pengguna root.

Karena alasan ini, Anda disarankan untuk membuat pengguna Ansible khusus dengan hak istimewa sudo (untuk semua perintah) di semua host (host kontrol dan terkelola).

Ingat, Ansible menggunakan SSH dan Python untuk melakukan semua pekerjaan kotor di belakang layar, jadi inilah empat langkah yang harus Anda ikuti setelah menginstal Ansible:

  1. Buat pengguna baru di semua host.
  2. Berikan hak istimewa sudo kepada pengguna baru di semua node.
  3. Buat kunci SSH untuk pengguna baru di node kontrol.
  4. Salin kunci publik SSH ke node yang dikelola.

Jadi, tanpa basa-basi lagi, mari kita mulai dengan membuat pengguna baru bernama elliot di semua host:

[[email protected] ~]# useradd -m elliot
[[email protected] ~]# useradd -m elliot
[[email protected] ~]# useradd -m elliot
[[email protected] ~]# useradd -m elliot
[[email protected] ~]# useradd -m elliot

Setelah menyetel elliot kata sandi di semua host, Anda dapat pindah ke langkah 2; Anda dapat memberikan elliot hak istimewa sudo untuk semua perintah tanpa kata sandi dengan menambahkan entri berikut ke /etc/sudoers berkas:

[[email protected] ~]# echo "elliot  ALL=(ALL)  NOPASSWD: ALL" >> /etc/sudoers
[[email protected] ~]# echo "elliot  ALL=(ALL)  NOPASSWD: ALL" >> /etc/sudoers
[[email protected] ~]# echo "elliot  ALL=(ALL)  NOPASSWD: ALL" >> /etc/sudoers
[[email protected] ~]# echo "elliot  ALL=(ALL)  NOPASSWD: ALL" >> /etc/sudoers
[[email protected] ~]# echo "elliot  ALL=(ALL)  NOPASSWD: ALL" >> /etc/sudoers

Sekarang, login sebagai pengguna elliot pada simpul kontrol Anda dan buat pasangan kunci ssh:

[[email protected] ~]$ ssh-keygen 
Generating public/private rsa key pair.
Enter file in which to save the key (/home/elliot/.ssh/id_rsa):       
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /home/elliot/.ssh/id_rsa.
Your public key has been saved in /home/elliot/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:Xf5bKx0kkBCsCQ/7rc6Kv6CxCRTH2XJajbNvpzel+Ik [email protected]
The key's randomart image is:
+---[RSA 3072]----+
|        .oo .    |
|  . ooo  . o     |
| . = *=.o   o    |
|  o =.o+ . o . . |
| . . .. S . . o  |
|.     .. . . . . |
|.. .   oo.o   o o|
|. = o oo++.  . +.|
| + ..++Eoo.   o. |
+----[SHA256]-----+

Terakhir, Anda dapat menyalin elliot kunci ssh publik untuk semua host yang dikelola menggunakan ssh-copy-id perintah sebagai berikut:

[[email protected] ~]$ ssh-copy-id node1
[[email protected] ~]$ ssh-copy-id node2
[[email protected] ~]$ ssh-copy-id node3
[[email protected] ~]$ ssh-copy-id node4

Anda sekarang seharusnya dapat melakukan ssh ke semua node yang dikelola tanpa dimintai kata sandi; Anda hanya akan diminta untuk memasukkan kata sandi ssh (kalau tidak dikosongkan, ha-ha).

Membangun inventaris Ansible Anda

File inventaris Ansible pada dasarnya adalah file yang berisi daftar server, grup server, atau alamat ip yang mereferensikan host yang ingin Anda kelola oleh Ansible (node ​​yang dikelola).

/etc/ansible/hosts adalah file inventaris default. Sekarang saya akan menunjukkan cara membuat file inventaris Anda sendiri di Ansible.

Membuat direktori proyek

Anda tidak ingin mengacaukan /etc/ansible direktori; anda harus menyimpan semuanya di /etc/ansible utuh dan pada dasarnya hanya menggunakannya sebagai referensi saat Anda membuat file inventaris, mengedit file konfigurasi proyek yang memungkinkan, dll.

Sekarang, mari buat direktori proyek Ansible baru dengan nama /home/elliot bernama memainkan yang akan Anda gunakan untuk menyimpan semua hal terkait Ansible Anda (buku pedoman, file inventaris, peran, dll) yang akan Anda buat mulai saat ini dan seterusnya:

[[email protected] ~]$ mkdir /home/elliot/plays

Perhatikan bahwa semua yang akan Anda buat dari titik ini bergerak maju akan berada di node kontrol.

Membuat file inventaris

Ubah ke /home/elliot/plays direktori dan buat file inventaris bernama myhosts dan tambahkan semua hostname node terkelola Anda sehingga akan terlihat seperti ini:

[[email protected] plays]$ cat myhosts 
node1
node2
node3
node4

Anda sekarang dapat menjalankan perintah Ansible berikut untuk mendaftar semua host Anda di myhosts file inventaris:

[[email protected] plays]$ ansible all -i myhosts --list-hosts
  hosts (4):
    node1
    node2
    node3
    node4

-i opsi digunakan untuk menentukan myhosts berkas inventaris. Jika Anda menghilangkan -i opsi, Ansible akan mencari host di /etc/ansible/hosts sebagai gantinya.

Perlu diingat bahwa saya menggunakan nama host di sini dan semua node (vms) yang saya buat di Azure berada di subnet yang sama dan saya tidak perlu khawatir tentang DNS karena ditangani oleh Azure.

Jika Anda tidak memiliki server DNS yang berfungsi, Anda dapat menambahkan entri alamat IP/nama host node Anda di /etc/hosts , di bawah ini contohnya:

Membuat grup dan subgrup host

Anda dapat mengatur host terkelola ke dalam grup dan subgrup. Misalnya, Anda dapat mengedit hosting saya file untuk membuat dua grup test dan prod sebagai berikut:

[[email protected] plays]$ cat myhosts 
[test]
node1
node2

[prod]
node3
node4

Anda dapat membuat daftar host di prod grup dengan menjalankan perintah berikut:

[[email protected] plays]$ ansible prod -i myhosts --list-hosts
  hosts (2):
    node3
    node4

Ada dua grup default di Ansible:

  1. semua - berisi semua host dalam inventaris
  2. tidak dikelompokkan - berisi semua host yang bukan anggota grup mana pun (selain semua).

Mari tambahkan host imajiner node5 ke hosting saya file inventaris untuk mendemonstrasikan tidak dikelompokkan grup:

[[email protected] plays]$ cat myhosts 
node5

[test]
node1
node2

[prod]
node3
node4

Perhatikan bahwa saya menambahkan node5 ke awal (dan bukan akhir) myhosts file, jika tidak, itu akan dianggap sebagai anggota prod grup.

Sekarang Anda dapat menjalankan perintah berikut untuk membuat daftar semua yang tidak dikelompokkan tuan rumah:

[[email protected] plays]$ ansible ungrouped -i myhosts --list-hosts
  hosts (1):
    node5

Anda juga dapat membuat grup (induk) yang berisi subgrup (anak). Perhatikan contoh berikut:

[[email protected] plays]$ cat myhosts 
[web_dev]
node1

[web_prod]
node2

[db_dev]
node3

[db_prod]
node4

[development:children]
web_dev
db_dev

[production:children]
web_prod
db_prod 

Pengembangan grup berisi semua host yang ada di web_dev ditambah semua anggota yang ada di db_dev . Demikian pula, produksi grup berisi semua host yang ada di web_prod ditambah semua anggota yang ada di db_prod.

[[email protected] plays]$ ansible development -i myhosts --list-hosts
  hosts (2):
    node1
    node3

[[email protected] plays]$ ansible production -i myhosts --list-hosts
  hosts (2):
    node2
    node4

Mengonfigurasi Kemungkinan

Di bagian ini, Anda akan mempelajari tentang pengaturan konfigurasi Ansible yang paling penting. Sepanjang, seluruh seri, Anda akan mendiskusikan pengaturan konfigurasi lainnya bila diperlukan.

/etc/ansible/ansible.cfg adalah file konfigurasi default. Namun, Anda juga disarankan untuk tidak mengacaukan /etc/ansible/ansible.cfg dan hanya menggunakannya sebagai referensi. Anda harus membuat file konfigurasi Ansible Anda sendiri di direktori proyek Ansible Anda.

yang memungkinkan --versi perintah akan menunjukkan kepada Anda file konfigurasi mana yang sedang Anda gunakan:

[[email protected] plays]$ ansible --version
ansible 2.9.14
  config file = /etc/ansible/ansible.cfg
  configured module search path = ['/home/elliot/.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, Dec  5 2019, 15:45:45) [GCC 8.3.1 20191121 (Red Hat 8.3.1-5)]

Seperti yang Anda lihat dari output, /etc/ansible/ansible.cfg sedang digunakan karena Anda belum membuat ansible.cfg Anda sendiri file di direktori proyek.

/etc/ansible/ansible.cfg berisi keseluruhan berbagai pengaturan dan bagian konfigurasi yang memungkinkan:

[[email protected] plays]$ wc -l /etc/ansible/ansible.cfg 
490 /etc/ansible/ansible.cfg

Dua bagian terpenting yang perlu Anda tentukan dalam file konfigurasi Ansible adalah:

  1. [default]
  2. [eskalasi_privilege]

Di [default] berikut adalah pengaturan terpenting yang perlu Anda ketahui:

  • persediaan - menentukan jalur file inventaris Anda.
  • pengguna_jarak jauh - menentukan pengguna yang akan terhubung ke host terkelola dan menjalankan playbook.
  • garpu - menentukan jumlah host yang Ansible dapat kelola/proses secara paralel; defaultnya adalah 5.
  • pemeriksaan_kunci_host - menentukan apakah Anda ingin mengaktifkan/menonaktifkan pemeriksaan host kunci SSH; defaultnya adalah True.

Dalam [privilege_escalation] bagian, Anda dapat mengonfigurasi pengaturan berikut:

  • menjadi - tentukan tempat untuk mengizinkan/melarang eskalasi hak istimewa; defaultnya Salah.
  • menjadi_metode - tentukan metode eskalasi hak istimewa; defaultnya adalah sudo.
  • menjadi_pengguna - tentukan pengguna Anda melalui eskalasi hak istimewa; defaultnya adalah root.
  • menjadi_ask_pass - tentukan apakah akan meminta atau tidak meminta kata sandi eskalasi hak istimewa; defaultnya Salah.

Perlu diingat, Anda tidak perlu memasukkan pengaturan ini ke memori. Semuanya didokumentasikan di /etc/ansible/ansible.cfg .

Sekarang buat ansible.cfg Anda sendiri file konfigurasi di direktori proyek Ansible Anda /home/elliot/plays dan atur pengaturan berikut:

Sekarang jalankan ansible --version perintah sekali lagi; Anda akan melihat bahwa file konfigurasi baru Anda sekarang berlaku:

[[email protected] plays]$ ansible --version
ansible 2.9.14
  config file = /home/elliot/plays/ansible.cfg
  configured module search path = ['/home/elliot/.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, Dec  5 2019, 15:45:45) [GCC 8.3.1 20191121 (Red Hat 8.3.1-5)]

Menjalankan Perintah Ad-Hoc di Ansible

Sampai saat ini, Anda benar-benar baru saja menginstal, mengatur lingkungan Anda, dan mengonfigurasi Ansible. Sekarang, kesenangan sesungguhnya dimulai!

Perintah ad-hoc yang memungkinkan adalah alat hebat yang dapat Anda gunakan untuk menjalankan satu tugas pada satu atau lebih node terkelola. Perintah ad-hoc Ansible yang khas mengikuti sintaks umum:

ansible host_pattern -m module_name -a "module_options"

Cara termudah untuk memahami cara kerja perintah ad-hoc Ansible adalah dengan menjalankannya! Jadi, lanjutkan dan jalankan perintah ad-hoc berikut:

[[email protected] plays]$ ansible node1 -m command -a "uptime"
Enter passphrase for key '/home/elliot/.ssh/id_rsa':
node1 | CHANGED | rc=0 >>
18:53:01 up 5 days, 18:03,  1 user,  load average: 0.00, 0.01, 0.00

Saya diminta untuk memasukkan frasa sandi kunci ssh saya dan kemudian waktu aktif node1 ditampilkan! Sekarang, periksa gambar di bawah ini untuk membantu Anda memahami setiap elemen dari perintah ad-hoc yang baru saja Anda jalankan:

Anda mungkin sudah menebaknya sekarang; modul yang memungkinkan adalah skrip mandiri yang dapat digunakan kembali yang dapat digunakan oleh Ansible API , atau dengan mungkin atau mungkin - buku pedoman program.

Modul perintah adalah salah satu dari banyak modul yang ditawarkan Ansible. Anda dapat menjalankan ansible-doc -l perintah untuk membuat daftar semua modul Ansible yang tersedia:

[[email protected] plays]$ ansible-doc -l | wc -l
3387

Saat ini, ada 3387 modul Ansible yang tersedia, dan bertambah dari hari ke hari! Anda dapat meneruskan cara perintah apa pun yang ingin Anda jalankan sebagai opsi ke modul perintah Ansible.

Jika Anda tidak memiliki frasa sandi kunci ssh kosong (seperti saya); maka Anda harus menjalankan ssh-agent untuk menghindari sakit kepala yang tidak perlu karena dimintai frasa sandi setiap kali Anda dapat mencoba mengakses node yang Anda kelola:

[[email protected] plays]$ eval `ssh-agent`
Agent pid 218750
[[email protected] plays]$ ssh-add
Enter passphrase for /home/elliot/.ssh/id_rsa: 
Identity added: /home/elliot/.ssh/id_rsa ([email protected])

Menguji Konektivitas

Anda mungkin ingin menguji apakah Ansible dapat terhubung ke semua node terkelola Anda sebelum masuk ke tugas yang lebih serius; untuk ini, Anda dapat menggunakan ping module dan tentukan semua host terkelola Anda sebagai berikut:

[[email protected] plays]$ ansible all -m ping 
node4 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    },
    "changed": false,
    "ping": "pong"
}
node3 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/libexec/platform-python"
    },
    "changed": false,
    "ping": "pong"
}
node1 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/libexec/platform-python"
    },
    "changed": false,
    "ping": "pong"
}
node2 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/libexec/platform-python"
    },
    "changed": false,
    "ping": "pong"
}

Seperti yang Anda lihat dengan semua SUKSES di output. Perhatikan bahwa kemungkinan ping modul tidak memerlukan opsi apa pun. Beberapa modul Ansible memerlukan opsi dan beberapa tidak, seperti halnya dengan perintah Linux.

Dokumentasi Modul yang Mungkin

Jika seseorang bertanya kepada saya apa yang paling Anda sukai dari Ansible; Saya akan segera mengatakan itu adalah dokumentasinya. Ansible didokumentasikan dengan sangat baik dan semuanya dari kenyamanan terminal Anda sendiri.

Jika Anda ingin cara menggunakan modul Ansible tertentu, Anda dapat menjalankan ansible-doc diikuti dengan nama modul.

Misalnya, Anda dapat melihat deskripsi ping modul dan cara menggunakannya dengan menjalankan:

[[email protected] plays]$ ansible-doc ping

Ini akan membuka ping halaman dokumentasi modul:

Saat membaca dokumentasi modul, perhatikan secara khusus untuk melihat apakah ada opsi yang diawali dengan tanda sama dengan (=). Dalam hal ini, ini adalah opsi wajib yang harus Anda sertakan.

Selain itu, jika Anda menggulir ke bawah, Anda dapat melihat beberapa contoh cara menjalankan perintah ad-hoc atau Playbook Ansible (yang akan kita bahas nanti).

Perintah vs. Shell vs. Modul Mentah

Ada tiga modul Ansible yang sering membingungkan orang satu sama lain; ini adalah:

  1. perintah
  2. kulit
  3. mentah

Ketiga modul tersebut mencapai tujuan yang sama; mereka menjalankan perintah pada node yang dikelola. Namun ada perbedaan utama yang membedakan ketiga modul tersebut.

Anda tidak dapat menggunakan pemipaan atau pengalihan dengan perintah modul. Misalnya, perintah ad-hoc berikut akan menghasilkan kesalahan:

[[email protected] plays]$ ansible node2 -m command -a "lscpu | head -n 5"
node2 | FAILED | rc=1 >>
lscpu: invalid option -- 'n'
Try 'lscpu --help' for more information.non-zero return code

Itu karena perintah modul tidak mendukung pipa atau pengalihan. Anda dapat menggunakan modul shell sebagai gantinya jika Anda ingin menggunakan pipa atau pengalihan. Jalankan perintah yang sama lagi, tetapi kali ini, gunakan shell modul sebagai gantinya:

[[email protected] plays]$ ansible node2 -m shell -a "lscpu | head -n 5"
node2 | CHANGED | rc=0 >>
Architecture:        x86_64
CPU op-mode(s):      32-bit, 64-bit
Byte Order:          Little Endian
CPU(s):              1
On-line CPU(s) list: 0

Bekerja seperti pesona! Ini berhasil menampilkan lima baris pertama dari output perintah lscpu pada node2.

Ansible menggunakan skrip SSH dan Python di belakang layar untuk melakukan semua keajaiban. Sekarang, mentah modul hanya menggunakan SSH dan melewati subsistem modul Ansible. Dengan cara ini, modul mentah tersebut akan berhasil bekerja pada node yang dikelola meskipun python tidak diinstal (pada node yang dikelola).

Saya mengutak-atik binari python saya di node4 (jangan lakukan itu sendiri) jadi saya bisa meniru skenario apa yang akan terjadi jika Anda menjalankan shell atau perintah modul pada node yang tidak menginstal python:

[email protected]:/usr/bin# mkdir hide
[email protected]:/usr/bin# mv python* hide/

Sekarang periksa apa yang akan terjadi jika saya menjalankan Ansible ad-hoc dengan shell atau perintah modul penargetan node4:

[[email protected] plays]$ ansible node4 -m shell -a "whoami"
node4 | FAILED! => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    },
    "changed": false,
    "module_stderr": "Shared connection to node4 closed.\r\n",
    "module_stdout": "/bin/sh: 1: /usr/bin/python: not found\r\n",
}
[[email protected] plays]$ ansible node4 -m command -a "cat /etc/os-release"
node4 | FAILED! => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    },
    "changed": false,
    "module_stderr": "Shared connection to node4 closed.\r\n",
    "module_stdout": "/bin/sh: 1: /usr/bin/python: not found\r\n",
    "msg": "The module failed to execute correctly, you probably need to set the interpreter.\nSee stdout/stderr for the exact error",
    "rc": 127
}

Saya mendapatkan kesalahan! Sekarang saya akan mencoba untuk mencapai tugas yang sama; tapi kali ini, saya akan menggunakan mentah modul:

[[email protected] plays]$ ansible node4 -m raw -a "cat /etc/os-release"
node4 | CHANGED | rc=0 >>
NAME="Ubuntu"
VERSION="18.04.5 LTS (Bionic Beaver)"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 18.04.5 LTS"
VERSION_ID="18.04"
HOME_URL="https://www.ubuntu.com/"
SUPPORT_URL="https://help.ubuntu.com/"
BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
VERSION_CODENAME=bionic
UBUNTU_CODENAME=bionic
Shared connection to node4 closed.

Seperti yang Anda lihat, modul mentah adalah satu-satunya modul dari tiga modul untuk melakukan tugas dengan sukses. Sekarang saya akan kembali memperbaiki kekacauan yang saya lakukan di node4:

[email protected]:/usr/bin/hide# mv * ..

Saya telah membuat tabel di bawah ini untuk membantu meringkas kasus penggunaan yang berbeda untuk ketiga modul:

Deskripsi Perintah Cangkang Mentah
Jalankan perintah sederhana Ya Ya Ya
Jalankan perintah dengan pengalihan Tidak Ya Ya
Jalankan perintah tanpa Python Tidak Tidak Ya

Baiklah! Ini membawa kita ke akhir tutorial Ansible kedua.

Nantikan tutorial berikutnya karena Anda akan mempelajari cara membuat dan menjalankan buku pedoman yang memungkinkan. Jangan lupa jadi anggota :)


Linux
  1. RHCE Ansible Series #8:Mengenkripsi Konten Dengan Ansible Vault

  2. Seri Ansible RHCE #7:Template Jinja2

  3. RHCE Ansible Series #6:Pengambilan Keputusan di Ansible

  1. RHCE Ansible Series #5:Ansible Loops

  2. RHCE Ansible Series #4:Variabel Ansible, Fakta dan Register

  3. RHCE Ansible Series #11:Mengelola Sistem Dengan Ansible

  1. RHCE Ansible Series #10:Peran Sistem RHEL

  2. Seri Ansible RHCE #9:Peran yang Mungkin

  3. Menjalankan perintah terminal loop di Jupyter