如何使用 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'
fail
和 end_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
来构建完整路径。上面提到的简单方法不会处理包含路径的空DIR
和FILE
name。测试用例可以是
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中,如果系统在更新该行之前重新启动,如何重复获取文件直到存在一行?
如何使用 GetFiles() 搜索包含 doc 文件但排除 docx 文件?