首先,我已经看到很多类似标记的帖子,但没有任何作用..我有一个成功用于将软件部署到其他服务器的现有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 回答
将localhost添加到ansible.limit解决了我的问题我每个Vagrantfile执行只启动一次配置,所以我使用
如果您为每个VM启动Ansible配置,您可能会使用类似的东西
限制键直接传递给Ansible,Vagrant在任何情况下都设置它 . 如果未直接指定limit,则将其设置为当前VM主机名,以便Ansible仅适用于正在配置的VM .
我将根据您的第一个剧本示例回答:
在这个剧本摘录中,当你说
hosts: localhost
时,你实际上并没有告诉他们在localhost(127.0.0.1)上运行任务 . 相反,ansible期望'localhost'成为'hosts'文件中的 Headers ,默认情况下,该文件位于:/ etc / ansible / hosts .为了证明这一点,请查看Wallabag's Docker repo中ansible playbook的结构:
请注意如何有一个ansible playbook(entrypoint.yml)和另一个hosts文件 . hosts文件读取:
此文件称为Inventory,提供应在其上运行playbook的主机列表 . 现在看一下entrypoints.yml playbook的前两行:
当我们说主机的条目是'localhost'时,我们没有使用localhost来表示127.0.0.1,但我们只是指
[localhost]
Headers 下hosts文件中的所有主机 .因此,如果我们想保持相同的功能,但将hosts文件更改为:
我们想要将entrypoint.yml的第二行更改为:
基本上,我知道剧本有效,因为我一直在运行它 . 我尝试在Vagrant主机上手动运行它并按预期运行 . 然后,这只是一个用可通过插件获得的Vagrant
host_shell
配置器替换Ansible配置器的情况:为了完整性: