【问题标题】:Using ec2_snapshot getting error message "boto required for this module"使用 ec2_snapshot 获取错误消息“此模块需要 boto”
【发布时间】:2018-02-06 16:38:57
【问题描述】:

我在 AWS 上使用 Ubuntu Server 16.4 和 ansible 2.4

我的剧本正在尝试拍摄 ec2 vol 的快照。见下文

- hosts: localhost
  connection: local
  become: yes
  become_method: sudo
  gather_facts: yes
  any_errors_fatal: True

- name: Take snapshots of all volume"
  ec2_snapshot:
      volume_id: "{{item.id}}"
      description: "Taken on {{ ansible_date_time.date }}"
      snapshot_tags:
          frequency: hourly
  with_items: "{{ aws_ec2_vol_setting }}"

我使用以下 cmd 运行剧本

ansible-playbook -vvv  pb_aws_backup_nw_us_sat.yml

Using module file /usr/lib/python2.7/dist-packages/ansible/modules/cloud/amazon/ec2_snapshot.py
<127.0.0.1> ESTABLISH LOCAL CONNECTION FOR USER: r_ansible
<127.0.0.1> EXEC /bin/sh -c 'echo ~ && sleep 0'
<127.0.0.1> EXEC /bin/sh -c '( umask 77 && mkdir -p "` echo /home/r_ansible/.ansible/tmp/ansible-tmp-1517934063.54-197986659054036 `" && echo ansible-tmp-1517934063.54-197986659054036="` echo /home/r_ansible/.ansible/tmp/ansible-tmp-1517934063.54-197986659054036 `" ) && sleep 0'
<127.0.0.1> PUT /tmp/tmprERpt_ TO /home/r_ansible/.ansible/tmp/ansible-tmp-1517934063.54-197986659054036/ec2_snapshot.py
<127.0.0.1> EXEC /bin/sh -c 'chmod u+x /home/r_ansible/.ansible/tmp/ansible-tmp-1517934063.54-197986659054036/ /home/r_ansible/.ansible/tmp/ansible-tmp-1517934063.54-197986659054036/ec2_snapshot.py && sleep 0'
<127.0.0.1> EXEC /bin/sh -c 'sudo -H -S -n -u root /bin/sh -c '"'"'echo BECOME-SUCCESS-ociuiywkpfvurbbesjwxhczxoglttlsa; /usr/bin/python /home/r_ansible/.ansible/tmp/ansible-tmp-1517934063.54-197986659054036/ec2_snapshot.py; rm -rf "/home/r_ansible/.ansible/tmp/ansible-tmp-1517934063.54-197986659054036/" > /dev/null 2>&1'"'"' && sleep 0'
Using module file /usr/lib/python2.7/dist-packages/ansible/modules/cloud/amazon/ec2_snapshot.py
<127.0.0.1> EXEC /bin/sh -c 'echo ~ && sleep 0'
The full traceback is:
  File "/tmp/ansible_gUIlz4/ansible_module_ec2_snapshot.py", line 127, in <module>
    import boto.ec2

failed: [localhost] (item={u'vol': u'vol-us-sat-01', u'id': u'vol-0b6aaa3b8289580f6', u'server': u'us-nv-sat-01'}) => {
    "changed": false,
    "invocation": {
        "module_args": {
            "aws_access_key": null,
            "aws_secret_key": null,
            "description": null,
            "device_name": null,
            "ec2_url": null,
            "instance_id": null,
            "last_snapshot_min_age": 0,
            "profile": null,
            "region": null,
            "security_token": null,
            "snapshot_id": null,
            "snapshot_tags": {
                "frequency": "hourly"
            },
            "state": "present",
            "validate_certs": true,
            "volume_id": "vol-0b6aaXXXXXXXX",
            "wait": true,
            "wait_timeout": 0
        }
    },
    "item": {
        "id": "vol-0b6aXXXXXXXXXX",
        "server": "us-nv-sat-01",
        "vol": "vol-us-sat-01"
    },
    "msg": "boto required for this module"
}

注意:访问密钥和秘密密钥为空,因为我使用的是分配给服务器的 IAM 角色。

我已经检查了我的主机,至少在我看来,我满足了所有要求。

$ which python
/usr/bin/python
$ pip list boto | grep boto
boto (2.48.0)
boto3 (1.5.23)
botocore (1.8.37)
$ python -V
Python 2.7.12

python 模块似乎都在那里,并且导入很好

$ python
Python 2.7.12 (default, Dec  4 2017, 14:50:18)
[GCC 5.4.0 20160609] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import boto
>>> import boto.ec2
>>> import boto3

所以我不确定为什么会收到错误“此模块所需的 boto”。 我也尝试了here建议的解决方案但没有成功,但我仍然遇到问题。

【问题讨论】:

  • 您以sudo 执行任务,请检查botoroot 帐户下是否也可见。
  • @KonstantinSuvorov 谢谢。这让我能够解决问题。

标签: python-2.7 amazon-ec2 ansible boto


【解决方案1】:

如果 boto 是,您看到的 pip 包可能无法使用安装的默认 python 正常运行(如果您可以运行sudo pip freeze | grep boto,您可以看到完整的包列表)不在那里,您可能需要使用sudo pip install 安装它。另一方面,我宁愿设置一个 python 虚拟环境并安装 Ansible 仅在该隔离环境中需要的所有包,例如:

依赖关系: sudo apt-get install python-setuptools sudo apt-get install python-pip sudo pip install virtualenv

然后创建虚拟环境: virtualenv ansible_vEnv

激活虚拟环境: source ansible_vEnv/bin/activate

然后只需为 ec2.py 安装所有带有 pip 的 python 依赖项:

  • boto > 2.45
  • boto3 > 1.5(不确定是否需要这个)
  • botocore

希望对你有帮助!

【讨论】:

  • 感谢您。 +1 建议并向我介绍“virtualenv”
【解决方案2】:

我建议你使用 apt-get 卸载 ansible 并使用 pip 安装它。

sudo apt uninstall ansible
sudo apt install gcc python-dev python-pip
sudo pip install --upgrade PyCrypto ansible awscli boto boto3 ansible-role-manager ansible-playbook-debugger retry

【讨论】:

    【解决方案3】:

    @Konstantin Suvorov 的建议是正确的。 Boto 没有为 root/sudo 安装

    不知道我是怎么做到的,但 pipboto 安装在本地用户下:~/.local/lib/python2.7/site-packages/

    当我以 root 身份登录并尝试运行 pip 来安装 boto 时,出现以下错误:

        root$ pip
    Traceback (most recent call last):
      File "/usr/local/bin/pip", line 5, in <module>
        from pkg_resources import load_entry_point
      File "/usr/lib/python2.7/dist-packages/pkg_resources/__init__.py", line 2927, in <module>
        @_call_aside
      File "/usr/lib/python2.7/dist-packages/pkg_resources/__init__.py", line 2913, in _call_aside
        f(*args, **kwargs)
      File "/usr/lib/python2.7/dist-packages/pkg_resources/__init__.py", line 2940, in _initialize_master_working_set
        working_set = WorkingSet._build_master()
      File "/usr/lib/python2.7/dist-packages/pkg_resources/__init__.py", line 637, in _build_master
        return cls._build_from_requirements(__requires__)
      File "/usr/lib/python2.7/dist-packages/pkg_resources/__init__.py", line 650, in _build_from_requirements
        dists = ws.resolve(reqs, Environment())
      File "/usr/lib/python2.7/dist-packages/pkg_resources/__init__.py", line 829, in resolve
        raise DistributionNotFound(req, requirers)
    pkg_resources.DistributionNotFound: The 'pip==9.0.1' distribution was not found and is required by the application
    

    要查找 pip root 使用的版本,我执行了以下操作:$python -c "import pip; print(pip.__version__)

    发现是pip版本8.1.1。然后我更新了以下文件:$vi /usr/local/bin/pip

     #!/usr/bin/python
    # EASY-INSTALL-ENTRY-SCRIPT: 'pip==9.0.1','console_scripts','pip'
    __requires__ = 'pip==9.0.1'
    import sys
    from pkg_resources import load_entry_point
    
    if __name__ == '__main__':
        sys.exit(
            load_entry_point('pip==9.0.1', 'console_scripts', 'pip')()
        )
    

    并将 9.0.1 的所有引用更改为 8.1.1。 这允许 pip 在以 root 身份登录时工作。然后我使用$"sudo -H pip install --upgrade pip 更新了 pip,使用$python -c "import pip; print(pip.__version__) 检查显示了 root 和 ansible 用户的正确版本

    这意味着安装在盒子上的所有 pip 现在都是相同的版本。我确信这不是一个好的解决方案,对于所有用户(ansible 和 root)来说都指向同一个 pip 安装会更好,但我不知道该怎么做。

    通过 pip 工作,我能够安装 boto 和 boto3 pip install botopip install boto3

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-15
      • 1970-01-01
      • 2016-11-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多