【问题标题】:Ansible - Loop VariableAnsible - 循环变量
【发布时间】:2021-04-12 13:35:13
【问题描述】:

我正在尝试使用 ansible playbook 启动应用程序。

变量 inst 获得了所有需要的软件 ID:

WEB
TS3
SQL
....

如何为所有软件 ID 创建一个循环并在所有软件上运行相同的命令?

---
- name: "start sw"
  become: yes
  command: "swstart {{ inst }}"
  retries: 3
  failed_when: ( instance_start.rc not in [ 0 ] )

【问题讨论】:

    标签: ansible yaml


    【解决方案1】:

    你应该首先将你的列表定义为你剧本上的一个变量。 之后就可以使用了

    with_items

    这样:

    ---
    
    - hosts: all
      remote_user: root
      vars:
        softwares:
        - WEB
        - TS3
        - SQL
      vars_files:
        - /softwares.yml # if you need to import data from file
    
      tasks:
    
      - name: display your softwares using debug module
        debug:
          msg: "An item: {{ item }}"
        with_items: "{{ softwares }}"
    

    我希望这可以帮助您解决问题。

    【讨论】:

    • 嗨,谢谢 - 但我在不同的服务器上有不同的软件 ID。
    • 我认为你可以先从文件中获取所有服务器的ID
    • @bigMre 试想一下,上面示例中的 softwares 变量是在主机级别的清单中定义的,而不是在剧本中定义的。结果将完全符合您的预期,任务无需更改。
    【解决方案2】:

    如下使用with_items

    ---
    - name: "start sw"
      become: yes
      command: "swstart {{ item }}"
      with_items: "{{ inst }}"
    

    文档:

    https://docs.ansible.com/ansible/latest/user_guide/playbooks_loops.html#with-items

    【讨论】:

    • 或者考虑使用loop,这是链接文档的实际建议。 loop: "{{ inst }}".
    • 不知何故它给了我一个语法错误......无论是循环还是with_items
    • @bigMre 不知何故,您没有 edit 提供完整的 MCVE 以实际运行以重现您的问题并给出有意义的答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-21
    • 2017-08-06
    • 1970-01-01
    • 2015-01-02
    • 2015-06-20
    相关资源
    最近更新 更多