创建角色、ansible-galaxy简单使用
1.创建角色
角色创建流程
在Ansible中创建角色不需要特别的开发工具。创建和使用角色包含三个步骤:
创建角色目录结构
定义角色内容
在playbook中使用角色
2.创建角色的两种方式
用mkdir直接创建
[root@centos8-1 roles]# mkdir -p nginx/{defaults,vars,files,templates,tasks,handlers}
[root@centos8-1 roles]# ls
nginx php.tar
[root@centos8-1 roles]# tree nginx
nginx
├── defaults
├── files
├── handlers
├── tasks
├── templates
└── vars
6 directories, 0 files
[root@centos8-1 roles]#
[root@centos8-1 roles]# touch nginx/{defaults/main.yml,tasks/main.yml,vars/main.yml}
[root@centos8-1 roles]# tree nginx/
nginx/
├── defaults
│ └── main.yml
├── files
├── handlers
├── tasks
│ └── main.yml
├── templates
└── vars
└── main.yml
6 directories, 3 files
[root@centos8-1 roles]
通过命令来创建
[root@centos8-1 roles]# ansible-galaxy init httpd
- Role httpd was created successfully
[root@centos8-1 roles]# tree httpd/
httpd/
├── 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
[root@centos8-1 roles]#
3.定义角色的内容
创建目录结构后,用户必须编写角色的内容。ROLENAME/tasks/main.yml任务文件是一个不错的起点,它是由角色运行的主要任务列表。
下列tasks/main.yml文件管理受管主机上的/etc/motd文件。它使用template模块将名为motd.j2的模板部署到受管主机上。因为template模块是在角色任务而非playbook任务内配置的,所以从角色的templates子目录检索motd.j2模板。
我们用角色给受管主机安装一个httpd
准备工作:
[root@centos8-1 httpd]# cat tasks/main.yml //角色任务里面写安装、配置、重启
---
# tasks file for httpd
- name: install httpd
yum:
name: httpd
state: present
- name: config httpd
template:
src: templates/httpd.conf.j2
dest: /etc/httpd/conf/httpd.conf
- name: service
service:
name: httpd
state: started
[root@centos8-1 httpd]#
角色允许以模块化方式编写playbook。为了最大限度地提高新开发角色的效率,请考虑在角色开发中采用以下推荐做法:
在角色自己的版本控制存储库中维护每个角色。Ansible很适合使用基于git的存储库。
角色存储库中不应存储敏感信息,如密码或SSH密钥。敏感值应以变量的形式进行参数化,其默认值应不敏感。使用角色的playbook负责通过Ansible Vault变量文件、环境变量或其他ansible-playbook选项定义敏感变量。
使用ansible-galaxy init启动角色,然后删除不需要的任何目录和文件。
创建并维护README.md和meta/main.yml文件,以记录用户的角色的用途、作者和用法。
让角色侧重于特定的用途或功能。可以编写多个角色,而不是让一个角色承担许多任务。
经常重用和重构角色。避免为边缘配置创建新的角色。如果现有角色能够完成大部分的所需配置,请重构现有角色以集成新的配置方案。使用集成和回归测试技术来确保角色提供所需的新功能,并且不对现有的playbook造成问题。
4.角色的依赖项:
角色依赖项使得角色可以将其他角色作为依赖项包含在内。例如,一个定义文档服务器的角色可能依赖于另一个安装和配置web服务器的角色。依赖关系在角色目录层次结构中的meta/main.yml文件内定义。
以下是一个示例meta/main.yml文件。
[root@centos8-1 roles]# tree httpd/
httpd/
├── 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
[root@centos8-1 roles]#
[
root@centos8-1 httpd]# cat meta/main.yml
dependencies:
- role: apache
port: 8080
- role: postgres
dbname: serverlist
admin_user: felix
默认情况下,角色仅作为依赖项添加到playbook中一次。若有其他角色也将它作为依赖项列出,它不会再次运行。此行为可以被覆盖,将meta/main.yml文件中的allow_duplicates变量设置为yes即可。
注意:
限制角色对其他角色的依赖。依赖项使得维护角色变得更加困难,尤其是当它具有许多复杂的依赖项时。
5.playbook使用角色
要访问角色,可在play的roles:部分引用它。
[root@centos8-1 httpd]# cat defaults/main.yml
---
# defaults file for httpd
PORT: 82
[root@centos8-1 httpd]#
[root@centos8-1 ansible]# cat playbook/test.yml
---
- hosts: 192.168.197.135
roles:
- httpd
[root@centos8-1 ansible]#
[root@centos8-1 ansible]# ansible-playbook playbook/test.yml
PLAY [192.168.197.135] *********************************************************
TASK [Gathering Facts] *********************************************************
ok: [192.168.197.135]
TASK [install httpd] ***********************************************************
ok: [192.168.197.135]
TASK [config httpd] ************************************************************
ok: [192.168.197.135]
TASK [httpd : service] *********************************************************
ok: [192.168.197.135]
PLAY RECAP **********************************************