可以 "sed: can't read file: No such file or directory"
ansible "sed: can't read file: No such file or directory"
我有一个应该执行脚本的 Ansible 剧本。此脚本应将代码行添加到文件中。请注意,尽管 ansible-playbook 的所有其他步骤都有效,但 playbook 比这个角色更大。当直接在人偶服务器上执行时,该脚本也能正常工作。我怀疑这是一个权限问题,虽然我不确定如何解决这个问题。
注意:ansible 剧本正在作为 ansible 用户执行。添加行的脚本和文件归 usr ansible 和 grp ansible 所有。权利是:0755。
要更改的文件也与脚本位于同一位置。
脚本名称:
createlines.sh
添加行的文件:
testfile.py
主机:
puppet
ansible 命令:
ansible-playbook deployment-test.yml --ask-become-pass
剧本:
---
- name: add lines in file
hosts: Puppet
become: yes
become_method: sudo
become_user: root
vars_files:
- vars/gpv-test.yml
roles:
- run-script
roles/run-script:
---
- name: Execute the createlines script
command: sh /var/opt/alu/deploy/hieradata/createlines.sh
错误信息(非常大且不断重复):
错误消息的开头:
fatal: [puppet]: FAILED! => {"changed": true, "cmd": ["sh", "/var/opt/alu/deploy/hieradata/createlines.sh"], "delta": "0:00:00.467213", "end": "2018-12-10 15:33:25.429726", "msg": "non-zero return code", "rc": 2, "start": "2018-12-10 15:33:24.962513", "stderr": "sed: can't read testfile.py: No such file or directory\nsed: can't read testfile.py: No such file or directory\nsed: can't read testfile.py: No such file or directory\nsed: can't read testfile.py........
.....can't read gen_prod_trm_test_yaml.py: No such file or directory", "stderr_lines": ["sed: can't read testfile.py: No such file or directory", "sed: can't read testfile.py: No such file or directory", "sed: can't read testfile.py: No such file or directory", "sed: can't read testfile.py: No such file or directory",........
错误消息结束:
........"sed: can't read testfile.py: No such file or directory", "sed: can't read testfile.py: No such file or directory"], "stdout": "", "stdout_lines": []}
有人看出哪里出了问题吗?
编辑:
createlines.sh:
#! /bin/bash
today=`date +%Y-%m-%d`
group_2=(/tmp/${today}/group-2/*)
group_3=(/tmp/${today}/group-3/*)
group_4=(/tmp/${today}/group-4/*)
group_5=(/tmp/${today}/group-5/*)
file="testfile.py"
#filessha1="../../../testfolder/testfolder/group-2/"
#sha1keyy=`sha1sum "${filesha1}"`
#echo "${sha1key}"
#echo "$today"
######GROUP-2
for i in ${group_2[@]}; do
#echo $i
#echo ${i##*/}
sed -i "/trm_data_file/a \ ensure: present" "$file"
sed -i "/trm_data_file/a \ dest_folder: group-2" "$file"
sed -i "/trm_data_file/a \ sha1: `(cd /tmp/$today/group-2/; sha1sum ${i##*/} | awk '{ print }')`" "$file"
sed -i "/trm_data_file/a \ url: filestore://testfolder/testfolder/${today}/group-2/${i##*/}" "$file"
sed -i "/trm_data_file/a - file:" "$file"
done
######GROUP-3
for i in ${group_3[@]}; do
#echo $i
#echo ${i##*/}
sed -i "/trm_data_file/a \ ensure: present" "$file"
sed -i "/trm_data_file/a \ dest_folder: group-3" "$file"
sed -i "/trm_data_file/a \ sha1: `(cd /tmp/$today/group-3/; sha1sum ${i##*/} | awk '{ print }')`" "$file"
sed -i "/trm_data_file/a \ url: filestore://testfolder/testfoldedf/${today}/group-3/${i##*/}" "$file"
sed -i "/trm_data_file/a - file:" "$file"
done
######GROUP-4
for i in ${group_4[@]}; do
#echo $i
#echo ${i##*/}
sed -i "/trm_data_file/a \ ensure: present" "$file"
sed -i "/trm_data_file/a \ dest_folder: group-4" "$file"
sed -i "/trm_data_file/a \ sha1: `(cd /tmp/$today/group-4/; sha1sum ${i##*/} | awk '{ print }')`" "$file"
sed -i "/trm_data_file/a \ url: filestore://testfolder/testfolder/${today}/group-4/${i##*/}" "$file"
sed -i "/trm_data_file/a - file:" "$file"
done
######GROUP-5
for i in ${group_5[@]}; do
#echo $i
#echo ${i##*/}
sed -i "/trm_data_file/a \ ensure: present" "$file"
sed -i "/trm_data_file/a \ dest_folder: group-5" "$file"
sed -i "/trm_data_file/a \ sha1: `(cd /tmp/$today/group-5/; sha1sum ${i##*/} | awk '{ print }')`" "$file"
sed -i "/trm_data_file/a \ url: filestore://testfolder/testfolder/${today}/group-5/${i##*/}" "$file"
sed -i "/trm_data_file/a - file:" "$file"
done
testfile.py:
"some Python code(not relevant)"
trm_data_files:
"Place where lines get inserted"
"some Python code(not relevant)"
createlines.sh 似乎存在于目标主机上,而不是 py 文件。
您应该确保 py 文件已复制并存在于目标主机上。
请确保您在 shell 脚本中使用 testfile.py
脚本的完整路径。当 Ansible 运行s shell 命令时,它从不同的位置执行此操作,例如/tmp
目录。使用 Python 脚本的完整绝对路径将确保在这种情况下可以找到它。
您可以 运行 Ansible 使用 -vvv
参数来查看脚本在 Ansible 执行时的位置。
我有一个应该执行脚本的 Ansible 剧本。此脚本应将代码行添加到文件中。请注意,尽管 ansible-playbook 的所有其他步骤都有效,但 playbook 比这个角色更大。当直接在人偶服务器上执行时,该脚本也能正常工作。我怀疑这是一个权限问题,虽然我不确定如何解决这个问题。
注意:ansible 剧本正在作为 ansible 用户执行。添加行的脚本和文件归 usr ansible 和 grp ansible 所有。权利是:0755。 要更改的文件也与脚本位于同一位置。
脚本名称:
createlines.sh
添加行的文件:
testfile.py
主机:
puppet
ansible 命令:
ansible-playbook deployment-test.yml --ask-become-pass
剧本:
---
- name: add lines in file
hosts: Puppet
become: yes
become_method: sudo
become_user: root
vars_files:
- vars/gpv-test.yml
roles:
- run-script
roles/run-script:
---
- name: Execute the createlines script
command: sh /var/opt/alu/deploy/hieradata/createlines.sh
错误信息(非常大且不断重复):
错误消息的开头:
fatal: [puppet]: FAILED! => {"changed": true, "cmd": ["sh", "/var/opt/alu/deploy/hieradata/createlines.sh"], "delta": "0:00:00.467213", "end": "2018-12-10 15:33:25.429726", "msg": "non-zero return code", "rc": 2, "start": "2018-12-10 15:33:24.962513", "stderr": "sed: can't read testfile.py: No such file or directory\nsed: can't read testfile.py: No such file or directory\nsed: can't read testfile.py: No such file or directory\nsed: can't read testfile.py........
.....can't read gen_prod_trm_test_yaml.py: No such file or directory", "stderr_lines": ["sed: can't read testfile.py: No such file or directory", "sed: can't read testfile.py: No such file or directory", "sed: can't read testfile.py: No such file or directory", "sed: can't read testfile.py: No such file or directory",........
错误消息结束:
........"sed: can't read testfile.py: No such file or directory", "sed: can't read testfile.py: No such file or directory"], "stdout": "", "stdout_lines": []}
有人看出哪里出了问题吗?
编辑: createlines.sh:
#! /bin/bash
today=`date +%Y-%m-%d`
group_2=(/tmp/${today}/group-2/*)
group_3=(/tmp/${today}/group-3/*)
group_4=(/tmp/${today}/group-4/*)
group_5=(/tmp/${today}/group-5/*)
file="testfile.py"
#filessha1="../../../testfolder/testfolder/group-2/"
#sha1keyy=`sha1sum "${filesha1}"`
#echo "${sha1key}"
#echo "$today"
######GROUP-2
for i in ${group_2[@]}; do
#echo $i
#echo ${i##*/}
sed -i "/trm_data_file/a \ ensure: present" "$file"
sed -i "/trm_data_file/a \ dest_folder: group-2" "$file"
sed -i "/trm_data_file/a \ sha1: `(cd /tmp/$today/group-2/; sha1sum ${i##*/} | awk '{ print }')`" "$file"
sed -i "/trm_data_file/a \ url: filestore://testfolder/testfolder/${today}/group-2/${i##*/}" "$file"
sed -i "/trm_data_file/a - file:" "$file"
done
######GROUP-3
for i in ${group_3[@]}; do
#echo $i
#echo ${i##*/}
sed -i "/trm_data_file/a \ ensure: present" "$file"
sed -i "/trm_data_file/a \ dest_folder: group-3" "$file"
sed -i "/trm_data_file/a \ sha1: `(cd /tmp/$today/group-3/; sha1sum ${i##*/} | awk '{ print }')`" "$file"
sed -i "/trm_data_file/a \ url: filestore://testfolder/testfoldedf/${today}/group-3/${i##*/}" "$file"
sed -i "/trm_data_file/a - file:" "$file"
done
######GROUP-4
for i in ${group_4[@]}; do
#echo $i
#echo ${i##*/}
sed -i "/trm_data_file/a \ ensure: present" "$file"
sed -i "/trm_data_file/a \ dest_folder: group-4" "$file"
sed -i "/trm_data_file/a \ sha1: `(cd /tmp/$today/group-4/; sha1sum ${i##*/} | awk '{ print }')`" "$file"
sed -i "/trm_data_file/a \ url: filestore://testfolder/testfolder/${today}/group-4/${i##*/}" "$file"
sed -i "/trm_data_file/a - file:" "$file"
done
######GROUP-5
for i in ${group_5[@]}; do
#echo $i
#echo ${i##*/}
sed -i "/trm_data_file/a \ ensure: present" "$file"
sed -i "/trm_data_file/a \ dest_folder: group-5" "$file"
sed -i "/trm_data_file/a \ sha1: `(cd /tmp/$today/group-5/; sha1sum ${i##*/} | awk '{ print }')`" "$file"
sed -i "/trm_data_file/a \ url: filestore://testfolder/testfolder/${today}/group-5/${i##*/}" "$file"
sed -i "/trm_data_file/a - file:" "$file"
done
testfile.py:
"some Python code(not relevant)"
trm_data_files:
"Place where lines get inserted"
"some Python code(not relevant)"
createlines.sh 似乎存在于目标主机上,而不是 py 文件。
您应该确保 py 文件已复制并存在于目标主机上。
请确保您在 shell 脚本中使用 testfile.py
脚本的完整路径。当 Ansible 运行s shell 命令时,它从不同的位置执行此操作,例如/tmp
目录。使用 Python 脚本的完整绝对路径将确保在这种情况下可以找到它。
您可以 运行 Ansible 使用 -vvv
参数来查看脚本在 Ansible 执行时的位置。