首先,我看过很多类似标记的帖子,但没有任何效果。 我有一个成功用于将软件部署到其他服务器的现有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主机上始终跳过该步骤。
答案 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剧本的结构:
注意如何有一个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