ansible之playbook-06 Role

角色的安装获取

rhel-system-roles

安装红帽工程师写的系统相关角色
yum -y install rhel-system-roles

查看有哪些角色 
ls /usr/share/ansible/roles/

《ansible之playbook-06 Role》

从社区获取角色

从社区获取角色https://galaxy.ansible.com/

《ansible之playbook-06 Role》

命令行使用galaxy角色

搜索角色

可以根据--author(用户)、--platforms(平台)、--galaxy-tags(标记)进行搜索角色。

1.根据用户名搜索角色

ansible-galaxy search –author geerlingguy

《ansible之playbook-06 Role》

2.根据平台搜索角色

EL是企业Linux平台

ansible-galaxy search –platforms EL

《ansible之playbook-06 Role》

查看角色信息

1.查看角色具体信息

ansible-galaxy info geerlingguy.redis

《ansible之playbook-06 Role》

2.列出所有角色

只会列出配置文件中指定位置的角色

roles_path={{ ANSIBLE_HOME ~ "/roles:/usr/share/ansible/roles:/etc/ansible/roles" }}

ansible-galaxy list

《ansible之playbook-06 Role》

下载删除角色

1.下载单个角色

默认下载到~/.ansible/roles目录下,–ignore-errors参数表示忽略错误下载。

ansible-galaxy install geerlingguy.redis --ignore-errors    

《ansible之playbook-06 Role》

2.指定下载的路径

使用-p参数指定下载路径。

《ansible之playbook-06 Role》

3.从指定文件批量下载角色

通过-r指定下载文件。

下载角色以-src指定

- src: geerlingguy.redis
- src: geerlingguy.apache

《ansible之playbook-06 Role》

4.删除角色

默认删除~/.ansible/roles下的角色,要删除其他位置的角色需要-p指定

ansible-galaxy remove geerlingguy.redis -p ./

《ansible之playbook-06 Role》

角色的四种用法

  • 在play级别使用角色选项:这是在play中使用角色的经典方式。
  • 在task别使用 include_role:您可以使用 include_role 在戏剧的任务部分中的任何位置动态重用角色。
  • 在task级别使用 import_role:您可以使用 import_role 在戏剧的任务部分中的任何位置静态地重用角色。
  • 作为另一个角色的依赖项(使用 meta/main.yml 中的依赖项关键字)。

自定义角色

查找角色目录优先级

  1. playbook文件会在同级目录中寻找与调用的角色同名的roles。
  2. 最先从当前的playbook所在的同级目录下的roles子目录里查找角色。
  3. 再按照配置文件中的roles_path指定的角色目录查找,可以使用冒号写多个路径。
roles_path={{ ANSIBLE_HOME ~ "/roles:/usr/share/ansible/roles:/etc/ansible/roles" }}

初始化自定义的角色myrole

ansible-galaxy init myrole

查看角色目录结构

[root@eab5aec2df6c roles]# tree myrole/
myrole/
├── README.md
├── defaults   该目录存放此Role的设定默认变量,在该目录下,也必须存在一个main.yml文件。
│   └── main.yml
├── files      用来存放copy模块的文件,或者是script模块的脚本文件。
├── handlers   该目录下用于存放Role中触发条件后执行的动作,在该目录下,也必须存在一个main.yml文件。
│   └── main.yml
├── meta      该目录通常存放此Role的特殊设定及其依赖关系,在该目录下,也必须存在一个main.yml文件。
│   └── main.yml
├── tasks     用于存放一系列任务文件,在该目录下,必须存在一个main.yml文件,该文件会通过include调用其他的文件。
│   └── main.yml
├── templates  此目录下用于存放此Role需要使用的jinjia2模板文件。
├── tests
│   ├── inventory
│   └── test.yml
└── vars      该目录下存放一系列的变量,在该目录下,必须存在一个main.yml文件,该文件会通过include调用其他的文件。
    └── main.yml

[root@eab5aec2df6c roles]# cat myrole/vars/main.yml
---
# vars file for myrole
PORT: 8088        #指定nginx监听的端口
USERNAME: www     #指定nginx运行用户
GROUPNAME: www    #指定nginx运行组
[root@eab5aec2df6c roles]# cat myrole/tasks/main.yml
---
# tasks file for myrole
- import_tasks: group.yml
- import_tasks: user.yml
- import_tasks: install.yml
- import_tasks: config.yml
- import_tasks: start.yml
[root@eab5aec2df6c roles]# cat myrole/tasks/group.yml
- name: Create a Startup Group
  group: name={{ GROUPNAME }} gid=60 system=yes
[root@eab5aec2df6c roles]# cat myrole/tasks/user.yml
- name: Create Startup Users
  user: name={{ USERNAME }} uid=60 system=yes shell=/sbin/nologin
[root@eab5aec2df6c roles]# cat myrole/tasks/install.yml
- name: Install Package Nginx
  yum: name=nginx state=installed
[root@eab5aec2df6c roles]# cat myrole/tasks/config.yml
- name: Copy Nginx Template File
  template: src=nginx.conf.j2 dest=/etc/nginx/nginx.conf
  notify: Restart Nginx
[root@eab5aec2df6c roles]# cat myrole/tasks/start.yml
- name: Start Nginx Service
  service: name=httpd state=started enabled=yes
[root@eab5aec2df6c roles]# cat myrole/handlers/main.yml
---
# handlers file for myrole
- name: Restart Nginx
  service: name=nginx state=restarted
[root@eab5aec2df6c roles]# cat myrole/templates/nginx.conf.j2
user {{ USERNAME }} {{ GROUPNAME }};
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;

# Load dynamic modules. See /usr/share/doc/nginx/README.dynamic.
include /usr/share/nginx/modules/*.conf;

events {
    worker_connections 1024;
}

http {
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;

    sendfile            on;
    tcp_nopush          on;
    tcp_nodelay         on;
    keepalive_timeout   65;
    types_hash_max_size 4096;

    include             /etc/nginx/mime.types;
    default_type        application/octet-stream;

    # Load modular configuration files from the /etc/nginx/conf.d directory.
    # See http://nginx.org/en/docs/ngx_core_module.html#include
    # for more information.
    include /etc/nginx/conf.d/*.conf;

    server {
        listen       {{ PORT }};
        listen       [::]:{{ PORT }};
        server_name  _;
        root         /usr/share/nginx/html;

        # Load configuration files for the default server block.
        include /etc/nginx/default.d/*.conf;

        error_page 404 /404.html;
        location = /404.html {
        }

        error_page 500 502 503 504 /50x.html;
        location = /50x.html {
        }
    }


}
[root@eab5aec2df6c palybook]# cat roletest.yml
---
- hosts: centos70
  remote_user: root
  roles:
    - role: myrole         #指定角色名称


ansible-playbook roletest.yml

《ansible之playbook-06 Role》

《ansible之playbook-06 Role》

一些特殊用法

依赖角色使用

role如果依赖其他role,则必须在meta/main.yml中定义依赖,运行之前先运行依赖角色

dependencies: [dep,dep2]

或者

dependencies:
  - { role: nginx }
  - { role: php-fpm }

跨项目调用文件

src:roles/nginx/files/index.html    #跨项目调用路径要写roles的名称
dest: /var/www/nginx/html/

使用其他角色的task

- name: include apt tasks
  include_role:
      name: package_manager_bootstrap
      tasks_from: apt.yml
  when: ansible_facts['os_family'] == 'Debian'

使用标签实现playbook角色的调用

 roles:
  - {role: nginx,tags: ["nginx","test"]}
  - {role: mysql,tags: db}


ansible-playbook  --tags nginx test_roles.yaml 

根据条件导入角色task

# roles/example/tasks/main.yml
- name: Install the correct web server for RHEL
  import_tasks: redhat.yml
  when: ansible_facts['os_family']|lower == 'redhat'

- name: Install the correct web server for Debian
  import_tasks: debian.yml
  when: ansible_facts['os_family']|lower == 'debian'

# roles/example/tasks/redhat.yml
- name: Install web server
  ansible.builtin.yum:
    name: "httpd"
    state: present

# roles/example/tasks/debian.yml
- name: Install web server
  ansible.builtin.apt:
    name: "apache2"
    state: present

参考

Ansible进阶2——角色管理_ansible 使用进阶-CSDN博客

Ansible–Ansible之Roles – 别来无恙- – 博客园 (cnblogs.com)

Roles — Ansible Community Documentation

点赞

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注