ansible_python_interpreter_fallback 不起作用

问题描述 投票:0回答:2

我有一个剧本,其中混合了

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
python ansible
2个回答
0
投票

查看

ansible --version
的输出,我注意到您没有使用
"/Users/jd/projects/mgr2/ansible/bin/python3"
brew install ansible 位于您的 $PATH 中。对于 virtualenv
source /Users/jd/projects/mgr2/ansible/bin/activate

请注意,Ansible 在大多数平台上会自动发现 python 解释器。 文档:解释器发现


0
投票

您不能像这样混合和匹配动态库存和“常规”(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"
© www.soinside.com 2019 - 2024. All rights reserved.