Ansible — Ad-Hoc Commands

目录

文章目录

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

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

Gathering Facts

Facts(现实状态)代表一个系统中已发现的变量(状态)。这些变量(状态)可以被用来作为是否执行某个任务的判断条件,也可以仅用于获取相关的系统信息。

查看所有的 Facts:

ansible all -m setup

user 模块 — 用户管理

使用 user 模块可以方便的创建账户、删除账户、或是管理现有的账户:

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

copy/file 模块 — 文件传输

  • 以并行的方式同时 SCP 大量的文件到多台 Hosts:
ansible atlanta -m copy -a "src=/etc/hosts dest=/tmp/hosts"
  • 同时修改文件的属主和权限:
$ ansible webservers -m file -a "dest=/srv/foo/a.txt mode=600"
$ ansible webservers -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/apt 模块 — 软件包管理

Ansible 提供了对 yum 和 apt 的支持。

  • 确认一个软件包已经安装,但不去升级它:
ansible webservers -m yum -a "name=acme state=present"
  • 确认一个软件包的安装版本:
ansible webservers -m yum -a "name=acme-1.5 state=present"
  • 确认一个软件包还没有安装:
ansible webservers -m yum -a "name=acme state=absent"

service 模块 — 服务进程管理

  • 确认某个服务在 webservers Group 上的 Hosts 中都已经启动了:
ansible webservers -m service -a "name=httpd state=started"
  • 在 webservers Group 上的 Hosts 中重启某个服务:
ansible webservers -m service -a "name=httpd state=restarted"
  • 确认某个服务已经停止了:
ansible webservers -m service -a "name=httpd state=stopped"

git 模块 — 源码部署

Ansible 模块可以接受到 repo change handlers,可以应用在当源码被更新时、Ansible 接受到这个通知后、并执行指定的任务的场景,例如:直接通过 git 部署 APP,然后在部署完成后重启 APP。

ansible webservers -m git -a "repo=git://foo.example.org/repo.git dest=/srv/myapp version=HEAD"

async_status — 后台异步执行

对于需要长时间执行的任务,可以放到后台中异步运行,并在运行过程中,我们也可以有选择的检查其运行的状态。

ansible all -B 3600 -P 0 -a "/usr/bin/long_running_operation --do-stuff"
# -B 1800 表示最多运行 30 分钟。
# -P 60 表示每隔 60s 获取一次状态信息。

检查运行的状态:传递上述指令返回的 Job id。

ansible web1.example.com -m async_status -a "jid=488359678239.2844"
上一篇:shell_函数


下一篇:设计模式(行为型)- 命令模式