Introduction To Ad-Hoc Commands:
在下面的例子中,我们将演示如何使用/usr/bin/ansible 运行 ad hoc 任务.
所谓 ad-hoc 命令是什么呢?
(这其实是一个概念性的名字,相对于写Ansible playbook来说的,类似于在命令行敲入shell命令和
写shell scripts两者之间的关系)
如果我们敲入一些命令去比较快的完成一些事情,而不需要将这些执行的命令特别保存下来,这样的命令就叫ad-hoc命令。
Ansible提供两种方式去完成任务,一种是ad-hoc命令,一是写Ansible playbook.
前者可以解决一些简单的任务,后者解决较为复杂的任务。
一般而言,在学习playbooks之后,你才能体会到Ansible真正的强大之处在哪里。
那我们会在上面情景下去使用ad-hoc命令呢?
比如说因为圣诞节要来了,想要把所有实验室的电源关闭,我们只需要执行一行命令就可以达成这个任务,
而不需要写playbook来做这个任务。
并行和Shell 命令:
这里我们使用Ansible的命令行工具来重启Altanta组中所有的web服务器,每次重启10个。
我们先设置SSH-agent,将私钥纳入其管理:
$ ssh-agent bash
$ ssh-add ~/.ssh/id_rsa
如果不像使用ssh-agent,想通过密码验证的方式使用SSH,可以在执行ansible命令时使用
--ask-pass (-k)选项,但这里建议使用ssh-agent:
使用 shell 模块的示例如下:
[root@node01 ansible]# ansible webservers -m shell -a 'echo $LOGNAME'
192.168.137.1 | UNREACHABLE! => {
"changed": false,
"msg": "Failed to connect to the host via ssh: ",
"unreachable": true
}
192.168.137.3 | SUCCESS | rc=0 >>
root
115.236.19.4 | SUCCESS | rc=0 >>
root
使用Ansible ad hoc 命令行接口时(与使用 Playbooks 的情况相反),
尤其注意shell引号的规则.
$ ansible raleigh -m shell -a 'echo $TERM'
-m 使用shell模块
-a 模块参数
在执行/usr/bin/ansible时默认是以当前用户的身份去执行这个命令,
使用shell 模块的示例如下:
[root@node01 ansible]# echo $HOSTNAME
InformixDBServer
[root@node01 ansible]# ansible webservers -m shell -a "echo $HOSTNAME"
192.168.137.1 | UNREACHABLE! => {
"changed": false,
"msg": "Failed to connect to the host via ssh: ",
"unreachable": true
}
192.168.137.3 | SUCCESS | rc=0 >>
InformixDBServer
115.236.19.4 | SUCCESS | rc=0 >>
InformixDBServer
[root@node01 ansible]#
使用双引号的时候,会求出HOSTNAME在当前系统的值
单引号,是不这个命令传递到其他机器执行:
[root@node01 ansible]# echo $HOSTNAME
InformixDBServer
[root@node01 ansible]# ansible webservers -m shell -a 'echo $HOSTNAME'
192.168.137.1 | UNREACHABLE! => {
"changed": false,
"msg": "Failed to connect to the host via ssh: ",
"unreachable": true
}
192.168.137.3 | SUCCESS | rc=0 >>
node2
115.236.19.4 | SUCCESS | rc=0 >>
yun-bak
File Transfer:
这是/usr/bin/ansible的另一种用法,Ansible能够以并行的方式同时scp大量的文件到多台机器,命令如下:
ansible webservers -m copy -a "src=/etc/hosts dest=/tmp/hosts"
默认传过去的数组为:
node2:/root#ls -ltr /tmp/hosts
-rw-r--r-- 1 root root 181 Oct 9 19:02 /tmp/hosts
使用file模块可以做到修改文件的属主和权限,(在这里可替换为copy模块,是等效的):
Managing Packages:
Ansible 提供对yum和apt的支持,这里是关于yum的示例:
确认一个软件包已经按照,但不去升级它:
确认一个软件包还没有安装:
$ ansible webservers -m yum -a "name=acme state=absent"
[root@node01 ansible]# ansible webservers -m yum -a "name=acme state=absent"
192.168.137.1 | UNREACHABLE! => {
"changed": false,
"msg": "Failed to connect to the host via ssh: ",
"unreachable": true
}
192.168.137.3 | FAILED! => {
"changed": false,
"failed": true,
"msg": "python2 bindings for rpm are needed for this module. python2 yum module is needed for this module"
}
115.236.19.4 | SUCCESS => {
"changed": false,
"failed": false,
"msg": "",
"rc": 0,
"results": [
"acme is not installed"
]
}
Users and Groups:
使用'user'模块可以方便的创建账户,删除账户,或是管理现有账户