我有一本剧本需要花费很多时间来执行,部分原因是有很多要在其上运行的节点(我浪费时间在检查所有节点的状态上),我需要做一些在其中的某个地方改变。

缩小剧本范围的最佳方法是什么?我是否考虑过隔离所需的更改和/或仅在单个节点上运行修改的零件?

最佳答案

这就是tags的目的。

您可以使用标签的任何组合为任何任务添加标签,然后指定要运行的标签组合(或使用--skip-tags跳过),然后仅运行那些指定的任务。

因此,示例剧本可能如下所示:

- hosts: all
  tasks:
    - name: copy foo
      copy:
        src:  path/to/foo
        dest: path/to/foo
      tags:
        - copy_foo
        - copy
        - foo

    - name: copy bar
      copy:
        src:  path/to/bar
        dest: path/to/bar
      tags:
        - copy_bar
        - copy
        - bar

    - name: restart foo
      service:
        name:  foo
        state: restarted
      tags:
        - restart_foo
        - restart
        - foo

    - name: restart bar
      service:
        name:  bar
        state: restarted
      tags:
        - restart_bar
        - restart
        - bar


然后,我可以使用ansible-playbook -i path/to/hosts playbook.yml --tags "restart_foo"仅运行“重启foo”任务。或者,我可以运行所有与bar相关的标签,还可以使用以下任意组合重新启动foo(但不能复制foo):


ansible-playbook -i path/to/hosts playbook.yml --tags "bar,restart_foo"
ansible-playbook -i path/to/hosts playbook.yml --tags "restart,copy_bar"
ansible-playbook -i path/to/hosts playbook.yml --skip-tags "copy_foo"


如果您想代替(或组合使用)限制播放的节点,则可以使用--limit选项。因此,如果要将播放限制为仅Web服务器,则可以使用ansible-playbook -i path/to/hosts playbook.yml --limit webservers运行它,甚至可以将其限制为使用ansible-playbook -i path/to/hosts playbook.yml --limit web.example.org的单个特定主机

07-26 06:15