2.2 Ansible AD-Hoc

Ansible 的 AD-Hoc 命令是一种可以快速输入的命令。AD-Hoc 命令可以用来做一些快速的事情,而不必编写完整的 playbook。

在学习 playbook 之前,这是一个很好的开始了解 Ansible 的基本功能的地方。

AD-Hoc 和 playbook 都使用相同的模块,都是 ansible 提供的。目前 已经有超过1000+ 模块可以使用。

常用基本参数

  • -o 将输出合并为1行。
  • -m 指定模块
  • -a 模块参数

shell 命令

可以使用 ansible 命令在其他节点上执行 shell 命令,并且可以并行执行。

首先最好配置信任连接,可以免密码登陆其他节点,如果不想要这样的话,可以使用 --ask-pass (-k) 参数来输入密码。

现在把一个组里的所有机器都执行一个命令,这下边的这个例子里,使用 -f 参数指定并行数量,把 web 组里的所有机器重启。

$ ansible web -a "/sbin/reboot" -f 10

ansible 默认使用当前用户,如果你不希望使用当前用户,那么你可以通过命令行指定不同的用户来执行,比如

$ ansible web -a "/usr/bin/foo" -u zhangsan

你不仅希望使用其他用户,还想要使用这个用户提权来执行

$ ansible web -a "/usr/bin/foo" -u zhangsan --become [--ask-become-pass]

或者变成其他用户来执行

$ ansible web -a "/usr/bin/foo" -u zhangsan --become --become-user lisi [--ask-become-pass]

或者试用 shell 模块

文件传输

ansible 命令行下可以并行的拷贝大量的文件到多个节点上。

拷贝过程主要使用 copy 模块。文件的变化是通过 MD5值来判断的。

$ ansible web -m copy -a "src=/etc/hosts dest=/tmp/hosts"

使用 file 模块 可以改变属组和权限,

$ ansible webs -m file -a "dest=/srv/foo/b.txt mode=600 owner=mdehaan group=mdehaan"

或者创建目录

$ ansible webservers -m file -a "dest=/path/to/c mode=755 owner=mdehaan group=mdehaan state=directory"

或者删除文件

$ ansible webservers -m file -a "dest=/path/to/c state=absent"

包管理

对于操作系统场景的包管理都支持,以 yum 为例

比如安装一个包,但是不升级

$ ansible web -m yum -a "name=wget state=present"

比如安装一个指定版本的包

$ ansible web -m yum -a "name=wget-1.14 state=present"

安装最新版本

$ ansible web -m yum -a "name=wget state=latest"

用户和组

user 模块可以方便地创建和操作现有的用户帐户,以及删除可能存在的用户帐户:

$ ansible all -m user -a "name=foo password=<crypted password here>"

$ ansible all -m user -a "name=foo state=absent"

管理服务

可以使用服务管理模块来管理服务

比如启动服务

$ ansible web -m service -a "name=httpd state=started"

比如重启服务

$ ansible web -m service -a "name=httpd state=restarted"

比如停止服务

$ ansible web -m service -a "name=httpd state=stopped"

收集 Facts

Facts 组件是 Ansible 用于采集被管理机器设备信息的功能。整个 facts 信息被包装在一个 json 格式的数据结构中。

Facts 表示关于系统的已发现变量。这些可以用来实现任务的条件执行,也可以用来获取关于系统的特殊信息。可以通过 setup 模块获取

$ ansible web -m setup

输出如下:

 [root@172-18-12-6 ~]# ansible web -m setup
172.18.12.47 | SUCCESS => {
    "ansible_facts": {
        "ansible_all_ipv4_addresses": [
            "172.18.12.47"
        ],
        "ansible_all_ipv6_addresses": [
            "fe80::2ab4:4dc6:eb66:aea5",
            "fe80::e104:c59f:6682:32d2",
            "fe80::87d0:287f:ae77:f5ef"
        ],
        "ansible_apparmor": {
            "status": "disabled"
        },
        "ansible_architecture": "x86_64",
        "ansible_bios_date": "04/01/2014",
        "ansible_bios_version": "1.9.1-5.el7.centos",
        "ansible_cmdline": {
            "BOOT_IMAGE": "/vmlinuz-3.10.0-693.el7.x86_64",
            "LANG": "en_US.UTF-8",
            "quiet": true,
            "rd.lvm.lv": "centos/swap",
            "rhgb": true,
            "ro": true,
            "root": "/dev/mapper/centos-root"
        },
        "ansible_date_time": {
            "date": "2019-03-26",
            "day": "26",
            "epoch": "1553594894",
            "hour": "18",
            "iso8601": "2019-03-26T10:08:14Z",
            "iso8601_basic": "20190326T180814810604",
            "iso8601_basic_short": "20190326T180814",
            "iso8601_micro": "2019-03-26T10:08:14.810657Z",
            "minute": "08",
            "month": "03",
            "second": "14",
            "time": "18:08:14",
            "tz": "CST",
            "tz_offset": "+0800",
            "weekday": "星期二",
            "weekday_number": "2",
            "weeknumber": "12",
            "year": "2019"
        },
        "ansible_default_ipv4": {
            "address": "172.18.12.47",
            "alias": "eth0",
            "broadcast": "172.18.15.255",
            "gateway": "172.18.0.1",
            "interface": "eth0",
            "macaddress": "fa:32:04:69:68:00",
            "mtu": 1500,
            "netmask": "255.255.240.0",
            "network": "172.18.0.0",
            "type": "ether"
        },
    ......

而且 facts 还支持查看指定信息。比如只查看设备的 IPv4 地址。

$ ansible web -m setup -a 'filter=ansible_default_ipv4'

results matching ""

    No results matching ""