1

我有一个使用 win_rm 的 vagrant 框,但是,我需要从中获取一个文件并在我的本地主机(MacO)上使用 blockinfile,然后将文件复制回 vagrant 框。

Ansible 不喜欢库存中有两个 127.0.0.1 项目。我已经尝试了几乎所有我能想到的都无法让他们一起工作的方法。

在 VirtualBox 上运行的 vagrant 设置了 NAT,但除了通过环回地址外,我似乎无法访问它。那可能会解决我的问题。

我还尝试在 Vagrantfile 中设置不同的 IP,但也没有任何成果。

下面是我一直在使用的库存文件。

[win]
127.0.0.1


[localhost]
control_machine ansible_host=local

[win:vars]
ansible_port=55985
ansible_winrm_transport=basic
ansible_winrm_scheme=http
ansible_user=vagrant
ansible_password="{{ lookup('env', 'WIN_GUEST_PASSWORD') }}"
nsible_connection=winrm


[localhost:vars]
ansible_user=test
ansible_connection=local
ansible_python_interpreter="/Library/Frameworks/Python.framework/Versions/3.8/bin/python3"
4

1 回答 1

1

关于您的库存,有几件事要说:

  1. 您似乎混淆了组和主机的概念
  2. 您正在定义一个与隐式主机(即)同名的组localhost(可能是因为第 1 点)
  3. 您正在为您的 ansible 控制器显式定义一个主机,而这实际上可能不是您想要的,因为ansible 为您定义了一个隐式 localhost。请注意,显式定义使您的控制器与all大多数情况下通常不需要的魔术组匹配。

根据您提供的信息,这是我编写库存的方式。下面的示例使用 ansible 功能在单独的文件/文件夹中组织变量。请查看库存文档以获取更多信息。我还为库存使用了 yaml 格式,因为它更容易理解 IMO。如果您愿意,请随意翻译回 ini

in inventories/my_env/hosts.yml(任何文件名都可以)

---
all:
  hosts:
    my.windows.vagrant:

inventories/my_env/host_vars/my.windows.vagrant.yml

---
ansible_host: 127.0.0.1
ansible_port: 55985
ansible_winrm_transport: basic
ansible_winrm_scheme: http
ansible_user: vagrant
ansible_password: "{{ lookup('env', 'WIN_GUEST_PASSWORD') }}"
ansible_connection: winrm

inventories/my_env/host_vars/localhost.yml

---
ansible_python_interpreter: "/Library/Frameworks/Python.framework/Versions/3.8/bin/python3"

请注意,我没有(重新)定义清单中的隐式 localhost,只定义了您在该主机上使用的(非标准)python 解释器。另请注意,我将 localhost 的其他变量删除为:

  1. 隐式 localhostlocal默认使用连接插件
  2. 本地连接插件不ansible_user考虑并使用已经登录的用户(即在控制器上启动剧本的用户)

完成此操作后,您可以使用my.windows.vagrant目标来处理您的 vagrant windows 框并localhost在控制器上运行东西。

适应您的确切需求。

于 2021-06-19T11:47:44.380 回答