Ansible lineinfile 没有将最后一行复制到服务器
Ansible lineinfile not copying last line to server
我正在尝试将秘密 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)]
您正在做一些完全不必要的事情(跳到底部),但让我们试一试...
What am I doing wrong to cause this?
如果你运行以下:
- 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'
行。
- 用空行替换
=
的行(实际上它恰好是最后一行)。
这就是您得到的结果:三行和一行空行。
你也可以得出同样的结论,只需运行ning使用debug
模块来显示"{{ item.split('=')[0] }}\s*="
和{{ item }}
的值,你传递给 lineinfile
个参数。
echo
有 -n
参数(“不打印结尾的换行符”),但出于我目前理解之外的原因,它确实不改变结果(检查hexdump
)。
但是,如果您将 echo
替换为 printf
- 悬挂的 0x0a
不存在并且您会得到预期的结果(检查 hexdump
)。
所有这一切,除了是一个很好的难题之外,还是另一个反对在 Ansible 中使用 linefile
模块 的论据。
使用 copy
(you can protect the whole file with Ansible Vault - see decrypt
argument) or template
(您可以使用 public 模板并将变量值存储在受 Vault 保护的表单中)。定义所需的状态,不依赖于当前状态。期间.
我正在尝试将秘密 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)]
您正在做一些完全不必要的事情(跳到底部),但让我们试一试...
What am I doing wrong to cause this?
如果你运行以下:
- 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'
行。 - 用空行替换
=
的行(实际上它恰好是最后一行)。
这就是您得到的结果:三行和一行空行。
你也可以得出同样的结论,只需运行ning使用debug
模块来显示"{{ item.split('=')[0] }}\s*="
和{{ item }}
的值,你传递给 lineinfile
个参数。
echo
有 -n
参数(“不打印结尾的换行符”),但出于我目前理解之外的原因,它确实不改变结果(检查hexdump
)。
但是,如果您将 echo
替换为 printf
- 悬挂的 0x0a
不存在并且您会得到预期的结果(检查 hexdump
)。
所有这一切,除了是一个很好的难题之外,还是另一个反对在 Ansible 中使用 linefile
模块 的论据。
使用 copy
(you can protect the whole file with Ansible Vault - see decrypt
argument) or template
(您可以使用 public 模板并将变量值存储在受 Vault 保护的表单中)。定义所需的状态,不依赖于当前状态。期间.