使用变量创建具有ansible的符号链接

时间:2018-11-14 15:15:14

标签: ansible symlink

我正在编写一本剧本来创建nodejs,npm和gulp的符号链接,因为我需要使用特定版本并安装所有版本,我只是将文件夹解压缩到/ opt /,所有这些都将保留。 / p>

包含用于创建链接的项目的任务是:

- name: Create NPM symlink
  file:
    src: '{{ item.src_dir }}/{{ item.src_name }}'
    dest: '{{ item.dest_dir }}/{{ item.dest_name }}'
    owner: "{{ ansible_ssh_user }}"
    group: "{{ ansible_ssh_user }}"
    state: link
  with_items:
    - { src_dir: "{{ npm_real_dir }}", src_name: "{{ npm_real_name }}" }
    - { dest_dir: "{{ nodenpm_link_dir }}", dest_name: "{{ npm_link_name }}" }

在“ zone”项中使用的所有变量都在主机文件中声明为: npm_real_dir=/opt/nodejs/node-v6.11.2-linux-x64/lib/node_modules/npm/bin

npm_real_name=npm-cli.js

nodenpm_link_dir=/opt/nodejs/node-v6.11.2-linux-x64/bin

npm_link_name=npm

ansible_ssh_user=vagrant

我得到了错误:

FAILED! => {"msg": "The task includes an option with an undefined variable. The error was: 'dict object' has no attribute 'dest_dir'

我不理解,因为任务中使用的所有变量均已声明且正确。我做了类似的任务,没有物品:

- name: Create symbolic link for npm
  file:
    src: '{{ npm_real_dir }}/{{ npm_real_name }}'
    path: '{{ nodenpm_link_dir }}/{{ npm_link_name }}'
    owner: "{{ ansible_ssh_user }}"
    group: "{{ ansible_ssh_user }}"
    state: link

其工作原理与结构相同,只是没有任何项目。

这时我只想知道它是否是已知的错误,或者在使用项目创建链接时是否存在任何问题,或者我是否犯了一个愚蠢的错误并获得了关于它的知识

预先感谢

1 个答案:

答案 0 :(得分:1)

问题是您要将两个不同的对象传递给with_items属性。第一个对象具有两个属性(src_dirsrc_name),而第二个对象具有两个不同的属性(dest_dirdest_name)。

您似乎想将它们组合成一个对象,如下所示:

- name: Create NPM symlink
  file:
    src: '{{ item.src_dir }}/{{ item.src_name }}'
    dest: '{{ item.dest_dir }}/{{ item.dest_name }}'
    owner: "{{ ansible_ssh_user }}"
    group: "{{ ansible_ssh_user }}"
    state: link
  with_items:
    - { src_dir: "{{ npm_real_dir }}", src_name: "{{ npm_real_name }}", dest_dir: "{{ nodenpm_link_dir }}", dest_name: "{{ npm_link_name }}" }

这应该可以更好地工作并消除错误,但是在这种情况下,您实际上并不需要with_items,因为它只是您要处理的一项。您可以为其他工具添加更多对象,例如gulp以相同的方式,例如像这样:

- name: Create symlinks
  file:
    src: '{{ item.src_dir }}/{{ item.src_name }}'
    dest: '{{ item.dest_dir }}/{{ item.dest_name }}'
    owner: "{{ ansible_ssh_user }}"
    group: "{{ ansible_ssh_user }}"
    state: link
  with_items:
    - { src_dir: "{{ npm_real_dir }}", src_name: "{{ npm_real_name }}", dest_dir: "{{ nodenpm_link_dir }}", dest_name: "{{ npm_link_name }}" }
    - { src_dir: "{{ gulp_real_dir }}", src_name: "{{ gulp_real_name }}", dest_dir: "{{ gulp_link_dir }}", dest_name: "{{ gulp_link_name }}" }