使用Vagrant和Ansible在本地主机上运行任务

使用Vagrant和Ansible在本地主机上运行任务,vagrant,ansible,Vagrant,Ansible,首先,我看到了很多类似的贴标签的帖子,但没有一篇是有效的。。 我有一个现有的Ansible主机,我成功地使用它将软件部署到其他服务器。我想使用Vagrant设置一个测试环境,在不做任何更改的情况下运行我现有的剧本 我在不同的服务器上安装了Ansible和Vagrant,并复制了playbook、inventory和group/host vars文件 但是,当我运行vagrant up调用vagrant主机上的playbook时,使用Ansible(远程)provisioner,它在针对主机运行时

首先,我看到了很多类似的贴标签的帖子,但没有一篇是有效的。。 我有一个现有的Ansible主机,我成功地使用它将软件部署到其他服务器。我想使用Vagrant设置一个测试环境,在不做任何更改的情况下运行我现有的剧本

我在不同的服务器上安装了Ansible和Vagrant,并复制了playbook、inventory和group/host vars文件

但是,当我运行
vagrant up
调用vagrant主机上的playbook时,使用Ansible(远程)provisioner,它在针对主机运行时会给出以下消息:localhost

PLAY [Set fact for later use] **************************************************
skipping: no hosts matched
剧本(摘录)如下所示:

- name: Set fact for later use
  hosts: localhost
  tasks:
    - name: set number of hosts for later use
      set_fact: num_hosts="{{ groups[tagname] | length }}" 
'# Ungrouped hosts, specify before any group headers.
localhost ansible_connection=local
我也试过:

- name: Set fact for later use
  hosts: 127.0.0.1
  connection: local
  tasks:
    - name: set number of hosts for later use
      set_fact: num_hosts="{{ groups[tagname] | length }}"
我的静态清单(摘录)如下所示:

- name: Set fact for later use
  hosts: localhost
  tasks:
    - name: set number of hosts for later use
      set_fact: num_hosts="{{ groups[tagname] | length }}" 
'# Ungrouped hosts, specify before any group headers.
localhost ansible_connection=local

我在playbook和资源清册文件中尝试了动态资源清册和
localhost
/
127.0.0.1
的各种组合,但在流浪主机上总是跳过这一步骤。

基本上,我知道playbook是有效的,因为我一直在运行它。 我试着在流浪主机上手动运行它,它按预期运行。 然后简单地将Ansible provisioner替换为Vagrant
host\u shell
provisioner,该provisioner可通过插件获得:

vagrant plugin install vagrant-host-shell
完整性:

config.vm.provision :host_shell, inline: <<-SHELL
  cd ansible
  ansible-playbook -v -i inventory install.yml --extra-vars '{"db":"mysql"}'
  SHELL

config.vm.provision:host\u shell,内联:将localhost添加到ansible.limit解决了我的问题
每次执行文件时,我只启动一次资源调配,因此我使用

ansible.limit = "all,localhost"
在为每个VM启动Ansible资源调配时,您可以使用

ansible.limit = "#{machine.vm.hostname},localhost"

限制键直接传递给Ansible,流浪汉在任何情况下都会设置它。如果未直接指定限制,它将被设置为当前VM主机名,因此Ansible将仅适用于当前正在配置的VM。

我将根据您的第一个剧本示例回答:

- name: Set fact for later use
  hosts: localhost
  tasks:
    - name: set number of hosts for later use
      set_fact: num_hosts="{{ groups[tagname] | length }}"
在这个剧本摘录中,当您说
hosts:localhost
,实际上并不是告诉ansible在localhost(127.0.0.1)上运行任务。相反,ansible希望“localhost”是“hosts”文件中的标题,默认情况下,该文件位于:/etc/ansible/hosts

为了证明这一点,请查看以下内容中ansible剧本的结构:

注意有一个ansible playbook(entrypoint.yml)和另一个hosts文件。主机文件读取:

[localhost]
localhost
此文件称为,它提供了运行playbook的主机列表。现在看entrypoints.yml剧本的前两行:

---
- hosts: localhost
...
当我们说主机的条目是“localhost”时,我们并不是用localhost来表示127.0.0.1,而是指主机文件中
[localhost]
标题下的所有主机


因此,如果我们希望保留相同的功能,但将主机文件更改为:

[bingo]
localhost
我们希望将entrypoint.yml的第二行更改为:

---
- hosts: bingo
...

这是关于这个问题的附加信息还是您找到了解决方案?这里的形式是问答,它不是一个论坛,你可以在这里发表新的帖子来添加额外的信息。这实际上是我在最新的Ansible和Vagrant中唯一有效的方法。OP只需要更清楚,这实际上解决了他/她的问题。