Ansible 将列表中的主机名发送到 python 脚本

Ansible 将列表中的主机名发送到 python 脚本

我想将主机名从 ansible 角色发送到 python 脚本。在我的主机文件中有 2 个主机 1ld900 和 1ld901。

我的角色如下

 ---
    - name:execute python
      script: writetoexcel.py {{ ansible_play_hosts_all | join(" ") }}
      args:
        executable: python3
      delegate_to: localhost

但是在传递它时会将一些额外的“[”传递给 python 脚本。如下所示,并且列表中只有一个索引。

[['1ld900','1ld901']]

如果没有连接,则会发送一些以粗体标记的其他垃圾字符

 "[['**[u**1ld900,', '**u**1ld901**]**']]

请帮助我将干净的列表发送到下面的 python 脚本

["1ld900","1ld901"]

答案1

简短回答:引用论点

    - script: writetoexcel.py "{{ ansible_play_hosts_all|join(' ') }}"

细节:

鉴于库存

shell> cat hosts
cluster
svm1
svm2

以及用于测试的 Python 脚本

shell> cat test.py
import sys


for arg in sys.argv:
    print(arg)

剧本

shell> cat pb.yml
- hosts: all

  tasks:

    - block:
        - script: test.py {{ ansible_play_hosts_all|join(' ') }}
          args:
            executable: python3
          delegate_to: localhost
          register: out
        - debug:
            var: out.stdout_lines
      run_once: true

给出(节选)

TASK [debug] *****************************************************************************
ok: [cluster] => 
  out.stdout_lines:
  - /home/admin/.ansible/tmp/ansible-tmp-1687401621.3263886-1295583-29148533099582/test.py
  - cluster
  - svm1
  - svm2

第一个参数是脚本的路径,其他参数是剧中的所有主机。如果要在单个参数中获取它们,则必须在命令行上引用该参数。由于有多个引用级别,因此最好为此创建一个变量

    - block:
        - script: "test.py '{{ arg }}'"
          args:
            executable: python3
          delegate_to: localhost
          register: out
          vars:
            arg: "{{ ansible_play_hosts_all|join(' ') }}"
        - debug:
            var: out.stdout_lines
      run_once: true

给出(节选)

TASK [debug] *****************************************************************************
ok: [cluster] => 
  out.stdout_lines:
  - /home/admin/.ansible/tmp/ansible-tmp-1687401621.8429682-1295611-212016290172502/test.py
  - cluster svm1 svm2

相关内容