我正在尝试运行一些本地命令,迭代清单文件,并将每个主机名作为本地命令的参数。
例如:我想在我的本地机器(笔记本电脑)上运行一条命令“wanted node create {{ hostname }}”。行动手册是:
- name: Prep node
hosts: 127.0.0.1
connection: local
gather_facts: no
tasks:
- name: node create
command: "knife node create {{ hostname | quote }}"我的清单文件看起来像这样:
[qa-hosts]
10.10.10.11 hostname=example-server-1当然,它不会工作,因为库存有'qa-hosts‘,播放是'127.0.0.1',因为我想从我的本地机器上运行播放。
有没有人能帮我出个主意。基本上,我想获取变量'hostname‘并将其传递给上面的play块。
发布于 2017-05-16 23:28:20
您可以使用下面的play访问主机名,因为清单信息可以作为hostvars使用。
- hosts: 127.0.0.1
connection: local
gather_facts: no
tasks:
- debug: var=hostvars
- name: node create
command: "knife node create {{ hostvars[item]['hostname'] }}"
with_items:
- "{{ groups['qa-hosts'] }}"发布于 2017-05-20 03:06:43
我喜欢delegate_to。下面是一个示例,在本地主机上,为每个主机运行getent hosts:
---
- hosts: all
connection: ssh
gather_facts: true
tasks:
- name: Lookup ansible_hostname in getent database
command: getent hosts {{ ansible_hostname }}
delegate_to: localhost
register: result
- name: Show results
debug:
var: result.stdout
delegate_to: localhost发布于 2019-11-28 10:23:45
另一种选择是local_action。
在delegate_to和local_action的情况下,请注意,如果使用become = yes,则Ansible当然会隐式尝试使用sudo调用操作,然后可能会失败,因为本地sudo的密码将不同于您为远程sudo输入的任何密码。
https://stackoverflow.com/questions/44004727
复制相似问题