【问题标题】:Provisioning Ubuntu 16.04 Vagrant with Ansible fails on chown在 chown 上使用 Ansible 配置 Ubuntu 16.04 Vagrant 失败
【发布时间】:2016-06-14 02:58:23
【问题描述】:

我正在尝试使用 Ansible 配置 Ubuntu Xenial Vagrant 来宾。它在 Ubuntu 14.04 上正常工作,但在 16.04 上失败。我得到的错误是

chown failed: failed to look up user vagrant

我正在运行的任务如下:

- name: Ensure /srv/web exists become: yes file: path: /srv/web state: directory mode: 0755 owner: "{{ remote_user }}"

搜索没有找到太多帮助。

谢谢!

编辑:对 Digital Ocean 14.04 液滴的进一步测试也显示了这个问题。

编辑 2:Full output log 在 -vvvv 级别

【问题讨论】:

  • 也许这与您正在使用的特定图像有关。
  • 我也遇到了与数字海洋 14.04 图像相同的问题。我会更新我的问题
  • 您可以改用“Bento Boxes”——ubuntu 便当盒带有一个更典型的“vagrant”用户

标签: ubuntu vagrant ansible


【解决方案1】:

解决方案#1

Ubuntu 16.04 有 python3,而不是 2.7.x。 Ansible 还不支持 Python 3。

对于 Ubuntu 16.04,我使用以下游戏来安装 Python 2.7。

---
- hosts: xenials 
  gather_facts: no
  become: yes
  tasks:
    - name: Install python 2.7 
      raw: apt-get update -qq && apt-get install -qq python2.7

    - name: check if softlink exists
      stat:
        path: /usr/bin/python
      register: python_file

    - name: create softlink for python 2.7
      raw: ln -s /usr/bin/python2.7 /usr/bin/python
      when: python_file.stat.islnk is not defined

    - name: Ensure /srv/web exists
      file:
        path: /srv/web
        state: directory
        mode: 0755
        owner: "{{ remote_user }}" # hope you have defined this variable in your ansible.cfg

关键行是gather_facts: no,它会阻止 Ansible 在远程服务器上执行远程服务器尚不支持的代码。没有这一行,播放将失败。

这提供了一个/usr/bin/python2.7,我在我的库存文件中明确指出了它。

[xenials] 
192.168.33.100 

[xenials:vars] 
ansible_python_interpreter=/usr/bin/python2.7 

请注意,名称 xenials 并没有什么特别之处。这只是我在库存中定义的一个组。

这个ansible_python_interpreter第一次才需要,之后你可以删除它,因为我们已经为python2.7创建了软链接 希望对你有所帮助。

解决方案#2

出现此错误的原因:

我已经查看了包含详细日志的要点并发现了这一点:

  • 相信你用的是官方的vagrant boxubuntu/xenial64
  • 这个官方的vagrant box没有vagrant用户
  • "msg": "chown failed: failed to look up user vagrant" 这是错误跟踪,可帮助您找到确切的错误。

此错误的解决方案 1:

下载一些其他的vagrant box,推荐这个vagrant boxgeerlingguy/ubuntu1604口碑真的很好

此错误的解决方案 2:

使用官方的 vagrant box,你可以像我一样做来减轻这个错误。将以下内容添加到您的Vagrantfile

config.vm.provision "shell" do |s|
    ssh_pub_key = File.readlines("#{Dir.home}/.ssh/id_rsa.pub").first.strip
    ssh_user = ENV['USER']
    s.inline = <<-SHELL
      adduser --disabled-password --gecos "" #{ssh_user}
      mkdir -p /home/#{ssh_user}/.ssh
      touch /home/#{ssh_user}/.ssh/authorized_keys
      chown -R #{ssh_user}. /home/#{ssh_user}/.ssh
      echo "#{ssh_user} ALL=(ALL) NOPASSWD:ALL" > /etc/sudoers.d/99-#{ssh_user}
      echo #{ssh_pub_key} >> /home/#{ssh_user}/.ssh/authorized_keys
      chmod 0440 /etc/sudoers.d/99-#{ssh_user}
    SHELL
  end

它将做的是,只需为来宾创建您的主机登录用户并为其上传 rsa 密钥。因此,您可以将 playbook 运行到 vagrant 机器上,就像它是远程机器一样。如果您进一步遇到任何问题,请告诉我。

希望对您有所帮助。

【讨论】:

  • 请增加详细程度并将错误粘贴到您的问题中
  • 我在问题中添加了一个包含完整输出的要点
  • 谢谢,解决了 vagrant 的错误。至于数字海洋,我的变量文件中有一个逗号,所以它正在寻找“用户名”而不是“用户名”
【解决方案2】:

我遇到了同样的问题。我正在使用ubuntu/xenial64

我注意到没有vagrant 用户。当我使用 Vagrant SSH 时,使用的是 ubuntu 用户。

我创建了一个ansible.cnf

[default]
remote_user = ubuntu

之后我遇到了另一个问题:没有 python。我用以下方法解决了这个问题:

sudo apt-get install python2.7
sudo apt-get install python-pip

现在,ansible ping 模块适用于我的主机。

$ ansible elastichsearch -m ping
192.168,101.10 | SUCCESS => {
    "changed": false,
    "ping": "pong"
}

【讨论】:

    猜你喜欢
    • 2017-10-11
    • 2017-09-19
    • 2014-08-09
    • 2017-01-11
    • 1970-01-01
    • 2017-08-16
    • 2017-12-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多