将变量写入Ansible中的文件


101

我正在通过URI模块提取JSON,并希望将接收到的内容写到文件中。我能够获取内容并将其输出到调试器,因此我知道已经接收到内容,但是我不知道编写文件的最佳实践。

Answers:


200

您可以使用copy带有content参数的模块:

- copy: content="{{ your_json_feed }}" dest=/path/to/destination/file

此处的文档:复制模块


5
content =“ {{your_json_feed}}”处理空格和换行符。引号很重要。
m.kocikowski

@RamondelaFuente如果我想向文件添加多个vars内容,我需要多次使用“复制”模块,或者还有其他方法吗?
KishoreReddy

1
@KishoreReddy我想您可以使用jinja2语法附加变量。类似于“ {{变量〜another_variable}}”。不太漂亮,但是如果事情变得更复杂,则可以使用该template:模块,并在运行时注册变量。
拉蒙·德拉·富恩特

当您要生成形式为sha256的sum256文件shahash /path/to/file(注意之间有2个空格),然后从命令行(通过sha256sum -c shafile)验证通过Ansible生成的内容时,这样做会更好。
Daniel AndreiMincă17年

11

除非编写的文件非常小,否则可能应该使用模板

例:

- name: copy upstart script
  template: 
    src: myCompany-service.conf.j2 
    dest: "/etc/init/myCompany-service.conf"

2
尽管拉蒙的答案恰好解决了所要提出的问题,但总体而言,这是最好的方法。例如,如果您有一本在云中创建VM的剧本,并且想为另一本剧本生成主机清单,那么就可以使用模板。
Luis Artola

您能解释一下为什么这样更好吗?
漩涡

@Vorticity比什么更好?
Janus Troelsen

@JanusTroelsen抱歉,您能解释一下为什么在编写大文件时这比公认的答案更好吗?
漩涡

1
@Vorticity,因为当您将文件嵌入另一个文件时,它变得笨拙。您需要转义,语法高亮将不起作用。模板机制使您可以在中间插入内容。
Janus Troelsen

9

根据拉蒙的回答,我遇到了一个错误。我尝试在JSON中写空格的问题是通过将剧本中的任务更改为以下形式来解决的:

- copy:
    content: "{{ your_json_feed }}"
    dest: "/path/to/destination/file"

到目前为止,我不确定为什么需要这样做。我最好的猜测是,它与如何在Ansible中替换变量并解析结果文件有关。


0

现在,我们可以使用dest选项直接指定目标文件。在以下示例中,输出json存储在/tmp/repo_version_file

- name: Get repository file repo_version model to set ambari_managed_repositories=false
  uri:
    url: 'http://<server IP>:8080/api/v1/stacks/HDP/versions/3.1/repository_versions/1?fields=operating_systems/*'
    method: GET
    force_basic_auth: yes
    user: xxxxx
    password: xxxxx
    headers:
      "X-Requested-By": "ambari"
      "Content-type": "Application/json"
    status_code: 200
    dest: /tmp/repo_version_file
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.