【问题标题】:Run command only once if any items in a list are True (Ansible)如果列表中的任何项目为真(Ansible),则仅运行一次命令
【发布时间】:2026-01-16 11:40:01
【问题描述】:

如果列表中的任何项目是True,我只想停止一次 Nginx。

由于列表中的多个项目可能是True,我只想先停止Nginx,然后不再运行此命令。

稍后在脚本中我将使用相同的逻辑再次启动 Nginx。

- name: Nginx is temporarily shutting down
  command: sudo systemctl stop nginx.service
  when:
    - item == True
  with_items: "{{ saved_results_list }}"

有没有办法只在列表中的项目是True 时才运行这个,但不是多次?

【问题讨论】:

  • @techraf 你为什么不尽快编辑它(python 标签)?

标签: ansible jinja2


【解决方案1】:

这里不用循环,用in操作符就够了:

- name: Nginx is temporarily shutting down
  command: sudo systemctl stop nginx.service
  when: True in saved_results_list

【讨论】:

    【解决方案2】:

    如果一次获得所有项目的成本很低,您可以使用any 函数。

    if any(items):
        stop_nginx()
    

    如果没有,你可以使用 break 来停止迭代。

    for i in get_data(): 
        if i:
             stop_nginx()
             break
    

    如果您有很多条件,请使用这样的标志:

    nginx_stopped = False
    for i in get_data():
        if not nginx_stopped and should_stop_ngingx(i):
             stop_nginx()
             nginx_stopped = True
    
       #other_conditional branchings
    

    【讨论】:

      【解决方案3】:

      如果你有booleans = [True, False, True, False, False]这样的列表,你可以使用特殊的python函数any()all()来测试列表中的任何或所有元素是否为True。

      > any(booleans)
      > True
      >
      > all(booleans)
      > False
      

      您可以使用它来关闭 Nginx,例如:

      import os
      
      if any(saved_results_list):
          os.system("sudo systemctl stop nginx.service")
      

      【讨论】: