postgresql Ansible:如何读取文件并将结果推送到模板

t30tvxxf  于 2023-02-08  发布在  PostgreSQL
关注(0)|答案(1)|浏览(105)

我的任务是从csv文件读取数据,将结果推到模板,并将这些模板复制到不同的服务器。但是,写入模板时出错。详细信息如下-
main.yml

- name: Print return information from the previous task
  vars:
    test_csv: "{{ lookup('file', '/u00/ansible/Playbooks/files/newrelic_test.csv', wantlist=True) }}"
  ansible.builtin.debug:
    var: test_csv

- name: copy template
  template:
    src: /u00/ansible/Playbooks/files/infra-config.yml_template
    dest: /u00/app/monitor/infra-config.yml
  with_items: test_csv
  notify: confirm copy done

- name: Start the New Relic Service
  ansible.builtin.systemd:
    name: infra.service
    state: started
  become: yes
  become_user: root

基础配置yml_模板-

custom_attributes:
    application : {{ item.Application }}
    env : {{ item.env }}
    datacenter : {{ item.Datacenter }}
log:
 file: /u00/app/monitor/infra.log

csv-应用程序、主机、环境、数据中心Microsoft、测试服务器1、测试、DC1 Apple、测试服务器2、测试、DC2
错误-
任务[配置更新:复制模板]*********************************************[0;31m任务执行期间出现异常。若要查看完整的追溯,请使用-vvv。错误为:可能错误。可能未定义变量:"Ansible. utils. unsafe_proxy. AnsibleUnsafeText对象"没有属性"数据库名称"[0m [0;31m失败:[测试服务器1](项目=测试_csv)=〉{"可靠循环变量":"项目"、"变更":假,"项目":"测试_csv","消息":"Ansible未定义变量:'ansible. utils. unsafe_proxy. AnsibleUnsafeText对象'没有属性'db_name'"}
预期读取csv文件并在不同服务器的模板中使用变量。

testserver1 -

> custom_attributes: application : Microsoft env : Test datacenter : DC1
> log: file: /u00/app/monitor/infra.log

testserver2 - 

> custom_attributes: application : Apple env : Test datacenter : DC1
> log: file: /u00/app/monitor/infra.log
cwtwac6a

cwtwac6a1#

在你的剧本中有几件事需要修正。首先,你在一个任务中定义了你的test_csv变量,其他任务不能访问它。你可以使用register来代替。但是,第一个任务返回一个列表,但是有一个像"test_csv": ["Application,Host,env,Datacenter\nMicrosoft,testserver1,TEST,DC1 \nApple,testserver2,TEST,DC2"]这样的字符串,它只会在test_csv列表中产生一个项目。
你也可以通过使用read_csv模块来实现这一点。下面我将演示如何实现:

注意我已经在copy template任务上添加了一个使用inventory_hostname的条件,因为您可能希望根据主机名来定位每一个csv行。您可以根据需要修改它。

Csv文件内容:

Application,Host,env,Datacenter
Microsoft,localhost,TEST,DC1 
Apple,testserver2,TEST,DC2

测试行动手册示例:

- name: Check status
  hosts: localhost
  gather_facts: no
  tasks:
    - name: read csv file and return a list
      read_csv:
        path: test.csv
      register: applications
    
    - name: Ouput applications from previous task
      debug:
        msg: "{{ item.Application }}"
      loop: "{{ applications.list }}"
        
    - name: copy template
      template:
        src: src.yml_template ##I would recommendr to use .j2 jinja template instead.
        dest: dest.yml
      loop: "{{ applications.list }}"
      when: inventory_hostname == item.Host

源代码.yml_模板内容:

custom_attributes:
    application : {{ item.Application }}
    env : {{ item.env }}
    datacenter : {{ item.Datacenter }}

log:
 file: /u00/app/monitor/infra.log

在目标yml中给出:

custom_attributes:
    application : Microsoft
    env : TEST
    datacenter : DC1 

log:
 file: /u00/app/monitor/infra.log

Cli输出:

PLAY [Check status] **********************************************************************************************************************************************************

TASK [read csv file and return a list] ***************************************************************************************************************************************
ok: [localhost]

TASK [Ouput applications from previous task] *********************************************************************************************************************************
ok: [localhost] => (item={'Application': 'Microsoft', 'Host': 'localhost', 'env': 'TEST', 'Datacenter': 'DC1 '}) => {
    "msg": "Microsoft"
}
ok: [localhost] => (item={'Application': 'Apple', 'Host': 'testserver2', 'env': 'TEST', 'Datacenter': 'DC2'}) => {
    "msg": "Apple"
}

TASK [copy template] *********************************************************************************************************************************************************
changed: [localhost] => (item={'Application': 'Microsoft', 'Host': 'localhost', 'env': 'TEST', 'Datacenter': 'DC1 '})
skipping: [localhost] => (item={'Application': 'Apple', 'Host': 'testserver2', 'env': 'TEST', 'Datacenter': 'DC2'})

相关问题