系统角色的使用、角色结构创建方式
1.角色的执行顺序
对于playbook中的每个play,任务将按照任务列表中的顺序执行。首先执行完所有任务后。再将任务通知的处理程序执行。
要在角色之前执行任务,可以给play配置pre_tasks部分
要在play的普通任务和它们通知的执行程序之后执行任务,可以用post_tasks部分
1.1系统角色 时间同步示例
[root@jlin test]# cat test.yml
---
- hosts: test1
vars:
timesync_ntp_servers:
- hostname: time1.aliyun.com
iburst: yes
power: true
pre_tasks:
- debug:
msg: " pre-task "
changed_when: power
notify:
- my handler
roles:
- timesync
tasks:
- debug:
msg: " first task "
changed_when: power
notify:
- my handler
post_tasks:
- debug:
msg: " post_task "
changed_when: power
notify:
- my handler
handlers:
- name: my handler
debug:
msg: " running my handlers "
[root@jlin test]# ansible-playbook test.yml
PLAY [test1] **************************************************************************************************
…………
PLAY RECAP ****************************************************************************************************
test1 : ok=22 changed=3 unreachable=0 failed=0 skipped=24 rescued=0 ignored=0
1.2系统角色selinux示例
示例1
[root@jlin test]# cat test.yml
---
- hosts: test1
tasks:
- name: Apply Selinux role
block:
- name: role use
include_role:
name: selinux
rescue:
- name: Check for failure for other reasons than required reboot
fail:
when: not selinux_reboot_required
- name: Restart managed host
reboot:
- name: Reapply Selinux role to cpmplete changes
include_role:
name: selinux
[root@jlin test]# ansible-playbook test.yml
…………
PLAY RECAP ****************************************************************************************************
test1 : ok=6 changed=3 unreachable=0 failed=0 skipped=16 rescued=0 ignored=0
示例2
[root@jlin test]# cat test.yml
---
- hosts: test1
vars:
PORT: 82
selinux_state: enforcing
seliux_ports:
- ports: ' 82 '
settype: 'httpd_port_t '
proto: ' tcp '
state: ' present '
tasks:
- name: install httpd
yum:
name: httpd
state: present
- name: config hhtpd
template:
src: files/httpd.conf.j2
dest: /etc/httpd/conf/httpd.conf
- name: seliunx rule for roles
include_role:
name: selinux
[root@jlin test]# ansible-playbook test.yml
PLAY [test1] **************************************************************************************************
…………
PLAY RECAP ****************************************************************************************************
test1 : ok=9 changed=3 unreachable=0 failed=0 skipped=15 rescued=0 ignored=0
2.角色目录结构创建方式
1.目录结构
默认情况下,Ansible在Ansible Playbook所在目录的roleq子目录中查找角色。这样,用户可以利用playbook和其他支持文件存储角色。
如果Ansible无法在该位置找到角色,它会按照顺序在Ansible配置设置roles_path所指定的目录中查找。此变量包含要搜索的目录的冒号分隔列表。此变量的默认值为:
~/ .ansible/roles:/usr/share/ansible/roles:/etc/ansible/roles
这允许用户将角色安装到由多个项目共享的系统上。例如,用户可能将自己的角色安装在自己的主目录下的~l.ansible/roles子目录中,而系统可能将所有用户的角色安装在/usr/share/ansible/roles目录中。
每个角色具有自己的目录,采用标准化的目录结构。例如,以下目录结构包含了定义motd角色的文件。
[root@jlin roles]# tree motd/
motd/
├── defaults
│ └── main.yml
├── files
├── handlers
│ └── main.yml
├── meta
│ └── main.yml
├── README.md
├── tasks
│ └── main.yml
├── templates
├── tests
│ ├── inventory
│ └── test.yml
└── vars
└── main.yml
文件 | 定义 |
---|---|
defaults | 此目录中的main.yml文件包含角色变量的默认值,使用角色时可以覆盖这些默认值。 这些变量的优先级较低,应该在play中更改和自定义 |
files | 此目录包含由角色任务引用的静态文件 |
handlers | 此目录中的main.yml文件包含角色的处理程序定义 |
meta | 此目录中的main.yml文件包含与角色相关的信息,如作者、许可证、平台和可选的角色依赖项 |
README.md | 提供人类可读的基本描述、有关如何使用该角色的文档和示例,以及其发挥作用需要满足的任何非ansible要求 |
meta | 此目录中的main.yml文件包含与角色相关的信息,如作者、许可证、平台和可选的角色依赖项 |
tasks | 此目录中的main.yml文件包含角色的任务定义 |
templates | 此目录包含由角色任务引用的Jinja2模板 |
teets | 此目录可以包含清单和名为test.yml的playbook,可用于测试角色 |
vars | 此目录中的main.yml文件定义角色的变量值。这些变量通常用于角色内部用途。 这些变量的优先级较高,在playbook中使用时不应更改 |
2.创建角色框架
可以使用标准Linux命令创建新角色所需的所有子目录和文件。此外,也可以通过命令行实用程序来自动执行新角色创建过程。ansible-galaxy
命令行工具可用于管理Ansible角色,包括新角色的创建。用户可以运行ansible-galaxy init
来创建新角色的目录结构。指定角色的名称作为命令的参数,该命令在当前工作目录中为新角色创建子目录。
[root@jlin test]# cd roles/
[root@jlin roles]# ansible-galaxy init motd
- Role motd was created successfully
[root@jlin roles]# ls
motd selinux timesync
[root@jlin roles]# tree motd/
motd/
├── defaults
│ └── main.yml
├── files
├── handlers
│ └── main.yml
├── meta
│ └── main.yml
├── README.md
├── tasks
│ └── main.yml
├── templates
├── tests
│ ├── inventory
│ └── test.yml
└── vars
└── main.yml
8 directories, 8 files