RHCE8.0实训:实施处理程序

来自CloudWiki
跳转至: 导航搜索

实训目的

您应能够在playbook中定义处理程序,并向它们通知配置更改。

服务器A(母机)上已安有mariadb ,现在在服务器B上安装mariadb

实验准备

母机安装mariadb

centos7 安装Mariadb :https://www.cnblogs.com/yhongji/p/9783065.html

安装MariaDB

通过yum安装就行了。简单快捷,安装mariadb-server,默认依赖安装mariadb,一个是服务端、一个是客户端。

[root@mini ~]# yum install mariadb-server

配置MariaDB

1)安装完成后首先要把MariaDB服务开启,并设置为开机启动

[root@mini ~]# systemctl start mariadb # 开启服务

[root@mini ~]# systemctl enable mariadb # 设置为开机自启动服务

2)首次安装需要进行数据库的配置,命令都和mysql的一样

[root@mini ~]# mysql_secure_installation

3)配置时出现的各个选项


Enter current password for root (enter for none):  # 输入数据库超级管理员root的密码(注意不是系统root的密码),第一次进入还没有设置密码则直接回车

Set root password? [Y/n]  # 设置密码,y

New password:  # 新密码
Re-enter new password:  # 再次输入密码

Remove anonymous users? [Y/n]  # 移除匿名用户, y

Disallow root login remotely? [Y/n]  # 拒绝root远程登录,n,不管y/n,都会拒绝root远程登录

Remove test database and access to it? [Y/n]  # 删除test数据库,y:删除。n:不删除,数据库中会有一个test数据库,一般不需要

Reload privilege tables now? [Y/n]  # 重新加载权限表,y。或者重启服务也许

安装和验证apache服务器

ansible-playbook intranet.yml

---
  - name: Enable intranet services
    hosts: servera.lab.example.com
    become: yes
    tasks:
      - name: latest version of httpd and firewalld installed
        yum:
          name:
            - httpd
            - firewalld
          state: latest
      - name: test html page is installed
        copy:
          content: "Welcome to the example.com intranet!\n"
          dest: /var/www/html/index.html
      - name: firewalld enabled and running
        service:
          name: firewalld
          enabled: true
          state: started
      - name: firewalld permits access to httpd srevice
        firewalld:
          service: http
          permanent: true
          state: enabled
          immediate: yes
      - name: httpd enabled and running
        service:
          name: httpd
          enabled: true
          state: started
      - name: copy inf file to the server'root
        copy:
          src: /etc/my.cnf
          dest: /var/www/html/my.cnf.standard
  - name: Testintranet web server
    hosts: serverb.lab.example.com
    become: no
    tasks:
      - name: connect to intranet web server
        uri:
          url: http://servera.lab.example.com
          return_content: yes
          status_code: 200


实验步骤

新建目录

[root@servera ansible]# mkdir control-handlers

[root@servera ansible]# cd control-handlers/

在该目录中,使用文本编辑器编辑configure_db.yml playbook文件。

此playbook将安装和配置一个数据库服务器。当数据库服务器配置更改时,playbook将触发数据库服务重新 启动并配置数据库管理密码。

变量初始化

使用文本编辑器,查看configure_db. yml playbook 从一些变量的初始化幵始

vi configure_db.yml

---
- name: Installing MariaDB server
  hosts: database_prod
  vars:
    db_packages:
      - mariadb-server
      - MySQL-python

    db_service: mariadb
    resources_url: http://servera.lab.example.com
    config_file_url: "{{ resources_url }}/my.cnf.standard"
    config_file_dst: /etc/my.cnf
  • db_packages定义要为数据库服务安装的软件包的名称。
  • db_service定义数据库服务的名称。
  • resources_url表示远程配置文件所在的资源目录的URL。
  • config_file_url表示要安装的数据库配置文件的URL。
  • config_file_dst是受管主机上已安装配置文件的位置。

添加任务_安装数据库

在configure_db.yml文件中定义一个任务,它使用yum模块安装由db_packages 变量定义的必要数据库软件包。如果该任务更改了系统,则表示未安装数据库,您需要 通知set db password处理程序,设置初始数据库用户和密码。请记住,处理程序任 务(如果获得通知)在tasks部分中的每个任务都已运行之前将不会运行

  tasks:
    - name: "{{ db_packages }} packages are installed"
      yum:
        name: "{{ db_packages }}"
        state: present
      notify:
        - set db password

添加任务_启动数据库

添加一个任务,以启动并启用数据库服务。该任务应当如下所示:

    - name: Make sure the database service is running
      service:
        name: "{{ db_service }}"
        state: started
        enabled: true

添加任务_下载配置文件

添加一项任务,它使用get_url模块将my .cnf. standard下载到受管主机上的/ etc/my.cnf添加通知restart db service处理程序的条件,以在配置文件更改 后重新启动数据库服务。该任务应当如下所示:

- name: The {{ config_file_dst }} file has been installed
      get_url:
        url: "{{ config_file_url }}"
        dest: "{{ config_file_dst }}"
        owner: mysql
        group: mysql
        force: yes
      notify:
        - restart db service

定义处理程序

添加handlers关键字以定义处理程序任务的幵头。

定义第一个处理程序restart db service,它重新启动mariadb服务。

定义第二个处理程序set db password,它设置数据库服务的管理密码。该处理程序 使用mysql_user模块来执行命令。

  handlers:
    - name: restart db service
      service:
        name: "{{ db_service }}"
        state: restarted
    - name: set db password
      mysql_user:
        name: root
        password: redhat

完整代码

vi configure_db.yml

---
- name: Installing MariaDB server
  hosts: database_prod
  vars:
    db_packages:
      - mariadb-server
      - MySQL-python
    db_service: mariadb
    resources_url: http://servera.lab.example.com
    config_file_url: "{{ resources_url }}/my.cnf.standard"
    config_file_dst: /etc/my.cnf
  tasks:
    - name: "{{ db_packages }} packages are installed"
      yum:
        name: "{{ db_packages }}"
        state: present
      notify:
        - set db password
    - name: Make sure the database service is running
      service:
        name: "{{ db_service }}"
        state: started
        enabled: true
    - name: The {{ config_file_dst }} file has been installed
      get_url:
        url: "{{ config_file_url }}"
        dest: "{{ config_file_dst }}"
        owner: mysql
        group: mysql
        force: yes
      notify:
        - restart db service
  handlers:
    - name: restart db service
      service:
        name: "{{ db_service }}"
        state: restarted
    - name: set db password
      mysql_user:
        name: root
        password: redhat

运行play

[root@servera control-handlers]# ansible-playbook configure_db.yml --syntax-check

playbook: configure_db.yml

[root@servera control-handlers]# ansible-playbook configure_db.yml


PLAY [Installing MariaDB server] ************************************************************************

TASK [Gathering Facts] **********************************************************************************
ok: [serverb.lab.example.com]

TASK [['mariadb-server', 'MySQL-python'] packages are installed] ****************************************
changed: [serverb.lab.example.com]

TASK [Make sure the database service is running] ********************************************************
ok: [serverb.lab.example.com]

TASK [The /etc/my.cnf file has been installed] **********************************************************
ok: [serverb.lab.example.com]

RUNNING HANDLER [restart db service] ****************************************************
changed: [serverb.lab.example.com]

RUNNING HANDLER [set db password] ***********************************************************************
changed: [serverb.lab.example.com]

PLAY RECAP **********************************************************************************************
serverb.lab.example.com    : ok=5    changed=2    unreachable=0    failed=0    skipped=0    rescued=0             ignored=0


再次执行脚本,会发现这回不再触发set password:


PLAY [Installing MariaDB server] *********************************************************************************

TASK [Gathering Facts] *******************************************************************************************
ok: [serverb.lab.example.com]

TASK [['mariadb-server', 'MySQL-python'] packages are installed] *************************************************
ok: [serverb.lab.example.com]

TASK [Make sure the database service is running] *****************************************************************
ok: [serverb.lab.example.com]

TASK [The /etc/my.cnf file has been installed] *******************************************************************
ok: [serverb.lab.example.com]

PLAY RECAP *******************************************************************************************************
serverb.lab.example.com    : ok=4    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0


这一次处理程序被跳过。如果将来更改远程配置文件,执行playbook将触发restart db service处理程序,而不是set db password处理程序。