我必须检查/etc/中是否存在一个文件。如果文件存在,那么我必须跳过该任务。 这是我正在使用的代码:

- name: checking the file exists
  command: touch file.txt
  when: $(! -s /etc/file.txt)

当前回答

通常情况下,您可以使用stat模块来完成此操作。但是命令模块有创建选项,这使得这非常简单:

- name: touch file
  command: touch /etc/file.txt
  args:
    creates: /etc/file.txt

我猜你的触摸命令只是一个例子?最好的做法是不检查任何东西,让ansible用正确的模块完成它的工作。所以如果你想确保文件存在,你可以使用file模块:

- name: make sure file exists
  file:
    path: /etc/file.txt
    state: touch

其他回答

通常情况下,您可以使用stat模块来完成此操作。但是命令模块有创建选项,这使得这非常简单:

- name: touch file
  command: touch /etc/file.txt
  args:
    creates: /etc/file.txt

我猜你的触摸命令只是一个例子?最好的做法是不检查任何东西,让ansible用正确的模块完成它的工作。所以如果你想确保文件存在,你可以使用file模块:

- name: make sure file exists
  file:
    path: /etc/file.txt
    state: touch

关于相对路径的注释,以补充其他答案。

当把基础设施作为代码使用时,我通常使用接受相对路径的角色和任务,特别是对于在这些角色中定义的文件。

像playbook_dir和role_path这样的特殊变量对于创建测试存在性所需的绝对路径非常有用。

stat模块将执行此操作,并为文件获取许多其他信息。从示例文档中:

- stat: path=/path/to/something
  register: p

- debug: msg="Path exists and is a directory"
  when: p.stat.isdir is defined and p.stat.isdir

你可以使用Ansible的统计模块来注册文件,当模块来应用条件。

- name: Register file
      stat:
        path: "/tmp/test_file"
      register: file_path

- name: Create file if it doesn't exists
      file: 
        path: "/tmp/test_file"
        state: touch
      when: file_path.stat.exists == False

我使用这段代码,它可以很好地用于文件夹和文件。只要确保文件夹名称后没有尾随空格即可。如果文件夹存在,则file_exists。Stdout将为true否则它将只是一个空字符串"

- name: check filesystem existence
  shell: if [[ -d  "/folder_name" ]]; then echo "true";  fi
  register: file_exists
  
- name: debug data
  debug: 
    msg: "Folder exists"
  when: file_exists.stdout == "true"