如何通过 Ansible Tower API 将可变数据传递给剧本模板

How to pass variable data through Ansible Tower API to a playbook template

我们使用 Ansible Tower for Operations 来执行进程重启。如果他们收到一个提示进程已停止的警报,他们将执行 Ansible Tower 作业并提供警报中的主机名和进程名称作为“调查”变量。 [还有很多事情发生,我们不会盲目地重新开始每次失败。]

我想使用 python 通过从警报中获取主机名和进程名称并调用 Tower 模板来自动执行此操作。我想将主机名和进程名作为“-e”变量传递,但我找不到任何关于如何在 python.

中编写“extra_vars”的文档

带有服务变量的剧本部分如下所示:

- name: Check "{{ service }}"
  shell: systemctl status "{{ service }}".service | grep Active | awk -v N=2 '{print $N}'
  register: output
  tags: always

- name: Start "{{ service }}"
  service:
    name: "{{ service }}"
    state: started
  when: output.stdout == 'inactive'
  tags: start

python3 代码的相关部分如下所示:

headers = {'Content-Type': 'application/json'}
data = see below, this is where I am stuck
response = requests.post('http://localhost/api/v2/job_templates/13/launch/', headers=headers, data =data, verify=False, auth=('user','pass')

我试过:

data = '{"service":"apache2"}'
data = '{"variables":["service","apache2"]}
data = '{"extra_vars":["service","apache2"]}

这些都失败导致请求失败并返回 400 响应。

Whosebug 中似乎有使用 VariableManager() 的答案,但该方法似乎绕过了 Tower 和现有模板。

关于我如何通过“extra_vars”有什么想法吗?

谢谢

根据 https://docs.ansible.com/ansible-tower/latest/html/towerapi/api_ref.html#/Job_Templates/Job_Templates_job_templates_launch_create,Tower 期望 JSON 主体中的变量为 extra_vars

这次尝试最接近:

data = '{"extra_vars":["service","apache2"]}

但是,出于某种原因,您将其格式化为字符串列表,而不是将变量的标准表示形式用作 dictionary/mapping。

data = '{"extra_vars": {"service": "apache2"}}'

找到了。

我保留了 运行“curl”命令,试图填充“服务”变量并收到此错误:“variables_needed_to_start value missing”,当我用谷歌搜索时,我在Ansible 文档:(https://docs.ansible.com/ansible-tower/latest/html/userguide/job_templates.html#extra-variables)

body = '{"extra_vars": {"变量":"值"}}'

谢谢