我正在尝试将秘密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)]
答案 0 :(得分: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会执行以下操作:
ASD='DEF'
行。PROGRAM='PROG'
行。PASSWORD='MAGNUS123'
行。TEMP='TEST'
行。=
的行(实际上它恰好是最后一行)。这就是你得到的结果:三行和一行。
您也可以使用debug
模块运行相同的结论,以显示传递给"{{ item.split('=')[0] }}\\s*="
参数的{{ item }}
和lineinfile
的值
echo
有-n
个参数(" 不要打印尾随的换行符"),但由于我目前理解的原因,它不会更改结果(请与hexdump
核对)。
如果您将echo
替换为printf
,则悬空0x0a
不存在,您会得到预期结果(请与hexdump
核对)。
所有这些,除了是一个不错的难题之外,还有另一个论点反对在Ansible中使用linefile
模块。
使用copy
(您可以使用Ansible Vault保护整个文件 - 请参阅decrypt
参数)或template
(您可以使用公共模板并将变量值存储在Vault中 - 受保护的形式)。定义所需的状态,不要依赖当前状态。周期。