我有两个可回答的角色。
rundeck_install
rundeck_app
rundeck_install
角色安装rundeck社区版。rundeck_app
角色安装jdk
、mysql
和rundeck
(通过使用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
–管理文件和文件属性- 示例