如何从角色中检查目录是否存在于Ansible剧本级别(不在主机中)



我有两个可回答的角色。

  • rundeck_install
  • rundeck_app

rundeck_install角色安装rundeck社区版。rundeck_app角色安装jdkmysqlrundeck(通过使用rundeck_install角色(

rundeck_install角色的任务是从rundeck_install/files/aclpolicies文件夹中复制所有*.aclpolicy文件。

# this will copy aclpolicy files from <role>/files/aclpolicies directory
- name: Copy ACL policy files
ansible.builtin.copy:
src: "aclpolicies/"
dest: /etc/rundeck
owner: rundeck
group: rundeck
mode: 0664

我在角色中添加了一个额外的任务来复制<parent_role>/files/aclpolicies目录中存在的任何aclpolicy文件。在我的案例中,rundeck_app包括rundeck_install角色,所以如果rundeck_app/files/aclpolicies文件夹中存在任何aclpolicy文件,我想复制所有这些文件,优先于rundeck_install/files/aclpolicies下的文件。为此,我在上面的任务之后添加了下面的任务。

# this will copy aclpolicy files from <running playbook>/files/aclpolicies directory
- name: Copy ACL policy files from playbook
ansible.builtin.copy:
src: "{{ playbook_dir }}/files/aclpolicies/"
dest: /etc/rundeck
owner: rundeck
group: rundeck
mode: 0664

这一切都很顺利。但在rundeck_app/files/下没有aclpolicies文件夹时出错。

如何检查父角色是否拥有文件夹并跳过运行任务?

我计划在执行任务之前运行一个目录是否存在的检查。

这有具体原因吗?Ansible是一个配置管理工具,您可以声明一个状态,理想情况下是幂等的。

因此,一个人只需要

- name: Make sure target dir exists
file:
path: /etc/rundeck
state: directory
owner: rundeck
group: rundeck
mode: '0664'

如果不存在,Ansible会创建它,如果权限不正确(不再正确(,也会更正权限。

如果需要进行检查,可以登记结果,并在此基础上采取进一步行动。

register: result
- name: Show result
debug:
var: result

输出和变量看起来像

TASK [Show result] *********************************
ok: [test.example.com] =>
result:
ansible_facts:
discovered_interpreter_python: /usr/bin/python
changed: true
diff:
after:
mode: '0664'
path: /etc/rundeck
before:
mode: '0755'
path: /etc/rundeck
failed: false
...

TASK [Show result] *******
ok: [test.example.com] =>
result:
changed: false
diff:
after:
path: /etc/rundeck
before:
path: /etc/rundeck
failed: false
gid: 1234567890
group: rundeck
mode: '0664'
owner: rundeck
path: /etc/rundeck
...

进一步链接

  • file–管理文件和文件属性
  • 示例

最新更新