For循环只取列表中的最后一个元素?

For loop only takes last element in list?

目前,我正尝试在 Ubuntu 20.04 下使用 SaltStack 禁用和屏蔽几个与网络相关的系统服务。现在,事情变得有点混乱了。最后,我需要禁用几个服务,所以我相应地构建了一个for循环,请看下面:

init.sls:
stop_netplan_services:
  service.disabled:
    {% for services in [ 'systemd-resolved', 'systemd-networkd.socket', 'systemd-networkd', 'systemd-networkd-wait-online', 'networkd-dispatcher' ] %}
    - name: {{ services }}
    {% endfor %}
    - require:
      - dead_netplan_services

如果我触发我的高状态,只有列表中的最后一个服务得到尊重,在这里谈论网络调度程序。其他一切都不会得到应用。为什么 'systemd-resolved'、'systemd-networkd.socket' 等...在此 for 循环中被忽略?

yaml 状态中的重复参数将被忽略。

您需要为每个服务生成单独的状态。此外,service.dead 状态有一个 enable 参数,因此您不需要 service.disabled.

{% for service in [ 'systemd-resolved', 'systemd-networkd.socket', 'systemd-networkd', 'systemd-networkd-wait-online', 'networkd-dispatcher' ] %}
stop and disable {{ service }}:
  service.dead:
    - name: {{ service }}
    - enabled: false
{% endfor %}

这是一般的解决方案,尽管有些州有明确的 namespkgs 或类似的论点。您可以将列表传递给它,而不是生成多个状态。

编辑:正如评论中指出的那样,names should work for every state:

disable_netplan_services:
  service.dead:
    - names:
      - systemd-resolved
      - systemd-networkd.socket
      - systemd-networkd
      - systemd-networkd-wait-online
      - networkd-dispatcher
    - enabled: false