我有一个剧本,其中混合了
connection: local
任务和使用 AWS 动态清单的远程任务。 Python 解释器在本地和远程系统上有不同的路径。
通过另一个问题python3 venv - 如何为混合连接的剧本同步ansible_python_interpreter:本地和目标系统,我确定我应该使用
ansible_python_interpreter_fallback
来配置两个Python解释器路径来尝试。但我无法让他们工作。
我已经尝试过:
在我的剧本中定义它:
---
- hosts: tag_group_web_servers
vars_files:
- group_vars/au
roles:
- autodeploy
vars:
ansible_python_interpreter_fallback:
- /Users/jd/projects/mgr2/ansible/bin/python3
- /usr/bin/python3
,被忽略
并在动态库存中定义它:
plugin: aws_ec2
regions:
- ap-southeast-2
- us-east-1
hostnames:
- ip-address
keyed_groups:
- prefix: "tag"
key: tags
- prefix: "group"
key: tags
- prefix: "security_groups"
key: 'security_groups|json_query("[].group_name")'
all:
hosts:
127.0.0.1:
ansible_connection: local
ansible_python_interpreter: "/Users/jd/projects/mgr2/ansible/bin/python3"
remote:
ansible_host: remote.host.ip
ansible_python_interpreter: /usr/bin/python3
ansible_python_interpreter_fallback:
- /Users/jd/projects/mgr2/ansible/bin/python3
- /usr/bin/python3
,这也被忽略了。
我很困惑这还能去哪里或者为什么它不起作用。
这是我的 Ansible 版本:
ansible [core 2.17.4]
config file = /Users/jd/projects/mgr2/ansible/ansible.cfg
configured module search path = ['/Users/jd/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules']
ansible python module location = /opt/homebrew/lib/python3.11/site-packages/ansible
ansible collection location = /Users/jd/.ansible/collections:/usr/share/ansible/collections
executable location = /opt/homebrew/bin/ansible
python version = 3.11.10 (main, Sep 7 2024, 01:03:31) [Clang 15.0.0 (clang-1500.3.9.4)] (/opt/homebrew/opt/[email protected]/bin/python3.11)
jinja version = 3.1.4
libyaml = True
查看
ansible --version
的输出,我注意到您没有使用 "/Users/jd/projects/mgr2/ansible/bin/python3"
。 brew install ansible 位于您的 $PATH 中。对于 virtualenv source /Users/jd/projects/mgr2/ansible/bin/activate
。
请注意,Ansible 在大多数平台上会自动发现 python 解释器。 文档:解释器发现
您不能像这样混合和匹配动态库存和“常规”(YAML)库存,您必须创建两个不同的库存文件。
原因是 Ansible 在加载清单文件时推断出清单。
如果您在详细模式下运行 Ansible(使用选项
-vvv
),您实际上可以意识到这一点
$ ansible-playbook play.yml -vvv
(... some lines not relevant for the issue at hand)
Using inventory plugin 'ansible_collections.amazon.aws.plugins.inventory.aws_ec2'
to process inventory source '/usr/local/ansible/inventories/inventory.aws_ec2.yml'
Parsed /usr/local/ansible/inventories/inventory.yml inventory source with yaml plugin
(...)
好处是您可以将 Ansible 清单配置为文件列表或配置文件中的清单文件夹。
例如,我的
ansible.cfg
读作
inventory =
/usr/local/ansible/inventories/
但是你也可以做类似的事情
inventory =
/usr/local/ansible/inventories/inventory.yml, # YAML inventory
/usr/local/ansible/inventories/inventory.aws_ec2.yml # EC2 inventory
compose
参数 在动态清单中设置变量:
plugin: aws_ec2
regions:
- ap-southeast-2
- us-east-1
hostnames:
- ip-address
# You can define variable(s) for the dynamic hosts here,
# and it can even be applied with Jinja templating, making those dynamic
compose:
ansible_python_interpreter: '/usr/bin/python3'
keyed_groups:
- prefix: "tag"
key: tags
- prefix: "group"
key: tags
- prefix: "security_groups"
key: 'security_groups|json_query("[].group_name")'
然后在 YAML 库存中,定义本地任务的解释器:
all:
hosts:
127.0.0.1:
ansible_connection: local
ansible_python_interpreter: "/Users/jd/projects/mgr2/ansible/bin/python3"