在Ansible中循环执行任务

时间:2018-11-14 13:31:21

标签: loops ansible uri

我在Ansible中执行以下任务:

class Company(tk.Toplevel):
    def __init__(self):
        self.init_ui()

    def init_ui(self):
        company_name_lbl = ttk.Label(self, text="Company Name").grid(
            row=1, column=0, sticky='w')
        self.company_name_entry = ttk.Entry(self)
        self.company_name_entry.grid(row=1, column=1)

        company_address_lbl = ttk.Label(self, text="Company Address").grid(
            row=1, column=0, sticky='w')
        self.company_address_entry = ttk.Entry(self)
        self.company_address_entry.grid(row=1, column=1)

        save_btn = ttk.Button(self, text="Save", command=self.insert_to_sql)


    def insert_to_sql(self):
        value_list = ["NULL", self.company_name_entry.get(), self.company_address_entry.get()]
        column_header_list =  ["company_id", "name", "adress"]

        sql = SQLCommands()

        for i in range(len(value_list)):
            sql.insert(table="companies", column=column_header_list[i], value=value_list[i])

如您所见,它进行Web服务调用,将SOAP响应转换为JSON,然后提取相关值(整数)并将其设置为事实。我需要重复此代码块,直到上述整数值等于某个整数为止。

关于如何处理此任务的任何想法?

1 个答案:

答案 0 :(得分:0)

如果响应采用JSON格式,那么使用until来执行ans do-until loop会很容易实现。 但是,这是一个带有xml响应的有效示例。

先决条件:(确保在ansible主机上安装了python依赖项)

1)使用自定义xml_to_json过滤器。

2)使用json_query过滤器

P.S。由于已经满足until的条件,因此执行后续播放不会触发重试。 如果要测试重试是否正常,请更改until条件或请求标头中的tag值。

---
- name: Retry url until xml content equals certain value
  hosts: 127.0.0.1
  connection: local
  become_user: root
  become: yes
  tasks:
    - name: Check job status
      uri:
          url: "https://httpbin.org/anything"
          method: GET
          timeout: 10
          validate_certs: no
          headers:
            content: "<envelope><body><request><status>2</status></request></body></envelope>"
      register: get_search_job_status_response
      until: get_search_job_status_response.json.headers.Content|from_xml|json_query('envelope.body.request.status')|int == 2
      retries: 2
      delay: 2
...