【问题标题】:Ansible: Handling temporary file idempotently and securelyAnsible:幂等且安全地处理临时文件
【发布时间】:2020-12-02 10:18:15
【问题描述】:

在 Ansible(如果重要的话,RHEL 8)中,我需要从包含敏感内容的模板创建一个临时文件。完成其他一些任务后,应该将其删除。临时文件是将作为命令运行的安装程序的应答文件。安装程序需要用户名和密码。

我不知道是否有办法在 Ansible 中轻松做到这一点。

我正在寻找的蛮力实现看起来类似于:

- name: Create answer file
  template:
    src: answerfile.xml.j2
    dest: /somewhere/answer.xml
    owner: root
    group: root
    mode:  '0600'

- name: Install
  command: /somewhere/myinstaller --answerfile /somewhere/answer.xml
  creates: /somewhereelse/installedprogram

- name: Delete answerfile
  file:
    path: /somewhere/answer.xml
    state: absent

当然,此代码不是幂等的 - 每次运行都会创建和销毁答案文件。

有没有更好的方法来做到这一点?

【问题讨论】:

  • 也许 Ansible 保险库是这里的一个选项?
  • @RamanSailopal 谢谢你的建议! Ansible Vault 做了一些不同的事情。它提供了一种安全的方式来存储变量的值。所以保险库可能是密码的来源。但是对于需要将文件存储在目标主机上的情况,它不会做任何事情。

标签: ansible temporary-files


【解决方案1】:

测试文件是否存在。如果存在则跳过该块。例如

- stat:
    path: /somewhereelse/installedprogram
  register: st

- block:

    - name: Create answer file
      template:
        src: answerfile.xml.j2
        dest: /somewhere/answer.xml
        owner: root
        group: root
        mode:  '0600'

    - name: Install
      command: /somewhere/myinstaller --answerfile /somewhere/answer.xml

    - name: Delete answerfile
      file:
        path: /somewhere/answer.xml
        state: absent

  when: not st.stat.exists

(未测试)


将“删除答案文件”任务从块中取出将使代码更安全。它将始终确保凭据未存储在文件中。如果文件不存在,任务不会失败。

- stat:
    path: /somewhereelse/installedprogram
  register: st

- block:

    - name: Create answer file
      template:
        src: answerfile.xml.j2
        dest: /somewhere/answer.xml
        owner: root
        group: root
        mode:  '0600'

    - name: Install
      command: /somewhere/myinstaller --answerfile /somewhere/answer.xml

  when: not st.stat.exists

- name: Delete answerfile
  file:
    path: /somewhere/answer.xml
    state: absent

(未测试)

【讨论】:

  • 啊,不错的解决方案。我不知道 block(我是 Ansible 的新手)。
  • 太好了,谢谢。并感谢您对删除答案文件的额外评论!
  • 需要注意的一个副作用:以这种方式使用块时,块内的任务不会显示为“未更改”,但在运行中根本不会出现。在大多数情况下,这可能没问题。另一种方法是将 when... 条件单独附加到每个任务。在这种情况下,每个任务都会显示为已跳过。
【解决方案2】:

我认为此解决方案可能代表您的解决方案轻微改进。

使用此解决方案,如果您的目标程序已安装,则将跳过创建和删除应答文件的任务(而不是始终运行并报告已更改)。

我仍然不喜欢这个解决方案,因为我不太喜欢跳过。

# Try call the installedprogram. --version is arbitrary here.
# --help, or a simple `which installedprogram` could be alternatives.
- name: Try run installedprogram
  command: '/somewhereelse/installedprogram --version'
  register: installedprogram_exists
  ignore_errors: yes
  changed_when: False

# Only create answer file if installedprogram is not installed
- name: Create answer file
  template:
    src: answerfile.xml.j2
    dest: /somewhere/answer.xml
    owner: root
    group: root
    mode:  '0600'
  when: installedprogram_exists.rc != 0

- name: Install
  command: /somewhere/myinstaller --answerfile /somewhere/answer.xml
  creates: /somewhereelse/installedprogram

# Only delete answer file if installedprogram is not installed
- name: Delete answerfile
  file:
    path: /somewhere/answer.xml
    state: absent
  when: installedprogram_exists.rc != 0

【讨论】:

    猜你喜欢
    • 2013-05-02
    • 2019-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-06
    • 2018-01-08
    • 2010-12-03
    • 2020-01-03
    相关资源
    最近更新 更多