ansible vagrant windows 和 localhost

ansible vagrant windows and localhost

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

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"

关于您的库存有几点要说:

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

根据您提供的信息,我将如何编写清单。下面的示例使用 ansible 功能在单独的 files/folders 中组织变量。请查看 inventory documentation 了解更多信息。我还为清单使用了 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"

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

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

完成此操作后,您可以使用 my.windows.vagrant 目标来处理您的 vagrant windows 框和 localhost 至 运行 控制器上的内容。

根据您的确切需求进行调整。