Creating symbolic links in Windows with mklink always returns changed

I’m using this to create a symbolic link to a directory, on Windows:

  • name: Find OpenJDK directory
    ansible.windows.win_find:
    paths: C:\Program Files\OpenJDK
    patterns: openjdk*
    file_type: directory
    recurse: no
    register: OpenJDK

  • name: Create link to Java
    win_command: cmd.exe /k mklink jdk “{{ OpenJDK.files[0].path }}”
    args:
    chdir: “C:\Users\{{ username }}”
    vars:
    ansible_become_user: “{{ username }}”
    ansible_become_password: “{{ password }}”

win_command always returns “changed”, even if the symlink already existed and was pointing to the same directory.

How do I change this so that I get “ok” when there was no change?
OR
Does a default Ansible command already exist for mklink? I couldn’t find any on Ansible Galaxy.

The reason why it always reports a change is because win_command/win_shell always reports a change, it doesn’t know what command it is running and whether it is making a change or not.

You have 2 ways to solve this:

  • Add the creates arg to win_command that tells it to run the command only if the path does not exist
    • If it does exist then the command is not run and it doesn’t report a change
  • Use changed_when to control whether it reports a change based on the module return code
    • This can be done if cmd.exe returns a different rc if the link already existed or not
      In this case I think the first option is a better route for you.

Does a default Ansible command already exist for mklink? I couldn’t find any on Ansible Galaxy.

I’ve been wanting to add support for this to win_file for a while but there are quite a few hurdles and complexities that need to be overcome because this is really viable. In the end the lack of symlink use in Windows just never really demanded this to be done compared to Linux. Maybe at some point in the future there will be but for now you need to use mklink or if you have PowerShell 5.1 you can use New-Item with win_shell.

Thanks

Jordan