【问题标题】:Running tasks on localhost with Vagrant and Ansible使用 Vagrant 和 Ansible 在 localhost 上运行任务
【发布时间】:2016-07-19 03:45:32
【问题描述】:

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

我在不同的服务器上安装了 Ansible 和 Vagrant,并复制了 playbook、inventory 和 group/host vars 文件。

但是,当我使用 Ansible(远程)配置程序运行 vagrant up 调用 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 主机上总是跳过该步骤。

【问题讨论】:

    标签: vagrant ansible


    【解决方案1】:

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

    ansible.limit = "all,localhost"
    

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

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

    limit key 直接传递给 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 在 localhost (127.0.0.1) 上运行任务。相反,ansible 期望 'localhost' 是 'hosts' 文件中的标题,默认情况下,该文件位于:/etc/ansible/hosts。

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

      注意有一个 ansible playbook (entrypoint.yml) 和另一个 hosts 文件。主机文件读取:

      [localhost]
      localhost
      

      这个文件,称为Inventory,提供了应该在其上运行 playbook 的主机列表。现在看看 entrypoints.yml playbook 的前两行:

      ---
      - hosts: localhost
      ...
      

      当我们说主机的条目是“localhost”时,我们并不是使用 localhost 来表示 127.0.0.1,而是指代主机文件中 [localhost] 标题下的所有主机。


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

      [bingo]
      localhost
      

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

      ---
      - hosts: bingo
      ...
      

      【讨论】:

        【解决方案3】:

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

        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
        

        【讨论】:

        • 这是关于问题的附加信息还是您找到了解决方案?这里的格式是问答,不是你发新帖来添加更多信息的论坛。
        • 这实际上是唯一对我最近的 Ansible 和 Vagrant 有用的东西。 OP 只需要更清楚一点,这实际上解决了他/她的问题。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-10-22
        • 1970-01-01
        • 1970-01-01
        • 2017-09-26
        • 2020-09-23
        • 1970-01-01
        相关资源
        最近更新 更多