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

6
首先,我看到很多类似标记的帖子,但没有一个有效的... 我有一个现有的Ansible主机,我成功地用它来向其他服务器部署软件。我想使用Vagrant设置一个测试环境,运行我的现有playbook(s)而不需要任何更改。
我在另一台服务器上安装了Ansible和Vagrant,并复制了playbook、清单和组/主机vars文件。
然而,当我运行vagrant up时,它会在Vagrant主机上使用Ansible(远程)provisioner调用playbook,并在针对主机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 }}" 

我也尝试过以下方法:

- 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 }}"

我的静态库存(摘录)如下:

'# Ungrouped hosts, specify before any group headers.
localhost ansible_connection=local

我尝试过使用动态清单和在playbook和清单文件中使用各种组合的 localhost/127.0.0.1,但该步骤总是被跳过在Vagrant主机上。

3个回答

6
将 localhost 添加到 ansible.limit 中解决了我的问题。每次运行 Vagrantfile 时,我只启动一次供应配置,因此我使用:
ansible.limit = "all,localhost"

如果你要为每个虚拟机启动Ansible配置,则可以使用以下方式:

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

限制键可以直接传递给Ansible,而Vagrant在任何情况下都会设置它。如果没有直接指定限制条件时,它将被设置为当前VM主机名,以便Ansible仅与正在进行配置的VM一起使用。


2
我将根据您的第一个剧本示例进行回答:
- 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在本地主机(127.0.0.1)上运行任务。相反,ansible期望“localhost”是“hosts”文件中的一个标题,默认情况下可以在此处找到:/etc/ansible/hosts。
为了演示这一点,请查看Wallabag's Docker repo中ansible playbook的结构。

Wallabag's Ansible Setup

注意ansible playbook(entrypoint.yml)和另一个hosts文件。hosts文件的内容如下:
[localhost]
localhost

这个文件称为清单,提供了应该运行playbook的主机列表。现在看一下entrypoints.yml playbook的前两行:
---
- hosts: localhost
...

当我们说 hosts 的条目是“localhost”时,我们并不是使用 localhost 指代 127.0.0.1,而是简单地指的是 hosts 文件中在 [localhost] 标题下的所有主机。
因此,如果我们想保持相同的功能,但更改了主机文件为:
[bingo]
localhost

我们想要将entrypoint.yml的第二行更改为:
---
- hosts: bingo
...

0

基本上,我知道这个playbook有效,因为我一直在运行它。 我尝试在Vagrant主机上手动运行它,并且它按预期运行。 然后只需使用可通过插件获得的Vagrant host_shell provisioner替换Ansible 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

这是关于问题的额外信息还是您找到了解决方案?这里的格式是问答,而不是论坛,在此添加额外信息不应该新建帖子。 - bschlueter
这实际上是我在最近的Ansible和Vagrant中使用的唯一有效方法。OP只需要更清楚地表明这实际上解决了他/她的问题。 - Ken J

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接