Trong hướng dẫn này, bạn sẽ tìm hiểu về một số lệnh adhoc Ansible được các kỹ sư hệ thống và devops sử dụng.

Các lệnh Adhoc là các lệnh bạn chạy từ dòng lệnh, bên ngoài playbook. Các lệnh này chạy trên một hoặc nhiều nút được quản lý và thực hiện một tác vụ đơn giản/nhanh chóng–thường là các tác vụ mà bạn không cần phải lặp lại. Ví dụ, nếu bạn muốn tải lại Apache trên một cụm máy chủ web, bạn có thể chạy một lệnh adhoc duy nhất để thực hiện tác vụ đó.

Ghi chú:Trong Ansible, tất cả các mô-đun có thể được thực thi trong playbook hoặc thông qua lệnh adhoc.

Cú pháp cơ bản để gọi lệnh adhoc là:

ansible host_pattern -m module_name -a "module_options"

Trước khi bạn bắt đầu

Để chạy các lệnh trong hướng dẫn này, bạn sẽ cần:

Ghi chú: Làm theo hướng dẫn Tạo phiên bản máy tính để được trợ giúp khi tạo Linode.

Các lệnh trong hướng dẫn này sẽ được chạy từ nút điều khiển và sẽ nhắm mục tiêu đến máy chủ có tên là Client. Kho lưu trữ Ansible của nút điều khiển của bạn phải được cấu hình sao cho ít nhất một trong các nút được quản lý của bạn có tên này. Phần Tạo kho lưu trữ Ansible của hướng dẫn Bắt đầu với Ansible phác thảo cách thiết lập tệp kho lưu trữ.

Ghi chú: Ngoài ra, bạn có thể sửa đổi các lệnh trong hướng dẫn này để sử dụng tên máy chủ khác.

Lệnh cơ bản

Ping

Để kiểm tra xem bạn có thể truy cập vào nút được quản lý của mình hay không, hãy sử dụng pingmô-đun :

ansible -m ping Client
node1 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    },
    "changed": false,
    "ping": "pong"
}

Chạy với sự leo thang đặc quyền

Lệnh adhoc này chứng minh cách người dùng không phải root trên nút được quản lý có thể có được các đặc quyền của người dùng root khi thực thi một mô-đun. Cụ thể, ví dụ này cho thấy cách sử dụng leo thang đặc quyền để chạy fdisklệnh thông qua shellmô-đun :

ansible Client -m shell -a 'fdisk -l' -u non_root_user --become -K
BECOME password:
node1 | CHANGED | rc=0 >>
Disk /dev/sda: 79.51 GiB, 85362475008 bytes, 166723584 sectors
Disk model: QEMU HARDDISK
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/sdb: 512 MiB, 536870912 bytes, 1048576 sectors
Disk model: QEMU HARDDISK
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
  • Tùy chọn này -uđược sử dụng để chỉ định người dùng trên nút được quản lý.
  • Ghi chúTheo mặc định, Ansible sẽ cố gắng thiết lập kết nối đến nút được quản lý dưới cùng một người dùng mà bạn thực thi Ansible CLI trên nút điều khiển.
  • Tùy chọn này --becomeđược sử dụng để thực thi lệnh với quyền của người dùng root.
  • Tùy chọn này -Kđược sử dụng để nhắc nhập mật khẩu nâng cao đặc quyền của người dùng.

Khởi động lại một nút được quản lý

Dưới đây là lệnh khởi động lại nút được quản lý:

ansible Client -a "/sbin/reboot" -f 1

Lệnh này bỏ qua -mtùy chọn chỉ định mô-đun. Khi mô-đun không được chỉ định, mô command-đun sẽ là mặc định được sử dụng.

Module này commandtương tự như shellmodule ở chỗ cả hai đều sẽ thực thi lệnh mà bạn truyền cho nó. Module shellsẽ chạy lệnh thông qua shell trên nút được quản lý, trong khi commandmodule sẽ không chạy lệnh thông qua shell.

Ghi chú: Tùy chọn này -fđược sử dụng để xác định số nhánh mà Ansible sẽ sử dụng trên nút điều khiển khi chạy lệnh của bạn.

Ghi chú: Nếu nút được quản lý của bạn là Linode, thì cần phải bật chức năng giám sát tắt máy của Linode là Lassie để khởi động lại thành công. Điều này là do Linode không thể tự bật – thay vào đó, môi trường máy chủ của Linode phải khởi động Linode.

Hệ thống thu thập chẩn đoán

Kiểm tra dung lượng đĩa trống

Lệnh này được sử dụng để kiểm tra dung lượng đĩa trống trên tất cả các đĩa được gắn kết của một nút được quản lý. Lệnh này liệt kê tất cả các hệ thống tệp có trên nút được quản lý cùng với kích thước hệ thống tệp, dung lượng đã sử dụng và dung lượng khả dụng theo định dạng mà con người có thể đọc được:

ansible Client -a "df -h"
node1 | CHANGED | rc=0 >>
Filesystem      Size  Used Avail Use% Mounted on
udev            1.9G     0  1.9G   0% /dev
tmpfs           394M  596K  394M   1% /run
/dev/sda         79G  2.6G   72G   4% /
tmpfs           2.0G  124K  2.0G   1% /dev/shm
tmpfs           5.0M     0  5.0M   0% /run/lock
tmpfs           2.0G     0  2.0G   0% /sys/fs/cgroup
tmpfs           394M     0  394M   0% /run/user/0

Lệnh này kiểm tra không gian khả dụng và đã sử dụng trên một hệ thống tệp cụ thể:

ansible Client -m shell -a 'df -h /dev/sda'
node1 | CHANGED | rc=0 >>
Filesystem      Size  Used Avail Use% Mounted on
/dev/sda         79G  2.6G   72G   4% /

Kiểm tra bộ nhớ và sử dụng CPU

Sử dụng freelệnh với shellmô-đun để xem bộ nhớ trống và đã sử dụng của nút được quản lý của bạn tính theo megabyte:

ansible Client -m shell -a 'free -m'
node1 | CHANGED | rc=0 >>
              total        used        free      shared  buff/cache   available
Mem:           3936         190        3553           0         192        3523
Swap:           511           0         511

Sử dụng mpstatlệnh với shellmodule để kiểm tra mức sử dụng CPU:

ansible Client -m shell -a 'mpstat -P ALL'
node1 | CHANGED | rc=0 >>
Linux 5.3.0-40-generic (localhost)      03/21/2020      _x86_64_        (2 CPU)

07:41:27 PM  CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest  %gnice   %idle
07:41:27 PM  all    0.96    0.00    0.72    0.08    0.00    0.02    0.01    0.00    0.00   98.21
07:41:27 PM    0    0.93    0.00    0.73    0.06    0.00    0.03    0.01    0.00    0.00   98.24
07:41:27 PM    1    1.00    0.00    0.71    0.09    0.00    0.01    0.01    0.00    0.00   98.17

Kiểm tra thời gian hoạt động của hệ thống

Lệnh Ansible này sẽ hiển thị thời gian các nút được quản lý của bạn đã hoạt động:

ansible Client -a "uptime"
node1 | CHANGED | rc=0 >>
 19:40:11 up 8 min,  2 users,  load average: 0.00, 0.02, 0.00

Chuyển tập tin

Sao chép tập tin

copyMô-đun này được sử dụng để chuyển tệp hoặc thư mục từ nút điều khiển đến các nút được quản lý của bạn bằng cách xác định đường dẫn nguồn và đích. Bạn có thể xác định chủ sở hữu tệp và quyền tệp trong lệnh:

cd ~
echo "Hello World" > test.txt
ansible Client -m copy -a 'src=test.txt dest=/etc/ owner=root mode=0644' -u non_root_user --become -K
BECOME password:
node1 | CHANGED => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    },
    "changed": true,
    "checksum": "13577023221e91069c21d8f10a4b90f8192d6a26",
    "dest": "/etc/test",
    "gid": 0,
    "group": "root",
    "md5sum": "eb662c21e683b643f0fcb5997d7bbccf",
    "mode": "0644",
    "owner": "root",
    "size": 18,
    "src": "/root/.ansible/tmp/ansible-tmp-1584820375.14-54524496813834/source",
    "state": "file",
    "uid": 0
}

Bạn cũng có thể sử dụng Ansible để kiểm tra xem tệp của bạn có được sao chép đến vị trí đích hay không:

sudo ansible Client -m shell -a 'ls -l /etc/test*'
node1 | CHANGED | rc=0 >>
-rw-r--r-- 1 root root 12 Jun  1 22:35 /etc/test.txt

Lấy tập tin

fetchModule này được sử dụng để chuyển một tệp từ một nút được quản lý sang nút điều khiển. Sau khi lệnh chạy thành công, changedbiến trong đầu ra của Ansible sẽ được đặt thành true.

ansible Client -m fetch -a 'src=/etc/test.txt dest=/etc/'
node1 | CHANGED => {
    "changed": true,
    "checksum": "648a6a6ffffdaa0badb23b8baf90b6168dd16b3a",
    "dest": "/etc/192.0.2.4/etc/test.txt",
    "md5sum": "e59ff97941044f85df5297e1c302d260",
    "remote_checksum": "648a6a6ffffdaa0badb23b8baf90b6168dd16b3a",
    "remote_md5sum": null
}

Lưu ý rằng tệp đã tải xuống được đặt vào /etc/192.0.2.4/etc/test.txt. Theo mặc định, fetchmô-đun sẽ đặt các tệp đã tải xuống vào các thư mục riêng biệt cho mỗi tên máy chủ mà bạn đang tải xuống. Điều này ngăn không cho tệp từ một nút được quản lý ghi đè lên tệp từ một nút được quản lý khác.

Để tránh tạo các thư mục này, hãy thêm flat=yestùy chọn:

ansible Client -m fetch -a 'src=/etc/test.txt dest=/etc/ flat=yes'
node1 | SUCCESS => {
    "changed": false,
    "checksum": "648a6a6ffffdaa0badb23b8baf90b6168dd16b3a",
    "dest": "/etc/test.txt",
    "file": "/etc/test.txt",
    "md5sum": "e59ff97941044f85df5297e1c302d260"
}

Tạo thư mục

fileModule này được sử dụng để tạo, xóa và thiết lập quyền trên các tệp và thư mục, và tạo liên kết tượng trưng. Lệnh này sẽ tạo một thư mục tại /root/linode/new/trên nút được quản lý với chủ sở hữu và quyền được xác định trong các tùy chọn:

ansible Client -m file -a "dest=/root/linode/new/ mode=755 owner=root group=root state=directory" -u non_root_user --become -K
node1 | CHANGED => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    },
    "changed": true,
    "gid": 0,
    "group": "root",
    "mode": "0755",
    "owner": "root",
    "path": "/root/linode/new",
    "size": 4096,
    "state": "directory",
    "uid": 0
}

Lưu ý rằng tất cả các thư mục trung gian không tồn tại cũng sẽ được tạo. Trong ví dụ này, nếu thư linode/mục con chưa tồn tại thì nó đã được tạo.

Quản lý các gói

Cài đặt một gói

packageModule này có thể được sử dụng để cài đặt một gói mới trên nút được quản lý. Lệnh này cài đặt phiên bản mới nhất của NGINX:

ansible Client -m package -a 'name=nginx state=present' -u non_root_user --become -K
node1 | CHANGED => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    },
    "cache_update_time": 1584821061,
    "cache_updated": false,
    "changed": true,
    "stderr": "",
    "stderr_lines": [],
    "stdout": "Reading package lists...\nBuilding dependency tree...
        "Unpacking nginx (1.16.1-0ubuntu2.1) ...",
        "Setting up libxpm4:amd64 (1:3.5.12-1) ...",
        "Setting up nginx-common (1.16.1-0ubuntu2.1) ...",
        "Setting up nginx-core (1.16.1-0ubuntu2.1) ...",
        "Setting up nginx (1.16.1-0ubuntu2.1) ...",
    ]
}

Ghi chú: Mô package-đun hoạt động trên nhiều bản phân phối. Ngoài ra còn có các mô-đun cho các trình quản lý gói cụ thể (ví dụ: mô apt-đun và yummô-đun ). Các mô-đun này cung cấp nhiều tùy chọn hơn dành riêng cho các trình quản lý gói đó.

Gỡ cài đặt một gói

Để gỡ cài đặt một gói, hãy thiết lập state=absentcác tùy chọn của lệnh:

ansible Client -m package -a 'name=nginx state=absent' -u non_root_user --become -K
node1 | CHANGED => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    },
    "changed": true,
    "stderr": "",
    "stderr_lines": [],
    "stdout": "Reading package lists...\nBuilding dependency tree …
        "  nginx-core",
        "Use 'sudo apt autoremove' to remove them.",
        "The following packages will be REMOVED:",
        "  nginx*",
        "Removing nginx (1.16.1-0ubuntu2.1) ..."
    ]
}

Quản lý dịch vụ

Bắt đầu một dịch vụ

Sử dụng servicemô-đun để bắt đầu một dịch vụ trên nút được quản lý. Lệnh này sẽ bắt đầu và kích hoạt dịch vụ NGINX:

ansible Client -m service -a 'name=nginx state=started enabled=yes' -u non_root_user --become -K
node1 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    },
    "changed": false,
    "enabled": true,
    "name": "nginx",
    "state": "started",
    "status": {
        "ActiveEnterTimestamp": "Sat 2020-03-21 20:04:35 UTC",
        "ActiveEnterTimestampMonotonic": "1999615481",
        "ActiveExitTimestampMonotonic": "0",
        "ActiveState": "active",
        "After": "system.slice systemd-journald.socket network.target sysinit.target basic.target",
        "AllowIsolate": "no",
        "AmbientCapabilities": "",
        "AssertResult": "yes",
        "AssertTimestamp": "Sat 2020-03-21 20:04:35 UTC",
        "AssertTimestampMonotonic": "1999560256",
        "Before": "multi-user.target shutdown.target",
    }
}

Dừng một dịch vụ

Khi bạn thay đổi trạng thái thành đã dừng , dịch vụ sẽ ngừng chạy.

ansible Client -m service -a 'name=nginx state=stopped' -u non_root_user --become -K
node1 | CHANGED => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    },
    "changed": true,
    "name": "nginx",
    "state": "stopped",
    "status": {
        "ActiveEnterTimestamp": "Sat 2020-03-21 20:04:35 UTC",
        "ActiveEnterTimestampMonotonic": "1999615481",
        "ActiveExitTimestampMonotonic": "0",
        "ActiveState": "active",
        "After": "system.slice systemd-journald.socket network.target sysinit.target basic.target",
        "AllowIsolate": "no",
        "AmbientCapabilities": "",
        "AssertResult": "yes",
        "AssertTimestamp": "Sat 2020-03-21 20:04:35 UTC",
}
}

Thu thập sự thật

setupMô-đun này có thể được sử dụng để thu thập thông tin về các nút được quản lý của bạn:

ansible Client -m setup
node1 | SUCCESS => {
    "ansible_facts": {
        "ansible_all_ipv4_addresses": [
            "192.0.2.4"
        ],
        "ansible_all_ipv6_addresses": [
            "2400:8904::f03c:92ff:fee9:dcb3",
            "fe80::f03c:92ff:fee9:dcb3"
        ],
        "ansible_apparmor": {
            "status": "enabled"
        },
        "ansible_architecture": "x86_64",
        "ansible_bios_date": "04/01/2014",
        "ansible_bios_version": "rel-1.12.0-0-ga698c8995f-prebuilt.qemu.org",
        "ansible_cmdline": {
            "BOOT_IMAGE": "/boot/vmlinuz-5.3.0-40-generic",
            "console": "ttyS0,19200n8",
            "net.ifnames": "0",
            "ro": true,
            "root": "/dev/sda"
        },
        "ansible_date_time": {
            "date": "2020-03-21",
            "day": "21",
            "epoch": "1584821656",
            "hour": "20",
            "iso8601": "2020-03-21T20:14:16Z",
            "iso8601_basic": "20200321T201416267047",
            "iso8601_basic_short": "20200321T201416",
            "iso8601_micro": "2020-03-21T20:14:16.267127Z",
            "minute": "14",
            "month": "03",
            "second": "16",
            "time": "20:14:16",
            "tz": "UTC",
            "tz_offset": "+0000",
            "weekday": "Saturday",
            "weekday_number": "6",
            "weeknumber": "11",
            "year": "2020"
        },
        "ansible_default_ipv4": {
            "address": "192.0.2.4",
            "alias": "eth0",
            "broadcast": "192.0.2.255",
            "gateway": "192.0.2.1",
            "interface": "eth0",
            "macaddress": "f2:3c:92:e9:dc:b3",
            "mtu": 1500,
            "netmask": "255.255.255.0",
            "network": "192.0.2.0",
            "type": "ether"
        },
        "gather_subset": [
            "all"
        ],
        "module_setup": true
    },
    "changed": false
}

Lọc sự kiện

Sử dụng filtertùy chọn với setupmodule sẽ giới hạn những gì module trả về. Lệnh này liệt kê chi tiết các bản phân phối đã cài đặt của các nút được quản lý của bạn:

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": "19",
        "ansible_distribution_release": "eoan",
        "ansible_distribution_version": "19.10",
        "discovered_interpreter_python": "/usr/bin/python"
    },
    "changed": false
}

Nguồn: https://www.linode.com/docs/guides/ansible-adhoc-commands/