如何迭代所有指定的主机

时间:2017-06-09 09:05:29

标签: ansible

我有一个应该在我的monitoring_sever上为所有指定主机创建配置文件的剧本。

- hosts: all
  gather_facts: True

  hosts: monitoring_server
  tasks:
  - command: touch {{ hostvars[item]['ansible_fqdn'] }}
    with_items: "{{ groups['all'] }}"

我用ansible-playbook main.yml -l "new_client, new_client2, monitoring_server"

执行剧本

监视服务器上的结果文件应如下所示:
    client1.conf client2.conf

但是我收到了关于错过引号的错误,我尝试了各种语法更改,但我似乎无法找到问题。

2 个答案:

答案 0 :(得分:0)

<强>更新

- hosts: all
  gather_facts: True

  tasks:
    - file:
        path: "{{ hostvars[item]['ansible_fqdn'] }}"
        state: touch
      delegate_to: host_name # Delegate task to specific host
      with_items: "{{ groups['all'] }}"

你原来的剧本中有拼写错误。

  1. with:items应为with_items
  2. items应为item
  3. delegate_to的使用:http://docs.ansible.com/ansible/playbooks_delegation.html#delegation

    只要您定位所有主机,就不必进行循环,因为Ansible会在所有目标主机上执行任务,除非条件排除。

    另一方面,我建议使用file模块而不是command来触摸该文件。

    - hosts: all
      tasks:
        - name: Touch a file
          file:
            path: "{{ ansible_fqdn }}"
            state: touch
    

    PS。我假设ansible_fqdn是您为每个主机定义的主机变量。

答案 1 :(得分:0)

您需要修复:

  1. with_items:代替with:items:

  2. item代替items

  3. 播放列表中每个项目中的单个hosts:声明

  4. 这适用于您的情况:

    ---
    - hosts: all
      gather_facts: true
    
    - hosts: monitoring_server
      tasks:
        - command: touch {{ hostvars[item]['ansible_fqdn'] }}
          with_items: "{{ groups['all'] }}"
    

    或者您可以使用delegate_to: localhost并完全删除循环以及对hostvars的引用:

    ---
    - hosts: all
      gather_facts: true
      tasks:
        - command: touch {{ ansible_fqdn }}
          delegate_to: localhost