当我运行这个简单的Ansible剧本时:
- name: EC2 Test Example hosts: localhost connection: local gather_facts: False tasks: - name: EC2 Instance ec2: # Amazon EC2 key pair name key_name: my-key-pair # Amazon EC2 Security Group group: my-security-group instance_type: t2.micro # Latest from https://wiki.debian.org/Cloud/AmazonEC2Image/Jessie image: ami-221ea342 wait: yes register: ec2
我跑venv/bin/ansible-playbook -i localhost, playbook.yml
:
PLAY [EC2 Test Example] ******************************************************** TASK [EC2 Instance] ************************************************************ fatal: [localhost]: FAILED! => {"changed": false, "failed": true, "msg": "boto required for this module"} to retry, use: --limit @/Users/admin/temp/ansec2/playbook.retry PLAY RECAP ********************************************************************* localhost : ok=0 changed=0 unreachable=0 failed=1
显然,我在我正在使用的venv中安装了boto以及我的默认系统Python:
? ansec2 venv/bin/pip list Package Version --------------- -------- ansible 2.2.1.0 boto 2.45.0 boto3 1.4.4 botocore 1.5.4 ...
我已经阅读了一些类似的帖子,但我没有看到有效的解决方案.
你的问题的根本原因是-i localhost,
黑客攻击.您不需要在Ansible中再使用它.
你可以运行:
ansible-playbook playbook.yml
并与connection: local
在剧中Ansible将VENV使用Python可执行程序集.
当你使用-i localhost,
hack时,Ansible会调用它的默认值/usr/bin/python
.
在这种情况下,您仍然可以添加ansible_python_interpreter
参数以告知Ansible使用此特定环境:
ansible-playbook -i localhost, playbook.yml --extra-vars "ansible_python_interpreter=/Users/admin/temp/ansec2/venv/bin/python"
但我认为你应该避免使用第一种方法.