我正在尝试运行一些本地命令,遍历库存文件并将每个主机名作为参数传递给本地命令。
例如:我想运行命令"刀节点创建{{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&#39 ;.
有人会帮我理解如何完成它。基本上,我想要变量'主机名'并将其传递到上面的游戏块。
答案 0 :(得分:5)
我喜欢 delegate_to 。以下示例在 localhost 上为每个主机运行 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
答案 1 :(得分:4)
您可以使用以下播放来访问主机名,因为广告资源信息可用作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'] }}"
答案 2 :(得分:0)
另一种选择是local_action。
对于delegate_to
和local_action
而言,请注意,如果become = yes
,那么Ansible当然会隐式尝试使用sudo
来调用动作,然后可能会失败,因为本地sudo
的密码将不同于您为远程sudo
输入的任何密码。