【问题标题】:Vagrant provision multiple playbooks with multiple ssh usersVagrant 为多个 ssh 用户提供多个剧本
【发布时间】:2018-09-08 00:51:08
【问题描述】:

我正在尝试使用 vagrant 的 ansible 配置器来配置虚拟机。但我有两本剧本,都需要使用不同的 ssh 用户。我的用例是这样的,我有一个在默认设置的vagrant ssh 用户下运行的预配置脚本。然后,我的预配置脚本添加了一个不同的 ssh 用户 provisioner,该用户设置为使用自己的密钥 ssh 到 VM 上。实际配置脚本的任务是删除系统上不安全的 vagrant 用户,因此它必须以不同的 ssh 用户 provsioner(预配置程序创建的用户)身份运行。

我不知道如何更改 Vagrantfile 中的 ssh 用户。下面的例子是我已经走了多远。尽管更改了 config.ssh.username vagrant 始终将 ssh 用户设置为最后一个值,在本例中为 provisioner 并且在运行预配置脚本时不会进行身份验证,因为它尚未创建。

我可以以某种方式覆盖 ssh 用户吗?也许在 do |ansible| 块(下)内有一个 ansible 变量本身?

我想要实现的目标可能吗?看起来很简单,我很震惊我遇到了这么多麻烦。

VAGRANTFILE_API_VERSION = "2"

Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
  config.vm.box = "base_box"
  config.vm.box_url = "s3://bucket/base-box/base.box"
  config.vm.network "private_network", ip: "10.0.3.10"
  config.ssh.keep_alive = true
  config.vm.define "vagrant_image"

  config.vm.provision "ansible" do |ansible_pre|
    config.ssh.username = "vagrant"
    ansible_pre.playbook = "provisioning/pre_provisioning.yml"
    ansible_pre.host_vars = {
      "vagrant_image" => {
        "ansible_host" => "127.0.0.1",
      }
    }
    ansible_pre.vault_password_file = ENV['ANSIBLE_VAULT_PASSWORD_FILE']
  end

  config.vm.provision "ansible" do |ansible|
    config.ssh.username = "provisioner"
    ansible.playbook = "provisioning/provisioning.yml"
    ansible.host_vars = {
      "vagrant_image" => {
        "ansible_host" => "127.0.0.1",
      }
    }
    ansible.vault_password_file = ENV['ANSIBLE_VAULT_PASSWORD_FILE']
  end
end

(如果您想知道 s3 框 url 仅适用于我已安装 vagrant-s3auth (1.3.2) 插件)

【问题讨论】:

    标签: ssh vagrant ansible


    【解决方案1】:

    您可以在多个位置进行设置。 Vagrantfile(但不是config,它将被覆盖),通过 Ansible extravars:

      config.vm.provision "ansible" do |ansible_pre|
        ansible_pre.playbook = "provisioning/pre_provisioning.yml"
        ansible_pre.host_vars = {
          "vagrant_image" => {
            "ansible_host" => "127.0.0.1",
          }
        }
        ansible_pre.extra_vars = {
            ansible_user: "vagrant"
        }
        ansible_pre.vault_password_file = ENV['ANSIBLE_VAULT_PASSWORD_FILE']
      end
    
      config.vm.provision "ansible" do |ansible|
        ansible.playbook = "provisioning/provisioning.yml"
        ansible.host_vars = {
          "vagrant_image" => {
            "ansible_host" => "127.0.0.1",
          }
        ansible.extra_vars = {
            ansible_user: "provisioner"
        }
        ansible.raw_ssh_args = "-i /path/to/private/key/id_rsa"
        ansible.vault_password_file = ENV['ANSIBLE_VAULT_PASSWORD_FILE']
      end
    

    但您也可以编写一个剧本并在其中切换用户。请参阅ansible_user 和meta: reset_connection。

    【讨论】:

    • 谢谢,这与我最终所做的类似。我将"ansible_ssh_user" => "vagrant" 添加到host_vars。这与下面的行配对让我完成了。 config.ssh.insert_key = false config.ssh.private_key_path = ["~/.ssh/id_rsa-provisioner", "~/.vagrant.d/insecure_private_key"]
    • 你也可以在 Vagrantfile 的raw_ssh_args 选项中指定key(我加了一个例子)。
    猜你喜欢
    • 1970-01-01
    • 2022-05-09
    • 1970-01-01
    • 2012-08-09
    • 2018-09-20
    • 1970-01-01
    • 1970-01-01
    • 2019-04-28
    • 2011-08-16
    相关资源
    最近更新 更多