当前位置: 首页 > article >正文

【ansible】ansible roles

ansible roles 简介

Ansible Roles是一种组织和管理Ansible Playbooks的方法。它们允许将相关的配置和任务分组到一个可重用的单元中,使得代码更加模块化和可维护。

一个Ansible Role包含了一组预定义的变量、任务和文件结构。它可以被其他Playbooks调用和使用,从而实现代码的重用。Roles可以用于定义各种不同的配置,从简单的软件安装和配置到复杂的系统部署。

Roles通常包含以下几个重要的目录和文件:

  • tasks:包含了要执行的任务列表,可以是Ansible模块的调用或者是其他角色的引用。
  • handlers:包含了用于响应特定事件的任务,比如重新启动服务或者重新加载配置文件。
  • vars:包含了角色的变量定义,这些变量可以在角色的其他部分中引用。
  • defaults:包含了角色的默认变量值。
  • templates:包含了配置文件的模板,可以使用Jinja2模板引擎来渲染这些文件。
  • files:包含了需要复制到被管理节点的文件。

使用Roles可以极大地简化Ansible代码的编写和维护工作,提高代码的可读性和可重用性。同时,Roles还使得团队协作更加容易,可以方便地共享和复用角色。

ansible roles 语法

Ansible roles 是一种组织和结构化Ansible playbook的方法。它允许您将任务、变量和模板组织到可重复使用的模块中,以便在多个playbook中重复使用。

下面是一个典型的Ansible role的目录结构:

roles/
    myrole/
        tasks/
            main.yml
        vars/
            main.yml
        files/
            myfile.txt
        templates/
            mytemplate.j2
        handlers/
            main.yml
        meta/
            main.yml

在此目录结构中,各个目录的作用如下:

  • tasks/:包含执行任务的YAML文件。
  • vars/:包含变量定义的YAML文件。
  • files/:包含要传输到目标主机的文件。
  • templates/:包含要在目标主机上生成的模板。
  • handlers/:包含处理器定义的YAML文件。
  • meta/:包含角色元数据的YAML文件。

main.yml文件中,您可以定义要在角色中执行的任务、变量和文件。

通过使用role,您可以在playbooks中使用include_roleroles关键字来导入并使用role。

以下是一个使用role的示例:

- name: Example playbook
  hosts: web
  roles:
    - myrole

上面的示例将导入名为myrole的role,并在web组的主机上运行。

1、使用ansible playbook部署httpd,要求httpd.conf由模板生成,对应的servername改为受控端IP

cd /etc/ansible/roles
ansible-galaxy init httpd

主yaml rolets.yml

---
- hosts: h1
  remote_user: root
  roles:
  - httpd
---
# tasks file for httpd
- name: install httpd package
  yum: name={{package}} state=latest
- name: install configure file
  #使用template模板
  template: src=/etc/ansible/httpd.conf.j2 dest=/etc/httpd/conf/httpd.conf
  notify:
  - restart httpd
- name: create root dir
  file: path=/etc/httpd/htdocs state=directory
- name: start httpd server
  service: name={{service}} enabled=true state=started
---
# handlers file for httpd
- name: restart httpd
  service: name={{service}} state=restarted
---
# vars file for httpd
package: httpd
service: httpd
......
#/etc/ansible/roles/httpd/templates/httpd.conf.j2 95行
ServerName {{ansible_ens33.ipv4.address}}:80
......

2、编写一个playbook,当模板任务执行完成时触发一个debug任务

 ansible-galaxy init debug823
---
# tasks file for debug823
- name: copy file
  copy: 
    content: |
      #!/bin/bash
      echo "Hello World"
    dest: /tmp/hello.sh
    mode: '0755'

- name: run script
  command: /tmp/hello.sh
  notify: success
---
# handlers file for debug823
- name: success
  debug:
    msg: "This is a success message"

/etc/ansible/debugtestplaybook.yml

---
- hosts: h1
  remote_user: root
  roles:
    - debug823

3、编写一个复制一文件到被控端的playbook

echo 123 > /etc/ansible/roles/debug823/files/testcopy.txt
---
# tasks file for debug823
- name: copy file
  copy: 
    src: testcopy.txt
    dest: /tmp/testcopy.txt
    mode: '0644'
    owner: root
    group: root

- name: debug task
  debug:
    msg: "This is a debug message"

4、编写一个playbook,部署前后端分离项目

192.168.99.132 nginx
192.168.99.144 java
192.168.99.177 mysql

主playbook yaml

- name: nginx install
  hosts: nginx
  roles:
  - nginx

- name: java install
  hosts: java
  roles:
  - java

- name: mysql install
  hosts: mysql
  roles:
  - mysql

nginx role

---
# tasks file for nginx
- name: Install epel-release
  yum:
    name: epel-release
    state: present

- name: Install nginx
  yum:
    name: nginx
    state: present

- name: Start nginx service
  service:
    name: nginx
    state: started

- name: Enable nginx service
  service:
    name: nginx
    enabled: yes

- name: copy project bm
  copy:
    src: bm
    dest: /usr/share/nginx/html/
    mode: 0644
    owner: nginx
    group: nginx

- name: Configure nginx
  template:
    src: nginx.conf.j2
    dest: /etc/nginx/nginx.conf
  notify:
    - restart nginx

nginx.conf.j2

  ……
        server {
        listen 80; 
        server_name {{ansible_ens33.ipv4.address}};

        location / {
            root /usr/share/nginx/html/bm;
            index index.html index.htm;
        }   
        location /bm {
                proxy_pass http://java:8090;
        }           

……

java role

---
# tasks file for java
- name: copy jdk
  copy:
    src: jdk-8u371-linux-x64.rpm
    dest: /tmp/jdk-8u371-linux-x64.rpm

- name: install jdk
  yum:
    name: /tmp/jdk-8u371-linux-x64.rpm
    state: present

- name: copy carton.jar
  copy:
    src: carbon.jar
    dest: /opt/carbon.jar
    mode: 0755

- name: copy hosts
  copy:
    src: /etc/hosts
    dest: /etc/hosts

- name: start carbon.jar
  command: nohup java -jar /opt/carbon.jar &
  register: result
  async: 3600
  poll: 0


mysql role

---
# tasks file for mysql

- name: install mariadb
  yum:
    name: mariadb-server
    state: present

- name: start mariadb
  service:
    name: mariadb
    state: started

- name: copy carbon.sql to /tmp
  copy: src=carbon.sql dest=/tmp/carbon.sql


- name: run init.exp
  script: init.exp

- name: execute SQL
  shell: mysql -uroot -p{{mysql_password}} < /tmp/carbon.sql

init.exp

#!/usr/bin/expect
set timeout 30
spawn mysql -uroot -p
expect {
	"*password*" {send "\r"}
}
expect ">*"
send "SET PASSWORD FOR 'root'@'localhost' = PASSWORD('root');\r"
expect ">*"
send "create user 'root'@'%' identified by 'root';\r"
expect ">*"
send "GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'root';\r"
expect ">*"
send "flush privileges;\r"
expect ">*"
send "quit\r"
expect eof

http://www.kler.cn/a/280468.html

相关文章:

  • [Android开发] RecyleView+Checkbox 实现勾选条目删除简单功能 + 删除完后用图片占位
  • Qt_两种创建组件的方式-通过图形化-通过代码
  • linux:进程间的通信 信号通信
  • Python-进阶-Excel基本操作
  • 使用 ECharts 进行数据可视化
  • github访问加速项目@一键部署自动更改host修改加速Github访问
  • 提升学术论文质量的智能助手:ChatGPT
  • Kafka命令详解:从零开始,掌握Kafka集群管理、主题操作与监控的全方位技能,理解每一条命令背后的逻辑与最佳实践
  • 【PostgreSQL教程】PostgreSQL 高级篇之索引
  • 爬虫:爬取MDPI杂志中国作者单位和邮箱
  • ORA-16072: a minimum of one standby database destination is required
  • [mysql]mysql的演示使用
  • mysql 不同版本安装不同端口
  • Linux磁盘操作之du命令
  • 衡石科技BI的产品HENGSHI SENSE API 使用手册 第一篇应用
  • 虚拟机网络的三种模式,NAT模式,桥接模式,仅主机模式
  • SpringBoot工厂模式
  • 23种设计模式详细知识点(软件设计师)
  • 央行沟通与市场影响以日本央行与黄金市场为例
  • World of Warcraft [CLASSIC][80][Grandel] Call to Arms: Strand of the Ancients