Ansible Ad-hoc kommandoguide med exempel

By rik

Introduktion till Ansible Ad-hoc Kommandon

I Ansible används ad-hoc kommandon för att direkt utföra uppgifter utan att de behöver sparas för framtida bruk. Denna artikel utforskar användningen av Ansible ad-hoc kommandon.

Många uppgifter i Ansible kräver inte en separat spelbok; istället kan man använda ett lämpligt ad-hoc kommando. Dessa kommandon är ”enraders” för att utföra en specifik operation på en eller flera målvärdar. Kommandona hittas i katalogen /usr/bin/ansible.

Vanliga uppgifter som att testa anslutningen till värdar med ping, kopiera filer, starta om servrar eller installera paket kan enkelt genomföras med Ansible ad-hoc kommandon. Här följer en lista över grundläggande ad-hoc kommandon som är bra att känna till.

Grundläggande kommandon

Följande ad-hoc kommando använder ping-modulen för att testa alla värdar i inventeringsfilen. Flaggan ’-m’ specificerar vilken modul som ska användas.

    [email protected]:/home/adminvista.com# ansible all -m ping
    node1 | SUCCESS => {
        "ansible_facts": {
            "discovered_interpreter_python": "/usr/bin/python"
        },
        "changed": false,
        "ping": "pong"
    }
  

Kommandot nedan anropar setup-modulen på en grupp av värdar, ’Client’, specificerad i inventeringsfilen ’/etc/ansible/hosts’.

    [email protected]:/home/adminvista.com# 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
    }
  

Detta kommando kräver SSH lösenordsautentisering. Lägg till flaggan ’–ask-pass’ i slutet av kommandot för att bli ombedd att ange lösenordet.

    [email protected]:/home/adminvista.com# ansible Client -m ping --ask-pass
    SSH password:
    node1 | SUCCESS => {
        "ansible_facts": {
            "discovered_interpreter_python": "/usr/bin/python"
        },
        "changed": false,
        "ping": "pong"
    }
  

Följande kommando ger möjligheten att köra ad-hoc kommandon som en icke-root användare med root-privilegier. Flaggan ’–become’ ger root-rättigheter och ’-K’ frågar efter sudo-lösenordet.

    [email protected]:/home/adminvista.com# ansible Client -m shell -a 'fdisk -l' -u adminvista.com --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
  

Detta ad-hoc kommando startar om systemet med hjälp av ’-f’ för att ange antalet ”forks” (parallella processer).

    [email protected]:/home/adminvista.com# ansible Client -a "/sbin/reboot" -f 1
  

Filöverföring

Följande Ansible ad-hoc kommando används för att kopiera en fil från en källa till en destination för en definierad grupp av värdar. När lösenordet har angetts kommer utdata visa parametern ”changed” som ”true”, vilket indikerar att filen har kopierats.

    [email protected]:/home/adminvista.com# ansible Client -m copy -a 'src=/home/adminvista.com/nginx.yml dest=/home/adminvista.com/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/adminvista.com/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
    }
  

Använd följande kommando för att verifiera att kopieringsmodulen fungerade korrekt. Den kopierade filen ska finnas på den angivna destinationen.

    [email protected]:/home/adminvista.com# ls Desktop/
    nginx.yml
  

En ny katalog skapas för att använda hämtningsmodulen i nästa ad-hoc kommando.

    [email protected]:/home/adminvista.com# mkdir example
    [email protected]:/home/adminvista.com# ls
    Desktop  Documents  example  examples.desktop  nginx_new.yml  nginx.yml
  

Detta ad-hoc kommando används för att ladda ned en fil från en värd. I detta fall hämtas en fil från servern ”node1” till en lokal destination.

    [email protected]:/home/adminvista.com# ansible node1 -m fetch -a 'src=/etc/sudoers.d/nginx.yml dest=/home/adminvista.com/example/ flat=yes'
    node1 | SUCCESS => {
        "changed": false,
        "checksum": "5631822866afd5f19b928edb3ba018385df22dd3",
        "dest": "/home/adminvista.com/example/nginx.yml",
        "file": "/etc/sudoers.d/nginx.yml",
        "md5sum": "0d6ffe1069fc25ad4f8ad700277c4634"
    }
  

Kontrollera att filen har laddats ner till den specificerade destinationen.

    [email protected]:/home/adminvista.com# ls example
    nginx.yml
  

Pakethantering

Kommandot nedan installerar Nginx på en grupp av värdar, ”Client”, med hjälp av apt-modulen.

    [email protected]:/home/adminvista.com# 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
    }
  

Följande kommando avinstallerar Nginx från samma grupp av värdar med apt-modulen och rensar relaterad konfiguration.

    [email protected]:/home/adminvista.com# 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) ..."
        ]
    }
  

Tjänstehantering

Detta ad-hoc kommando använder tjänstemodulen för att starta Nginx på de angivna värdarna. Statusen är ”started”.

    [email protected]:/home/adminvista.com# 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]",
        }
    }
  

Följande kommando stoppar Nginx-tjänsten. Statusen blir ”stopped”.

    [email protected]:/home/adminvista.com# 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",
        }
    }
  

Systemkontroll

Följande ad-hoc kommando använder shell-modulen för att kontrollera tillgängligt diskutrymme på rotpartitionen.

    [email protected]:/home/adminvista.com# 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
  

Detta kommando använder shell-modulen för att kontrollera tillgängligt minne (RAM) på servern.

    [email protected]:/home/adminvista.com# 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
  

Detta kommando visar driftstiden för den angivna servern.

    [email protected]:/home/adminvista.com# ansible Client -a "uptime"
    node1 | CHANGED | rc=0 >>
     11:31:17 up 1 day,  2:40,  2 users,  load average: 0.23, 0.05, 0.02
  

Hämta fakta

Detta ad-hoc kommando hämtar all systeminformation, inklusive alla variabler som finns på systemet.

    [email protected]:/home/adminvista.com# ansible all -m setup
    node1 | SUCCESS => {
        "ansible_facts": {
            "ansible_all_ipv4_addresses": [
                "172.17.0.1",
                "10.0.2.15"
            ],
            "ansible_all_ipv6_addresses": [
                "fe80::763e:c0b4:14df:b273"
            ],
            "ansible_apparmor": {
                "status": "enabled"
            },
            "ansible_architecture": "x86_64",
             "ansible_bios_date": "12/01/2006",
            "ansible_bios_version": "VirtualBox",
            "ansible_cmdline": {
                "BOOT_IMAGE": "/vmlinuz-4.18.0-25-generic",
                "quiet": true,
                "ro": true,
                "root": "UUID=5f85d8b7-0ab2-48c9-9e6e-4ecfbcbdaa83",
                "splash": true
            },
            "ansible_date_time": {
                "date": "2019-07-07",
                "day": "07",
                "epoch": "1562525628",
                "hour": "14",
                "iso8601": "2019-07-07T18:53:48Z",
                "iso8601_basic": "20190707T145348850596",
                "iso8601_basic_short": "20190707T145348",
                "iso8601_micro": "2019-07-07T18:53:48.850697Z",
                "minute": "53",
                 "month": "07",
                "second": "48",
                "time": "14:53:48",
                "tz": "EDT",
                "tz_offset": "-0400",
                "weekday": "Sunday",
                "weekday_number": "0",
                "weeknumber": "26",
                 "year": "2019"
            },
            "ansible_default_ipv4": {
                "address": "10.0.2.15",
                "alias": "enp0s3",
                "broadcast": "10.0.2.255",
                "gateway": "10.0.2.2",
                "interface": "enp0s3",
                "macaddress": "08:00:27:68:64:9a",
                "mtu": 1500,
                "netmask": "255.255.255.0",
                "network": "10.0.2.0",
                "type": "ether"
            },
            "ansible_default_ipv6": {},
            "ansible_device_links": {
                "ids": {
                    "sda": [
                        "ata-VBOX_HARDDISK_VB3a0a2351-0b6c0ed5"
                    ],
                     "sda1": [
                        "ata-VBOX_HARDDISK_VB3a0a2351-0b6c0ed5-part1"
                    ],
                     "sda2": [
                        "ata-VBOX_HARDDISK_VB3a0a2351-0b6c0ed5-part2"
                    ],
                    "sda3": [
                         "ata-VBOX_HARDDISK_VB3a0a2351-0b6c0ed5-part3"
                    ],
                    "sda4": [
                         "ata-VBOX_HARDDISK_VB3a0a2351-0b6c0ed5-part4"
                    ],
                    "sr0": [
                        "ata-VBOX_CD-ROM_VB2-01700376"
                    ]
                },
                "labels": {
                    "sr0": [
                        "VBox_GAs_6.0.2"
                    ]
                },
                "masters": {},
                "uuids": {
                    "sda1": [
                        "5f85d8b7-0ab2-48c9-9e6e-4ecfbcbdaa83"
                    ],
                    "sda2": [
                        "b8b7f87b-c3bf-48ed-a44c-f9b3ce0afbe5"
                    ],
                    "sda3": [
                        "a6c77fa6-e292-4a0d-b21f-8804f1949bbd"
                    ],
                    "sda4": [
                        "8207f970-4d9a-47db-a5d5-f620e5b17b7b"
                    ],
                    "sr0": [
                        "2019-01-14-14-57-19-65"
                    ]
                }
            },
            "ansible_devices": {
                "loop0": {
                    "holders": [],
                    "host": "",
                    "links": {
                        "ids": [],
                        "labels": [],
                        "masters": [],
                        "uuids": []
                    },
                    "model": null,
                    "partitions": {},
                    "removable": "0",
                    "rotational": "1",
                    "sas_address": null,
                    "sas_device_handle": null,
                    "scheduler_mode": "none",
                    "sectors": "29704",
                    "sectorsize": "512",
                    "size": "14.50 MB",
                    "support_discard": "4096",
                    "vendor": null,
                    "virtual": 1
                },
                "loop1": {
                    "holders": [],
                    "host": "",
                    "links": {
                        "ids": [],
                        "labels": [],
                        "masters": [],
                        "uuids": []
                    },
                    "model": null,
                    "partitions": {},
                    "removable": "0",
                    "rotational": "1",
                    "sas_address": null,
                    "sas_device_handle": null,
                    "scheduler_mode": "none",
                    "sectors": "0",
                    "sectorsize": "512",
                    "size": "0.00 Bytes",
                    "support_discard": "4096",
                    "vendor": null,
                    "virtual": 1
                },
           }
        }
    }
  

Det var allt om Ansible Ad-hoc kommandon. Testa gärna dessa kommandon i din egen Ansible installation. Använd dessa kommandon för att utföra Ansible moduler utan att skriva en hel playbook. Skriv gärna en kommentar om du stöter på problem.