1

我正在尝试将秘密 Python 设置文件从设置服务器复制到生产环境。由于设置包含密码,我正在使用 Ansible Vault。

我的剧本如下所示:

---
- hosts: production
  tasks:
  - include_vars: settings.yml
  - name: Set properties
    lineinfile:
      dest: ~/temp/deploy
      regexp: "{{ item.split('=')[0] }}\\s*="
      line: "{{ item }}"
    with_lines: echo "{{ config }}"

我的 settings.yml 看起来像这样:

config:  |
  ASD='DEF'
  PROGRAM='PROG'
  PASSWORD='MAGNUS123'
  TEMP='TEST'

但是,当我运行剧本时,我得到了文件:

ASD='DEF'
PROGRAM='PROG'
PASSWORD='MAGNUS123'

即使 Ansible 声称最后一行也被复制:

changed: [ssh.pythonanywhere.com] => (item=ASD='DEF' )
changed: [ssh.pythonanywhere.com] => (item=PROGRAM='PROG')
changed: [ssh.pythonanywhere.com] => (item=PASSWORD='MAGNUS123')
changed: [ssh.pythonanywhere.com] => (item=TEMP='TEST')
changed: [ssh.pythonanywhere.com] => (item=)

我做错了什么导致这个?

Ansible 版本:

ansible --version
ansible 2.4.1.0
  config file = None
  ansible python module location = /usr/local/lib/python3.6/site-packages/ansible
  executable location = /usr/local/bin/ansible
  python version = 3.6.2 (default, Jul 17 2017, 16:44:45) [GCC 4.2.1 Compatible Apple LLVM 8.1.0 (clang-802.0.42)]
4

1 回答 1

1

您正在做一些完全不必要的事情(跳到底部),但让我们试一试......

我做错了什么导致这个?

如果您运行以下命令:

- shell: echo "{{ config }}" | hexdump
  register: echo

- debug:
    var: echo.stdout

您会看到输出以以下结尾:

54 45 4d 50 3d 27 54 45 53 54 27 0a 0a

后跟两个TEMP='TEST'换行符。当在with_lines循环中使用时,这将导致两次迭代——最后一次将空值传递给item.

现在,想想当item为空时你的论点会发生什么:

regexp变成\\s*=并且line是空的。

换句话说,您指示 Ansible 将包含的某些行替换=为空行。

如果起点是一个空文件,Ansible 会执行以下操作:

  1. 添加ASD='DEF'行。
  2. 添加PROGRAM='PROG'行。
  3. 添加PASSWORD='MAGNUS123'行。
  4. 添加TEMP='TEST'行。
  5. =用空行替换一行(实际上它恰好是最后一行)。

这就是你得到的结果:三行和一个空行。


您也可以简单地使用debug模块运行以显示您传递给参数的值"{{ item.split('=')[0] }}\\s*="和传递给参数的值,从而得出相同的结论。{{ item }}lineinfile


echo-n论点(“不要打印尾随换行符”),但由于超出我目前理解的原因,它不会改变结果(检查hexdump)。

但是,如果您替换echoprintf-- 悬空0x0a不存在并且您会得到预期的结果(检查hexdump)。


所有这一切,除了是一个很好的难题之外,也是反对在 Ansible中使用linefile模块的另一个论据。

使用copy(您可以使用 Ansible Vault 保护整个文件 - 请参阅decrypt参数)或template(您可以拥有一个公共模板并将变量值存储在受 Vault 保护的表单中)。定义期望的状态,不要依赖于当前状态。时期。

于 2017-11-16T10:34:30.620 回答