使用Vagrant和Ansible在localhost上运行任务

时间:2016-03-30 22:14:05

标签: vagrant ansible

首先,我看过很多类似标记的帖子,但没有任何效果。 我有一个成功用于将软件部署到其他服务器的现有Ansible主机。我想使用Vagrant设置测试环境来运行我现有的playbook而不做任何更改。

我已在其他服务器上安装了Ansible和Vagrant,并复制了playbook,inventory和group / host vars文件。

但是,当我运行vagrant up使用Ansible(远程)配置程序调用Vagrant主机上的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

我在剧本和广告资源文件中尝试了动态广告资源以及localhost / 127.0.0.1的各种组合,但在Vagrant主机上始终跳过该步骤。

3 个答案:

答案 0 :(得分:2)

将localhost添加到ansible.limit解决了我的问题 我每个Vagrantfile执行只启动一次配置,所以我使用

ansible.limit = "all,localhost"

如果您为每个VM启动Ansible配置,您可以使用类似

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

限制键直接传递给Ansible,Vagrant在任何情况下都设置它。如果未直接指定limit,则将其设置为当前VM主机名,以便Ansible仅适用于正在配置的VM。

答案 1 :(得分: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时,你实际上并没有告诉他们在localhost(127.0.0.1)上运行任务。相反,ansible期待着“本地主人”。成为主持人的头衔默认情况下,在此处找到的文件:/ etc / ansible / hosts。

为了证明这一点,请查看Wallabag's Docker repo中ansible剧本的结构:

Wallabag's Ansible Setup

注意如何有一个ansible playbook(entrypoint.yml)和另一个hosts文件。 hosts文件显示为:

[localhost]
localhost

此文件称为Inventory,提供应在其上运行Playbook的主机列表。现在看一下entrypoints.yml playbook的前两行:

---
- hosts: localhost
...

当我们说主机的条目是' localhost'时,我们没有使用localhost来表示127.0.0.1,但我们只是引用{{下的hosts文件中的所有主机。 1}}标题。

因此,如果我们想保持相同的功能,但将hosts文件更改为:

[localhost]

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

[bingo]
localhost

答案 2 :(得分:0)

基本上,我知道剧本有效,因为我一直在运行它。 我尝试在Vagrant主机上手动运行它并按预期运行。 然后,这只是用可通过插件获得的Vagrant host_shell配置器替换Ansible配置器的情况:

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