使用Vagrant和Ansible在本地主机上运行任务
首先,我看到了很多类似的贴标签的帖子,但没有一篇是有效的。。 我有一个现有的Ansible主机,我成功地使用它将软件部署到其他服务器。我想使用Vagrant设置一个测试环境,在不做任何更改的情况下运行我现有的剧本 我在不同的服务器上安装了Ansible和Vagrant,并复制了playbook、inventory和group/host vars文件 但是,当我运行使用Vagrant和Ansible在本地主机上运行任务,vagrant,ansible,Vagrant,Ansible,首先,我看到了很多类似的贴标签的帖子,但没有一篇是有效的。。 我有一个现有的Ansible主机,我成功地使用它将软件部署到其他服务器。我想使用Vagrant设置一个测试环境,在不做任何更改的情况下运行我现有的剧本 我在不同的服务器上安装了Ansible和Vagrant,并复制了playbook、inventory和group/host vars文件 但是,当我运行vagrant up调用vagrant主机上的playbook时,使用Ansible(远程)provisioner,它在针对主机运行时
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替换为Vagranthost\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只需要更清楚,这实际上解决了他/她的问题。