AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 623634
Accepted
Taha Jahangir
Taha Jahangir
Asked: 2014-08-25 02:08:56 +0800 CST2014-08-25 02:08:56 +0800 CST 2014-08-25 02:08:56 +0800 CST

Ansible:仅在指定标签时执行任务

  • 772

Ansible 标签可用于仅运行一部分任务/角色。这意味着默认情况下所有任务都已执行,我们只能阻止某些任务执行。

我们可以限制任务仅在指定“foo”标签时执行吗?我们可以在when任务部分使用当前标签吗?

ansible
  • 13 13 个回答
  • 121169 Views

13 个回答

  • Voted
  1. Best Answer
    Taha Jahangir
    2018-04-13T02:58:12+08:002018-04-13T02:58:12+08:00

    Ansible 2.5 带有特殊标签never和always. 标记never可以完全用于此目的。例如:

    tasks:
      - debug: msg='{{ showmevar}}'
        tags: [ 'never', 'debug' ]
    

    debug在此示例中,仅当显式请求(or never) 标记时任务才会运行。[关于 ansible 文档的参考]

    • 73
  2. Chris Chipman
    2016-01-14T08:25:41+08:002016-01-14T08:25:41+08:00

    虽然这是一个迂回的解决方案,但它确实有效。

    当正常执行运行时,在任务列表中注册一个变量。然后,将检查该变量的 when 条件添加到标记任务。

    - shell: /bin/true
      register: normal_task_list
    
    - name: Only run when tag is specified
      shell: /bin/echo "Only running because of specified tag"
      when: normal_task_list is not defined
      tags: specified
    
    • 19
  3. Alex Peters
    2015-05-08T17:17:07+08:002015-05-08T17:17:07+08:00

    我没有足够的声誉来支持或评论建议使用命令行变量(--extra-vars)的答案,但我有这个要添加到它:

    此方法的警告是,如果您不定义该额外变量,播放将出错并失败。

    --extra-vars您可以通过在 playbook 本身中定义默认值来防止在没有定义的情况下播放失败:

    ---
    - hosts: ...
    # ↓↓↓
      vars:
        thorough: false
    # ↑↑↑
      tasks:
      - name: apt - install nfs-common only when thorough is true
        when: thorough | bool
        apt:
          cache_valid_time: 86400
          force: yes
          pkg:
            - nfs-common
    

    覆盖 via--extra-vars仍然有效,因为在命令行上定义的变量优先于所有其他定义。

    结果是在命令行thorough中没有更改为时,播放运行没有错误。true

    • 18
  4. Ava
    2015-03-13T12:51:59+08:002015-03-13T12:51:59+08:00

    您可以使用条件来防止意外运行的任务,如果您不指定标签,这些任务将被执行。此方法的警告是,如果您不定义该额外变量,播放将出错并失败。

    使用 extra-vars 参数,您可以触发条件执行。

    来自 ansible-playbook --help:

     -e EXTRA_VARS, --extra-vars=EXTRA_VARS
        set additional variables as key=value or YAML/JSON
    

    例子:

    ansible-playbook test.yaml -e "thorough=true"
    

    测试.yaml:

    ...
    - name: apt - install nfs-common only when thorough is true
      apt:
        cache_valid_time: 86400
        force: yes
        pkg:
        - nfs-common
      when: thorough | default(False)
    ...
    
    • 11
  5. Valentin Krasontovitsch
    2020-02-19T00:18:20+08:002020-02-19T00:18:20+08:00

    一种可能更惯用和优雅的方式是为when任务添加条件,如下所示:

    tasks:
      - debug: msg='{{ showmevar}}'
        tags: [ 'debug' ]
        when: "'debug' in ansible_run_tags"
    

    这使用包含通过 CLI 参数(或同义词)提供的标签列表的神奇变量,并且ansible_run_tags当且仅当给出标签时才具有运行上述任务的效果。--tags-tdebug

    似乎这个魔法变量已在 ansible 2.5 中引入

    • 8
  6. Shahar
    2014-08-25T08:49:38+08:002014-08-25T08:49:38+08:00

    是的。使用标志运行 ansible-playbook--tags foo将确保仅执行带有标记的任务foo。例如,假设我们有一个名为 example.yml 的剧本:

    tasks:
    
      - yum: name={{ item }} state=installed
        with_items:
           - httpd
           - memcached
        tags:
           - packages
    
      - name: some other task
        ..
        tags:
          - some other tag
    

    跑步:

    ansible-playbook example.yml --tags "packages"
    

    将确保只执行 yum 任务。

    所以实际上你并不需要在 when 部分中使用标签来有条件地执行任务。请注意,根据您的剧本/角色的复杂性,您可能需要结合使用 --tags 和 --skip-tags 来控制执行哪些任务。例如,如果包含任务被标记为“foo”并且包含的​​剧本中的某些任务被标记为“bar”并且您运行

    ansible-playbook --tags "foo"
    

    将执行内部任务(仅标记为“bar”)。为避免执行所有标记为“bar”的内部任务,您必须执行以下命令

    ansible-playbook --tags foo --skip-tags bar
    
    • 4
  7. nootal
    2016-09-29T23:30:03+08:002016-09-29T23:30:03+08:00

    检查 'tags' 变量在 Ansible 2.1.1.0 中不起作用。测试见下文。我有另一个想法,即仅在定义标签时才执行任务,适用于 Ansible 1.9.X 和 2.XY:

    - set_fact: foo=true
      tags: bar
    - set_fact: foo=false
    - name: do something when 'bar' tag is defined
      debug: var=foo
      when: foo
      tags: bar
    

    这样,当运行没有任何标签的 playbook 时,'foo' 变量将设置为 true,然后设置为 false,因此不执行任何操作。如果添加'bar'标签,只会应用第一个设置,所以'foo'变量将为真,然后你的任务将被执行。享受!


    这是关于 Ansible 2.1.1.0 中“标签”变量的测试:

    这是剧本:

    - hosts: localhost
      connection: local
      tasks:
        - name: display tags variable
          debug: var=tags
          tags: foo
    
        - name: do something only when tag 'foo' is provided
          debug: var=tag
          when: tags is defined
          tags: foo
    

    这是输出:

    $ ansible-playbook --version ; ansible-playbook ./test.yml -t foo
    ansible-playbook 2.1.1.0
      config file = /home/nootal/projects/ivy/src/ansible/ansible.cfg
      configured module search path = Default w/o overrides
    
    PLAY [localhost] ***************************************************************
    
    TASK [display tags variable] ***************************************************
    ok: [localhost] => {
        "tags": "VARIABLE IS NOT DEFINED!"
    }
    
    TASK [do something only when tag 'foo' is provided] ****************************
    
    PLAY RECAP *********************************************************************
    localhost                  : ok=1    changed=0    unreachable=0    failed=0   
    
    • 4
  8. xtoznaxto
    2018-06-07T08:08:50+08:002018-06-07T08:08:50+08:00

    有一个特殊的标签 - "never",除非特别请求标签,否则它将阻止任务运行。

    tasks:
      - debug: msg='{{ showmevar}}'
        tags: [ 'never', 'debug' ]
    
    • 4
  9. jursetto
    2020-09-10T21:04:11+08:002020-09-10T21:04:11+08:00

    标签通常是正确的never解决方案,但它在一种情况下不起作用:在Ansible 2.11 之前meta,任务不支持标签。在这种情况下,我们必须使用条件变量和魔法变量来伪造标签支持。when:ansible_run_tags

    例如,这是一个片段,它将列出所有主机并在您说 时提前结束播放--tags list-hosts。它适用于 Ansible 2.8 及更高版本。如果您在运行时使用add_hostor生成主机或组,这将非常有用group_by,因为对于--list-hosts.

    - pre_tasks:
      - name: List hosts
        assert:
          that: true
          quiet: true
        tags:
          - never
          - list-hosts
    
      - meta: end_play
        when: "'list-hosts' in ansible_run_tags"
    
    • 1
  10. Anderson Goulart
    2016-04-19T10:35:58+08:002016-04-19T10:35:58+08:00

    when子句无法评估标签的存在。作为一种解决方法,我将变量和标签一起使用来运行特定于该标签/变量的任务。

    例如:想象一个剧本和库存

    # 存货
    [开发]
    192.168.1.1
    
    # 站点.yml
    - 主机:开发
      角色:
        - {角色:普通}
    
    在 common/tasks/main.yml
    
    # 角色/common/tasks/main.yaml
    - 名称:安装链接
      apt:名称=链接状态=存在
    
    - 包括:uninstall.yml
      何时:uninstall_links 被定义
      标签:
        - 卸载
    
    # 角色/common/tasks/uninstall.yml
    - 名称:卸载链接
      apt:名称=链接状态=缺席
    

    使用这种方法,您可以使用标签仅选择uninstall.yml 中的任务,但您还需要将“uninstall_links”变量设置为启用它。因此,如果您在没有任何参数的情况下运行 playbook,它将默认运行安装任务。要卸载,您可以将标签“卸载”设置为您的剧本(或 cmdline),并且必须设置变量。如果不设置标签,它将按顺序运行所有内容(安装和卸载),这对测试整个过程很有好处。

    如何运行一切(它将安装和卸载):

    $ansible-playbook -i inventory site.yml -l dev -s -k -e "uninstall_links=true"

    如何仅在开发组上运行“卸载”标签

    $ansible-playbook -i inventory site.yml -l dev -s -k -e "uninstall_links=true" -t uninstall

    因此,变量和标签也可以在 site.yml/inventory 文件中,允许您提交到您的 SCM 并记录您的意图。

    • 0

相关问题

  • Ansible 剧本,使用选项 --disabled-login 创建用户

  • ansible playbook,操作系统不同的用户

  • ansible:为什么文件模块会跳过?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    新安装后 postgres 的默认超级用户用户名/密码是什么?

    • 5 个回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve