如何使用 ansible 排除文件系统

Posted

技术标签:

【中文标题】如何使用 ansible 排除文件系统【英文标题】:How to exclude filesystems with ansible 【发布时间】:2021-12-14 20:19:04 【问题描述】:

我正在编写一本关于更改 Linux 服务器上的文件和文件夹权限的剧本。 直到知道它正在工作并且看起来像这样:

-
  name: Playbook to change file and directory permissions
  hosts: all
  become: yes
  vars:
    DIR: ' target_dir '
    FILE: ' target_file '
    PERMISSIONS: ' number '
    OWNER: ' target_owner '
    GROUP: ' target_group '

  tasks:

    - name: Checking if the directory exists
      stat:
        path: ' DIR '
      register: dir_status

    - name: Checking if the file exists
      stat:
        path: ' FILE '
      register: file_status

    - name: Report if directory exists
      debug:
        msg: "Directory  DIR  is present on the server"
      when: dir_status.stat.exists and dir_status.stat.isdir

    - name: Report if file exists
      debug:
        msg: "File  FILE  is present on the server"
      when: file_status.stat.exists

    - name: Applying new permissions
      file:
          path: ' DIR / FILE '
          state: file
          mode: '0 PERMISSIONS '
          owner: ' OWNER '
          group: ' GROUP '

但我需要的是,如果要在 rundeck 中执行 playbook 的用户想要更改 (/boot /var /etc /tmp /usr) 目录的权限,告诉 ansible 不要尝试这样做并抛出错误消息。

我该怎么做?

【问题讨论】:

我不确定我是否理解你在问什么......标题表明你不想让 ansible 更改某些目录/文件。无论如何,在文本中听起来好像您在询问如何更改它们。也就是说:请给我们 exact 错误信息。 类似的东西并不是一个很好的分析基础。 嗨!对不起,如果我不清楚。我想要的是,当执行剧本时,如果其中一个目录(/boot,/etc,/usr)通过参数传递,它会停止发送错误消息,指出无法在系统目录上更改权限 仍不清楚。您希望改变发生(坏主意!!)还是希望 ansible 不尝试这样做?或者你只是想抑制错误信息? P.S.:请用更清晰的要求编辑问题,而不是在 cmets 中回答。在Stack Overflow,一个问题应该是明确的,而不是要求一个人阅读整个线程来理解你真正想要什么。 我希望 ansible 不尝试这样做并向用户抛出错误消息 @tink 问题我已经改正了,希望现在明白了 【参考方案1】:

我了解您喜欢fail with custom messagewhen 变量DIR 包含值/boot/var/etc/tmp/usr 之一的问题。

为此,您可以使用

- name: You can't work on  DIR 
  fail:
    msg: The system may not work on  DIR  according ...
   when: '"/boot" or "/var" or "/etc" or "/tmp" or "/usr" in DIR'

还有一个meta_module,当条件满足时可以end_play

  tasks:
  - meta: end_play
    when: '"/boot" or "/var" or "/etc" or "/tmp" or "/usr" in DIR'

failend_play,您可以针对某些用例结合不同的变量。

when: "'download' or 'unpack' in ansible_run_tags"
when: ( "DMZ" not in group_names )

感谢

Run an Ansible task only when the variable contains a specific string Ansible - Execute task when variable contains specific string

请注意,您通过在末尾连接 DIR / FILE 来构建完整路径。上面提到的简单方法不会处理包含路径的空DIRFILEname。测试用例可以是

DIR: ""
FILE "/tmp/test"

DIR: "/"
FILE: "tmp/test"

也许您想在完整文件路径或test what a variable begins with 上执行测试。

关于Zeitounator和seshadri-c的cmets,你也可以试试assert_module的方法

- name: Check for allowed directories
  assert:
    that:
      -  DIR in ["/boot", "/etc", "/var", "/tmp", "/usr"]
    quiet: true
    fail_msg: "The system may not work on  DIR  according ..."
    success_msg: "Path is OK."

【讨论】:

另外一个模块(也是 IMO 场景中最适合的模块)是 assert 另外,我将when 条件设为when: DIR in ["/boot", "/etc", "/var", "/usr"] 非常感谢您的解释!真的很有帮助

以上是关于如何使用 ansible 排除文件系统的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Ansible 创建目录

在Ansible中,如果系统在更新该行之前重新启动,如何重复获取文件直到存在一行?

如何使用 GetFiles() 搜索包含 doc 文件但排除 docx 文件?

如何使用 Ansible 配置 Vim并安装插件

如何使用 Get-ChildItem -exclude 排除多个文件夹?

质量检测工具sonar如何排除指定的目录