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'