我有一个应该在我的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
但是我收到了关于错过引号的错误,我尝试了各种语法更改,但我似乎无法找到问题。
答案 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'] }}"
你原来的剧本中有拼写错误。
with:items
应为with_items
items
应为item
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)
您需要修复:
with_items:
代替with:items:
item
代替items
播放列表中每个项目中的单个hosts:
声明
这适用于您的情况:
---
- 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