首页 文章

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

提问于
浏览
4

首先,我已经看到很多类似标记的帖子,但没有任何作用..我有一个成功用于将软件部署到其他服务器的现有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

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

    ansible.limit = "all,localhost"
    

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

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

    限制键直接传递给Ansible,Vagrant在任何情况下都设置它 . 如果未直接指定limit,则将其设置为当前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 时,你实际上并没有告诉他们在localhost(127.0.0.1)上运行任务 . 相反,ansible期望'localhost'成为'hosts'文件中的 Headers ,默认情况下,该文件位于:/ etc / ansible / hosts .

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

    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,但我们只是指 [localhost] Headers 下hosts文件中的所有主机 .


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

    [bingo]
    localhost
    

    我们想要将entrypoint.yml的第二行更改为:

    ---
    - hosts: bingo
    ...
    
  • 2

    基本上,我知道剧本有效,因为我一直在运行它 . 我尝试在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
    

相关问题