红帽 RHCE8 认证考试:创建和使用角色

题目描述

根据下列要求,在 /home/greg/ansible/roles 中创建名为 apache 的角色:

  • httpd 软件包已安装,设为在系统启动时启用并启动
  • 防火墙已启用并正在运行,并使用允许访问 Web 服务器的规则
  • 模板文件 index.html.j2 已存在,用于创建具有以下输出的文件 /var/www/html/index.html:
Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
Welcome to HOSTNAME on IPADDRESS
Welcome to HOSTNAME on IPADDRESS
Welcome to HOSTNAME on IPADDRESS

其中,HOSTNAME 是受管节点的完全限定域名,IPADDRESS 则是受管节点的 IP 地址。

按照下方所述,创建一个使用此角色的 playbook /home/greg/ansible/newrole.yml: 该 playbook 在 webservers 主机组中的主机上运行。

详细解析

简单地说,本题要求我们做两件事:首先创建一个角色,然后,编写一个 playbook 调用这个角色。

创建 apache 角色

首先,进入到角色目录 /home/greg/ansible/roles, 使用 ansible-galaxy 命令初始化一个名为 apache 的角色:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
cd /home/greg/ansible/roles
ansible-galaxy init apache
cd /home/greg/ansible/roles ansible-galaxy init apache
cd /home/greg/ansible/roles
ansible-galaxy init apache

使用上述命令初始化角色成功之后,会返回如下提示信息:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
- apache was created successfully
- apache was created successfully
- apache was created successfully

之后,进入到刚才创建的 apache 角色目录 /home/greg/ansible/roles/apache 中,使用 tree 目录可以看到该目录下文件和文件夹的基本结构,如下:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
[greg@control apache]$ tree
.
├── defaults
│   └── main.yml
├── files
├── handlers
│   └── main.yml
├── meta
│   └── main.yml
├── README.md
├── tasks
│   └── main.yml
├── templates
├── tests
│   ├── inventory
│   └── test.yml
└── vars
└── main.yml
[greg@control apache]$ tree . ├── defaults │   └── main.yml ├── files ├── handlers │   └── main.yml ├── meta │   └── main.yml ├── README.md ├── tasks │   └── main.yml ├── templates ├── tests │   ├── inventory │   └── test.yml └── vars └── main.yml
[greg@control apache]$ tree
.
├── defaults
│   └── main.yml
├── files
├── handlers
│   └── main.yml
├── meta
│   └── main.yml
├── README.md
├── tasks
│   └── main.yml
├── templates
├── tests
│   ├── inventory
│   └── test.yml
└── vars
    └── main.yml

角色目录下不同文件夹的作用如下:

  • defaults: 角色的默认变量
  • files: 包含可以经由此角色部署的文件
  • handlers: 包含可以由此角色使用的处理程序
  • meta: 角色定义的一些元数据
  • tasks: 包含角色要执行的主要任务的列表
  • templates: 包含可以经由此角色部署的模板
  • tests: 角色的测试文件
  • vars: 角色的其他变量

在角色的这些文件夹中,我们需要修改的其实就两个,一个是 tasks 目录下的 playbook main.yml, 我们需要在该 playbook 中写出题目所要求的 apache 角色需要完成的任务;另一个是在 templates 目录下新建一个名为 index.html.j2 的模板文件,该模板文件中的变量,可以在受控端的指定文件中显示相应的内容(对该模板文件的调用需要在 tasks 目录下的 main.yml 中使用 Ansible 的 templates 模块完成)。

接下来开始正式的配置编写。

首先,在 apache 角色的目录下(/home/greg/ansible/roles/apache)编辑 tasks 目录下的 main.yml, 写入如下四段内容:

第一段

使用 yum 模块安装 httpd 软件包:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
- name:
yum:
name: httpd
state: present
- name: yum: name: httpd state: present
- name:
  yum:  
    name: httpd
    state: present

[1]. yum 模块下的 name 参数用于指定要安装的软件包的名字;

[2]. yum 模块下的 state 用于指定软件包的状态,状态包括:installed, present, latest, removeabsent.

第二段

使用 firewalld 模块配置防火墙:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
- name:
firewalld:
service: http
state: enabled
permanent: yes
immediate: yes
- name: firewalld: service: http state: enabled permanent: yes immediate: yes
- name:
  firewalld:
    service: http
    state: enabled
    permanent: yes
    immediate: yes

[1]. service: http 表示对应的服务是 http, 即 web 服务,注意不要写成 “httpd”;

[2]. state: enabled 表示防火墙的状态为开启;

[3]. permanent: yes 表示允许通过;

[4]. immediate: yes 表示该防火墙规则立即生效。

第三段

使用 template 模块调用和设置模板文件:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
- name:
template:
src: index.html.j2
dest: /var/www/html/index.html
owner: apache
group: apache
mode: '0644'
- name: template: src: index.html.j2 dest: /var/www/html/index.html owner: apache group: apache mode: '0644'
- name:
  template:
    src: index.html.j2
    dest: /var/www/html/index.html
    owner: apache
    group: apache
    mode: '0644'

[1]. src 参数用于指定控制端模板文件的路径;

[2]. dest 参数用于指定被控制端文件的路径;

[3]. 0644 代表文件所述用户具有读写权限、所属组的用户和其他用户只具有读权限(读:4,写:2,执行:1)。

由于 apache 角色的模板目录 template 下并没有 index.html.j2 这个文件,因此,我们需要首先创建该并写入如下内容:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
Welcome to {{ ansible_hostname }} on {{ ansible_enp1s0.ipv4.address }}
Welcome to {{ ansible_hostname }} on {{ ansible_enp1s0.ipv4.address }}
Welcome to {{ ansible_hostname }} on {{ ansible_enp1s0.ipv4.address }}

第四段

使用 service 模块重启 httpd 和防火墙,并设置为开机自启动:

重启服务是为了让前面做的配置都生效,因此,调用 service 模块这部分要放在整个 playbook 的最后。

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
- name:
service:
name: "{{ item }}"
state: restarted
enabled: yes
loop:
- httpd
- firewalld
- name: service: name: "{{ item }}" state: restarted enabled: yes loop: - httpd - firewalld
- name:
  service:
    name: "{{ item }}"
    state: restarted
    enabled: yes
  loop:
    - httpd
    - firewalld

[1]. service 模块主要用于管理系统服务,例如启动和停止等;

补充:

有时候,由于被控制端主机上的防火墙服务没有处于开启的状态,那么,在上面的“第二段”配置信息中,使用 immediate: yes 让防火墙规则立即生效的时候就会报错,这个时候,我们可以在 apache 角色 tasks 目录下的 main.yml 文件的开头先调用一次 service 模块启动防火墙,配置如下:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
- name:
service:
name: firewalld
state: restarted
enabled: yes
- name: service: name: firewalld state: restarted enabled: yes
- name:
  service:
    name: firewalld
    state: restarted
    enabled: yes

apache 角色 tasks 目录下的 main.yml 文件最终完整的内容如下:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
---
# tasks file for apache
- name:
service:
name: firewalld
state: restarted
enabled: yes
- name:
yum:
name: httpd
state: present
- name:
firewalld:
service: http
state: enabled
permanent: yes
immediate: yes
- name:
template:
src: index.html.j2
dest: /var/www/html/index.html
owner: apache
group: apache
mode: '0644'
- name:
service:
name: "{{ item }}"
state: restarted
enabled: yes
loop:
- httpd
- firewalld
--- # tasks file for apache - name: service: name: firewalld state: restarted enabled: yes - name: yum: name: httpd state: present - name: firewalld: service: http state: enabled permanent: yes immediate: yes - name: template: src: index.html.j2 dest: /var/www/html/index.html owner: apache group: apache mode: '0644' - name: service: name: "{{ item }}" state: restarted enabled: yes loop: - httpd - firewalld
---
# tasks file for apache
- name:
  service:
    name: firewalld
    state: restarted
    enabled: yes

- name:
  yum:
    name: httpd
    state: present

- name:
  firewalld:
    service: http
    state: enabled
    permanent: yes
    immediate: yes

- name:
  template:
    src: index.html.j2
    dest: /var/www/html/index.html
    owner: apache
    group: apache
    mode: '0644'

- name:
  service:
    name: "{{ item }}"
    state: restarted
    enabled: yes
  loop:
    - httpd
    - firewalld

调用 apache 角色

可以看到,在前面创建和配置 apache 角色的时候,我们并没有指定该角色作用的受控端范围,我们可以新建一个 playbook, 然后在该 playbook 中调用 apache 角色并指定该角色可以作用的受控端的范围,这也正是使用 Ansible 角色的好处之一。

首先,按照题目要求,创建并编辑 playbook:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
vim /home/greg/ansible/newrole.yml
vim /home/greg/ansible/newrole.yml
vim /home/greg/ansible/newrole.yml

之后,在该 playbook 中写入如下内容:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
- name:
hosts: webservers
roles:
- apache
- name: hosts: webservers roles: - apache
- name:
  hosts: webservers
  roles:
    - apache

接着,运行该 playbook:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
ansible-playbook /home/greg/ansible/newrole.yml
ansible-playbook /home/greg/ansible/newrole.yml
ansible-playbook /home/greg/ansible/newrole.yml

最后,可以使用 curl 访问一下属于 websevers 组的 node3node4 这两个受控端主机,如果能返回类似如下信息,则表明配置成功:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
[greg@control ansible]$ curl http://node3
Welcome to node3 on 172.25.250.11
[greg@control ansible]$ curl http://node4
Welcome to node4 on 172.25.250.12
[greg@control ansible]curlhttp://node3Welcometonode3on172.25.250.11[greg@controlansible] curl http://node4 Welcome to node4 on 172.25.250.12
[greg@control ansible]$ curl http://node3
Welcome to node3 on 172.25.250.11
[greg@control ansible]$ curl http://node4
Welcome to node4 on 172.25.250.12

为了更接近评分流程,我们可以先重启 node3 和 node4 主机,之后再执行上面的验证操作。


荒原之梦网全部内容均为原创,提供了涵盖考研数学基础知识、考研数学真题、考研数学练习题和计算机科学等方面,大量精心研发的学习资源。

豫 ICP 备 17023611 号-1 | 公网安备 - 荒原之梦 豫公网安备 41142502000132 号 | SiteMap
Copyright © 2017-2024 ZhaoKaifeng.com 版权所有 All Rights Reserved.

Copyright © 2024   zhaokaifeng.com   All Rights Reserved.
豫ICP备17023611号-1
 豫公网安备41142502000132号

荒原之梦 自豪地采用WordPress