如何使用Ansib格式化SQL查询

2024-05-20 11:55:30 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试使用Ansible格式化SQL查询,以便以常规方式写入数据库中的表。我现在的代码是:

  1 ---
  2 - hosts: all
  3   vars:
  4     inv_list: []
  5     compliance_info:
  6       host: "{{ ansible_host }}"
  7       passwd_change: "{{ root_pass_chg }}"
  8       timestamp: "{{ ansible_date_time.date }}"
  9   tasks:
 10     - name: get password change date
 11       command: sudo chage -l root
 12       register: chage_output
 13
 14     - name: pattern
 15       set_fact:
 16         regx: '\w\w\w\s\d\d\,\s\d\d\d\d'
 17
 18     - name : regex
 19       set_fact:
 20         root_pass_chg: "{{ chage_output.stdout | regex_search(regx, multiline=true, ignorecase=true) }}"
 21
 22     - name: build dict
 23       set_fact:
 24         client_compliance: "{{ client_compliance | default({}) | combine({ inventory_hostname : compliance_info }, recursive=True ) }}"
 25
 26     - name: build inventory list
 27       set_fact:
 28         inv_list: "{{ inv_list + ansible_play_batch }}"
 29 #this relies on whether or not client01 has build inv_list. if connection fails then this task fails
 30 - hosts: localhost
 31   vars:
 32     headers: [ host, passwd_change, timestamp ]
 33     outputs: "{{ headers | map('extract', compliance_dict['client01']) | list }}"
 34     results: "{{ outputs | wrap | join(', ') }}"
 35   tasks:
 36     - name: build dict
 37       set_fact:
 38         compliance_dict: "{{ compliance_dict | default({}) | combine(hostvars[item].client_compliance) }}"
 39       with_items:
 40         - "{{ hostvars['client01'].inv_list }}"
 41
 42     - debug:
 43         var: outputs
 44
 45     - debug:
 46         var: results
 47
 48     - name: write stuff to mysql
 49       command: sudo mysql --user=user --password=password compliance --host=localhost --execute="insert into root_pass({{ headers|join(', ') }}) values( {{ results }} ) on duplicate key update {{ headers|join(', ') }} = {{ results }}    "
 50       with_items:
 51         - "{{ hostvars['client01'].inv_list }}"`

结果的输出是

ok: [localhost] => {
"\"testserver.net\", \"some date, 2019\", \"2019-xx-xx\"": "('testserver.net', 'some date, 2019', '2019-xx-xx')"}

我在输出上使用的wrap过滤器来自我使用的自定义插件,定义为

  1 def wrap(list):
  2         return [ '"' + x + '"' for x in list ]
  3
  4 class FilterModule(object):
  5         def filters(self):
  6                 return {
  7                         'wrap': wrap
  8                 }

在表中插入的值周围加上单引号。我是python新手,所以我不知道如何编写自定义插件,这样它就不会返回键:值对而是一串单引号的值


Tags: namebuildhostdaterootresultsdictlist