【问题标题】:Write variable to a file in Ansible将变量写入 Ansible 中的文件
【发布时间】:2021-03-30 01:23:57
【问题描述】:

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

【问题讨论】:

    标签: file ansible-playbook


    【解决方案1】:

    来自tmoschou的重要评论:

    As of Ansible 2.10, The documentation for ansible.builtin.copy says:
    If you need variable interpolation in copied files, use the
    ansible.builtin.template module. Using a variable in the content
    field will result in unpredictable output.
    

    有关更多详细信息,请参阅 thisexplanation


    原答案:

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

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

    这里的文档:copy module

    【讨论】:

    • content="{{ your_json_feed }}" 处理空格和换行符。引号很重要。
    • @RamondelaFuente 如果我想在文件中添加多个 vars 内容,我需要多次使用“copy”模块还是有其他方法?
    • @KishoreReddy 我想您可以使用 jinja2 语法来附加变量。类似“{{变量~另一个变量}}”的东西。不漂亮,但如果事情变得更复杂,你可以使用template: 模块并用运行时注册的变量填充它。
    • 当您想要生成 shahash /path/to/file 形式的 sha256 总和文件时效果更好(注意之间有 2 个空格),然后从命令行(通过 sha256sum -c shafile )验证您通过 Ansible 生成的内容.
    • 从 Ansible 2.10 开始,ansible.builtin.copy 的文档说:如果您需要在复制的文件中进行变量插值,请使用 ansible.builtin.template 模块。在content 字段中使用变量将导致不可预知的输出。 有关更多详细信息,请参阅github.com/ansible/ansible/issues/50580github.com/ansible/ansible/issues/34595#issuecomment-356091161 的解释
    【解决方案2】:

    根据 Ramon 的回答,我遇到了一个错误。我尝试编写的 JSON 中的空格问题通过将 playbook 中的任务更改为如下所示来解决:

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

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

    【讨论】:

      【解决方案3】:

      除非您要编写非常小的文件,否则您可能应该使用templates

      例子:

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

      【讨论】:

      • 虽然 Ramon 的回答准确地解决了所问的问题,但这个答案通常是最好的方法。例如,如果您有一个在云中创建虚拟机的 playbook,并且您想为另一个 playbook 生成主机清单,那么模板就是您要走的路。
      • 你能解释一下为什么这样更好吗?
      • @Vorticity 比什么更好?
      • @JanusTroelsen 抱歉,您能解释一下为什么在编写大文件时这比公认的答案更好吗?
      • @Vorticity 因为当您将一个文件嵌入到另一个文件中时它会变得笨拙。你需要转义和语法高亮不起作用。如果需要,模板机制可以在中间插入东西。
      【解决方案4】:

      我们现在可以使用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
      

      【讨论】:

        猜你喜欢
        • 2015-05-11
        • 2020-05-06
        • 2014-04-26
        • 2020-10-25
        • 1970-01-01
        • 1970-01-01
        • 2020-11-04
        • 2015-06-06
        • 2013-10-03
        相关资源
        最近更新 更多