如何使用ansible重命名/移动远程Windows主机上的文件?

时间:2017-12-12 13:42:32

标签: ansible

似乎有几种解决方案都可以在多个步骤中起作用,例如 *复制和删除 *使用原生的wincommand或pwoershell

但是不是只有重命名为win_module吗?或复制后的选项可以在复制后删除源?

2 个答案:

答案 0 :(得分:4)

我找到了一些问题的答案:

首先要指出这是针对远程Windows主机的。对于Unix系统,我们在stackoverflow中已经有了很多答案,对于windows来说则不然。

没有win_rename模块,也没有带重命名选项的win_file。您无法使用win_copy,因为该文件已在远程系统上。所以最简单的方法是使用本地windows命令。

- name: rename the {{ source_name }} to  {{ target_name }}
  win_command: "cmd.exe /c rename {{ destination_folder }}\\{{ source_name }} {{ target_name }}"

答案 1 :(得分:0)

MBushveld,我看到你的windows“rename”命令在这种情况下可以很好地完成。但总的来说,Powershell命令涵盖了更广泛的情况,并且针对特殊情况提供了更多的开关/标志选项。例如,查看Powershell“Rename-Item”命令here。因此,如果您的Windows命令在下次出现时很短,您可以编写一个简短的Powershell脚本,并使用您需要的任何命令行参数从Ansible中调用它。在这篇文章的底部是我写的powershell脚本,以验证2个文本文件的内容是完全相同的。我使用Ansible中的“script:”命令来调用带有参数的脚本,如下所示。

- name: verify the file contents match
  script: filesAreSame.ps1  "C:/Temp/" "file1.txt" "file2.txt" 
  register: result
- set_fact: filesMatch="{{result.stdout_lines.4 | bool}}"

Ansible会将脚本移动到远程主机,执行它然后将其删除。如果需要,您可以使用Ansible中的“register:”命令来捕获脚本返回的任何值。以下是“filesAreSame.ps1”Powershell脚本的内容。

# verifys that the specified files contain the same text
param(
    [string]$uncPath,
    [string]$uncFile1,
    [string]$uncFile2
)
$uncFullFileName1 = $uncPath + $uncFile1
$uncFullFileName2 = $uncPath + $uncFile2
$filetext1=[System.IO.File]::ReadAllText($uncFullFileName1).TrimStart().TrimEnd()
$filetext2=[System.IO.File]::ReadAllText($uncFullFileName2).TrimStart().TrimEnd()
# verify first file is not empty
if ($filetext1 -eq "")
{
    return "ERROR: Source file is empty"
}
# case sensitive comparison
if ($filetext1 -cne $filetext2)
{
    return "ERROR: Files are not the same"
}
return $TRUE