Patterns

    我们再来复习下:doc:intro_adhoc 章节中介绍的命令用法,命令格式如下:

    示例如下:

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

    一个pattern通常关联到一系列组(主机的集合) –如上示例中,所有的主机均在 “webservers” 组中.

    不管怎么样,在使用Ansible前,我们需事先告诉Ansible哪台机器将被执行.能这样做的前提是需要预先定义唯一的 host names 或者 主机组.

    如下的patterns等同于目标为仓库(inventory)中的所有机器:

    1. all
    2. *

    也可以写IP地址或系列主机名:

    1. one.example.com
    2. one.example.com:two.example.com
    3. 192.168.1.50
    4. 192.168.1.*
    1. webservers:dbservers

    你也可以排队一个特定组,如下实例中,所有执行命令的机器必须隶属 webservers 组但同时不在 phoenix组:

    你也可以指定两个组的交集,如下实例表示,执行命令有机器需要同时隶属于 webservers 和 staging 组.

    你也可以组合更复杂的条件:

    1. webservers:dbservers:&staging:!phoenix

    上面这个例子表示“‘webservers’ 和 ‘dbservers’ 两个组中隶属于 ‘staging’ 组并且不属于 ‘phoenix’ 组的机器才执行命令” … 哟!唷! 好烧脑的说!

    你也可以使用变量如果你希望通过传参指定group,ansible-playbook通过 “-e” 参数可以实现,但这种用法不常用:

    1. webservers:!{{excluded}}:&{{required}}

    你也可以不必严格定义groups,单个的host names, IPs , groups都支持通配符:

    1. *.example.com
    2. *.com
    1. one*.com:dbservers

    在高级语法中,你也可以在group中选择对应编号的server:

    或者一个group中的一部分servers:

    1. webservers[0-25]

    大部分人都在patterns应用正则表达式,但你可以.只需要以 ‘~’ 开头即可:

    1. ~(web|db).*\.example\.com

    同时让我们提前了解一些技能,除了如上,你也可以通过 标记来添加排除条件,/usr/bin/ansible or /usr/bin/ansible-playbook都支持:

      如果你想从文件读取hosts,文件名以@为前缀即可.从Ansible 1.2开始支持该功能:

      1. ansible-playbook site.yml --limit @retry_hosts.txt

      够简单吧. 为了更好的掌握该章节内容,可以先了解 Introduction To Ad-Hoc Commands