我的任务是从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
1条答案
按热度按时间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文件内容:
测试行动手册示例:
源代码.yml_模板内容:
在目标yml中给出:
Cli输出: