1

我有一个相当大的剧本,其中包含安装和配置新应用程序的任务,其中有一堆仅与初始安装和配置相关的任务,以及一堆仅与后续运行相关的任务。

我想做的是有条件地包含初始安装和配置的任务,并且仅在initial-install传递标签时运行这些任务。

例如:

# main.yml 
- include: initial_install.yml
  when: tag 'initial-install' specified

- include: initial_configuration.yml
  when: tag 'initial-install' specified

- include: configure.yml

这是一个简化的示例,但如果我能弄清楚这一点,我应该能够将我的任务列表组织成一种格式,该格式不会运行不必要的任务,除非正在运行 playbook 进行初始安装,并带有initial-install标签。

4

1 回答 1

4

Ansible 中确实已经为您构建了一个完整的标记机制。

  • 您可以只运行带有一个或多个标签的任务:

    ansible-playbook play.yml --tags "some,tags,here"
    

    其中指定的标签是您要运行的所有标签的逗号分隔列表。

  • 或指定要跳过的标签

    ansible-playbook play.yml --skip-tags "some,tags,here"
    

您只需将您的标签指定为您需要它们的任何任务的列表:

- include: initial_install.yml
  tags: initial-install

- include: initial_configuration.yml
  tags: initial-install

- include: configure.yml
  tags:
    - setup
    - reconfiguration
    - else

在你的情况下,请注意

添加标签:对戏剧或静态导入的任务和角色,将这些标签添加到所有包含的任务。

来源:https ://docs.ansible.com/ansible/latest/user_guide/playbooks_tags.html#tag-inheritance

还有一组特殊标签

  • always, 始终运行,除非通过以下方式特别跳过--skip-tags always
  • never, 永远不会运行,除非特别请求该任务的另一个标签

以及一组特殊的关键字

  • tagged, 如果您想将所有标记的任务定位于--tags--skip-tags
  • untagged, 如果您想将所有未标记的任务定位于--tags--skip-tags
  • all, 如果您想将所有任务定位于--tags--skip-tags

这些可以用于您的情况:

- include: initial_install.yml
  tags:
    - initial-install
    - never

- include: initial_configuration.yml
  tags: 
    - initial-install
    - never

- include: configure.yml
  tags:
    - setup
    - reconfiguration
    - else
  • 通过普通运行此示例
    ansible-playbook play.yml
    
    不会运行两个第一个任务,但会运行最后一个。
  • 运行它
    ansible-playbook play.yml --tags "initial-install,all"
    
    将运行所有三个任务。

鉴于剧本:

- hosts: all
  gather_facts: no  
        
  tasks:
    - debug: 
        msg: initial_install.yml
      tags:
        - initial-install
        - never

    - debug: 
        msg: initial_configuration.yml
      tags: 
        - initial-install
        - never

    - debug: 
        msg: configure.yml
      tags:
        - setup
        - reconfiguration
        - else

这给出了这些输出:

  • $ ansible-playbook play.yml 
    
    PLAY [all] **********************************************************************************************************************
    
    TASK [debug] ********************************************************************************************************************
    ok: [localhost] => {
        "msg": "configure.yml"
    }
    
    PLAY RECAP **********************************************************************************************************************
    localhost                  : ok=1    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
    
  • $ ansible-playbook play.yml --tags "initial-install,all"
    
    PLAY [all] **********************************************************************************************************************
    
    TASK [debug] ********************************************************************************************************************
    ok: [localhost] => {
        "msg": "initial_install.yml"
    }
    
    TASK [debug] ********************************************************************************************************************
    ok: [localhost] => {
        "msg": "initial_configuration.yml"
    }
    
    TASK [debug] ********************************************************************************************************************
    ok: [localhost] => {
        "msg": "configure.yml"
    }
    
    PLAY RECAP **********************************************************************************************************************
    localhost                  : ok=3    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
    
于 2020-08-03T16:36:03.667 回答