我想将主机名从 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