目录

 

 

Ad-Hoc Commands

相对于 Ansible Playbook, Ad-Hoc Commands 通过手动执行 ansible CLI 用于快速执行简单的任务,且这些 Commands 不需要特别地保存下来。

ansible CLI 的基础格式为:

ansible <pattern_goes_here> -m <module_name> -a <arguments>

# <pattern_goes_here> 指示了在那些 Groups/Hosts 上执行任务。
# -m <module_name> 指示了使用哪些 Ansible 模块。
# -a <arguments> 指示了传递给 Ansible 模块的参数变量。
  1. 编辑 Ansible hosts 文件,加入托管节点。
$ vi /etc/ansible/hosts
...
192.168.1.46
192.168.1.227
  1. 设置免密登陆托管节点。
$ ssh-copy-id -i ~/.ssh/id_rsa.pub root@192.168.1.46
$ ssh-copy-id -i ~/.ssh/id_rsa.pub root@192.168.1.227

$ ssh-agent bash
$ ssh-add ~/.ssh/id_rsa
  1. 测试:
# 测试远程连通性。
$ ansible all -m ping --private-key ~/.ssh/id_rsa
192.168.1.46 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    },
    "changed": false,
    "ping": "pong"
}

192.168.1.227 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    },
    "changed": false,
    "ping": "pong"
}

# 测试远程执行指令。
$ ansible all -a "/bin/echo hello"
192.168.1.46 | CHANGED | rc=0 >>
hello

192.168.1.227 | CHANGED | rc=0 >>
hello

Hosts Patterns

在 Ansible CLI 种,Patterns 用于指示将被执行远程管理的托管主机或主机组。e.g.

ansible webservers -m service -a "name=httpd state=restarted"

Patterns 有多种表达形式,如下:

  1. 表示所有托管节点。
all
*
  1. 表示指定的 Hosts。
# hostname
one.example.com
one.example.com:two.example.com
*.example.com
*.com

# IP addr
192.168.1.50
192.168.1.*

# 应用正则表达式
~(web|db).*\.example\.com
  1. 表示指定的 Groups:
# 一个 Group
webservers

# 多个 Groups,使用 : 隔开
webservers:dbservers

# 选择 Group 中的第 n 个 Host
webservers[0]

# 选择 Group 中的第 n-m 个 Hosts
webservers[0-25]

# 排除某个 Group 中的成员
webservers:!phoenix

# 选择两个 Groups 中的交集
webservers:&staging

# 更复杂的组合
webservers:dbservers:&staging:!phoenix

指定 User 来执行任务

默认会使用管理主机当前的 User 来进行 SSH,也可以显式地指定 username:

# as bruce
$ ansible all -m ping -u bruce

# as bruce, sudoing to root
$ ansible all -m ping -u bruce --sudo

# as bruce, sudoing to batman
$ ansible all -m ping -u bruce --sudo --sudo-user batman

如果想通过 sudo 去执行命令:

ansible atlanta -a "/usr/bin/foo" -u username --sudo

也可以通过 sudo user(使用 sudo 切换到其它 User)去执行命令:

ansible atlanta -a "/usr/bin/foo" -u username --sudo-user <other-user>

并行的执行任务

ssh-agent 会 Fork 出 10 个子进程(bash),以 “每次重启 10 个” 的并行方式执行 reboot 命令:

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