Linux RHCE解题方法

news2024/11/24 16:54:37

目录

安装和配置Ansible

创建和运行Ansible临时命令

安装软件包

使用RHEL系统角色

使用 Ansible Galaxy 安装角色

创建和使用角色

从 Ansible Galaxy 使用角色

创建和使用逻辑卷

生成主机文件

修改文件内容

创建 Web 内容目录

生成硬件报告

创建密码库

创建用户帐户

更新 Ansible 库的密钥


安装和配置Ansible

使用greg用户登录到控制节点control
ssh greg@control

下载ansible并查看ansible版本
sudo yum -y install ansible
ansible --version

创建anisble目录,并进入此目录
mkdir /home/greg/ansible
cd ansible/

创建资产清单
vim inventory
[dev]
node1
[test]
node2
[prod]
node3
node4
[balancers]
node5
[webservers:children]
prod

创建角色目录
mkdir roles

创建针对greg用户的ansible配置文件
cp /etc/ansible/ansible.cfg /home/greg/ansible/

修改配置文件
vim ansible.cfg
inventory = /home/greg/ansible/inventory           指定资产清单的路径
ask_pass = False                                   登陆被管理节点时不提示输入密码
roles_path = /home/greg/ansible/roles              指定角色存放路径
remote_user = greg                                 ansible远程管理使用的角色
[privilege_escalation]
become=True                    连接到被管理节点后自动在被管理主机上切换用户
become_method=sudo             在被管理节点通过sudo方式切换用户
become_user=root               在被管理节点切换到root用户
become_ask_pass=False          不提示输入密码

创建和运行Ansible临时命令

​创建shell脚本(通过yum_repository模块实现)
vim ~/ansible/adhoc.sh
#!/bin/bash
ansible all -m yum_repository -a "name=EX294_BASE description='EX294 base software' baseurl=http://content/rhel8.0/x86_64/dvd/BaseOS gpgcheck=yes gpgkey=http://content/rhel8.0/x86_64/dvd/RPM-GPG-KEY-redhat-release enabled=yes"
ansible all -m yum_repository -a "name=EX294_STREAM description='EX294 stream software' baseurl=http://content/rhel8.0/x86_64/dvd/AppStream gpgcheck=yes gpgkey=http://content/rhel8.0/x86_64/dvd/RPM-GPG-KEY-redhat-release enabled=yes"

执行脚本
chmod a+x adhoc.sh
./adhoc.sh

在被管理节点导入密钥
ansible all -m shell -a "rpm --import http://content/rhel8.0/x86_64/dvd/RPM-GPG-KEY-redhat-release"

验证任务执行结果
ansible all -m shell -a "yum -y repolist all”

安装软件包

创建剧本
vim /home/greg/ansible/packages.yml
---
  - name: yum install
    hosts: dev,test,prod
    tasks:
      - name: php,mariadb
        yum:
          name: php,mariadb
          state: present   

      - name: RPM Development Tools
        yum:
          name: '@RPM Development Tools'
          state: present
        when: inventory_hostname in groups['dev']

      - name: update
        yum:
          name: '*'
          state: latest
        when: inventory_hostname in groups['dev']

验证剧本语法格式并执行剧本
ansible-playbook --syntax-check packages.yml
ansible-playbook packages.yml

验证任务执行结果
ansible -m shell dev,test,prod -a "yum -y info php"
ansible -m shell dev,test,prod -a "yum -y info mariadb"
ansible dev -m shell -a "yum -y grouplist | grep -i installed
ansible dev -m shell -a "yum update"

使用RHEL系统角色

​安装系统角色软件包
sudo yum -y install rhel-system-roles.noarch

将系统角色timesync复制到角色路径下,并改名
cp -av /usr/share/ansible/roles/rhel-system-roles.timesync /home/greg/ansible/roles/
mv rhel-system-roles.timesync timesync

调用timesync.yml角色(可以参考timesync角色的README.md 文件)
vim /home/greg/ansible/timesync.yml
- hosts: all
  vars:
    timesync_ntp_servers:
      - hostname: 172.25.254.254
        iburst: yes
  roles:
    - timesync

验证剧本语法格式并执行剧本
ansible-playbook --syntax-check timesync.yml
ansible-playbook timesync.yml

验证任务执行结果
ansible all -a 'chronyc sources -v'
ansible all -m shell -a "timedatectl"

使用 Ansible Galaxy 安装角色

定义角色文件
vim /home/greg/ansible/roles/requirements.yml
---
  - src: http://materials/haproxy.tar
    name: balancer
  - src: http://materials/phpinfo.tar
    name: phpinfo

下载角色
cd ~/ansible/roles/
ansible-galaxy install -r requirements.yml -p /home/greg/ansible/roles/

验证任务执行结果
ansible-galaxy list        查看所有角色

创建和使用角色

创建角色
cd ~/ansible/roles/
ansible-galaxy init apache

定义index.html.j2模板
vim apache/templates/ index.html.j2
Welcome to {{ ansible_facts[‘fqdn’] }} on {{ ansible_facts[‘default_ipv4’].[‘address’] }}

定义角色任务
vim apache/tasks/main.yml
---
# tasks file for apache
  - name: yum httpd
    yum:
      name: httpd
      state: present

  - name: index.htmp
    template:
      src: index.html.j2
      dest: /var/www/html/index.html
      setype: httpd_sys_content_t

  - name: service httpd
    service:
      name: httpd
      state: started
      enabled: yes

  - name: service firewall
    service:
      name: firewalld
      state: started
      enabled: yes

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

在webservers主机组中使用apache角色
vim ~/ansible/apache.yml
---
  - hosts: webservers
    roles:
      - apache

验证剧本语法格式并执行剧本
ansible-playbook --syntax-check apache.yml
ansible-playbook apache.yml

验证任务执行结果
curl -l http://node3
curl -l http://node4

从 Ansible Galaxy 使用角色

创建剧本任务
vim ~/ansible/roles.yml
---
- name: balancer
  hosts: all
  roles:
    - role: balancer
      when: inventory_hostname in groups.balancers

- name: phpinfo
  hosts: webservers
  roles:
    - phpinfo

验证剧本语法格式并执行剧本
ansible-playbook --syntax-check roles.yml
ansible-playbook roles.yml

验证任务执行结果
curl -l http://node5(多次输入)      验证负载是否成功
浏览器访问http://node4/hello.php和http://node3/hello.php

创建和使用逻辑卷

创建剧本任务
vim /home/greg/ansible/lv.yml
---
  - name: extent lv
    hosts: all
    tasks:
        - name: research not defined
          debug:
            msg: "Volume group done not exist"
          when: ansible_facts.lvm.vgs.research is not defined
          failed_when: ansible_facts.lvm.vgs.research is not defined

        - name: create lv
          block:
            - name: 1500m
              lvol:
                vg: research
                lv: data
                size: 1500m
          rescue:
            - name: show
              debug:
                msg: "Could not create logical volume of that size"
            - name: 800m
              lvol:
                vg: research
                lv: data
                size: 800m
          always:
            - name: file
              filesystem:
                  fstype: ext4
                  dev: /dev/research/data

验证剧本语法格式并执行剧本
ansible-playbook --syntax-check lv.yml
ansible-playbook lv.yml

验证任务执行结果
ansible all -m shell -a "lsblk -f"

生成主机文件

下载模板文件
cd ~/ansible/
wget http://materials/hosts.j2

修改模板
vim hosts.j2
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6

{% for host in groups['all'] %}
{{ hostvars[host]['ansible_facts']['default_ipv4']['address'] }}  {{ hostvars[host]['ansible_facts']['fqdn'] }} {{ hostvars[host]['ansible_facts']['hostname'] }} 
{% endfor %}

创建剧本任务
vim /home/greg/ansible/hosts.yml
---
  - name: hosts
    hosts: all
    tasks:
      - name: template
        template:
            src: hosts.j2
            dest: /etc/myhosts
        when: inventory_hostname in groups['dev']

验证剧本语法格式并执行剧本
ansible-playbook --syntax-check hosts.yml
ansible-playbook hosts.yml

验证任务执行结果
ansible dev -m shell -a "cat /etc/myhosts"

修改文件内容

创建剧本任务
vim /home/greg/ansible/issue.yml
---
  - name: resive issud
    hosts: all
    tasks:
        - name: dev
          copy:
            content: 'Development'
            dest: /etc/issue
          when: inventory_hostname in groups['dev']

        - name: test
          copy:
            content: 'Test'
            dest: /etc/issue
          when: inventory_hostname in groups['test']

        - name: prod
          copy:
            content: 'Production'
            dest: /etc/issue
          when: inventory_hostname in groups['prod']

验证剧本语法格式并执行剧本
ansible-playbook --syntax-check issue.yml
ansible-playbook issue.yml

验证任务执行结果
ansible dev -m shell -a 'cat /etc/issue'
ansible test -m shell -a 'cat /etc/issue'
ansible prod -m shell -a 'cat /etc/issue'

创建 Web 内容目录

创建剧本任务
vim /home/greg/ansible/webcontent.yml
---
  - name: web
    hosts: dev
    roles:
      - apache

  - name: create web content
    hosts: dev
    tasks:
        - name: group
          group:
            name: webdev
            state: present

        - name: mkdir /webdev
          file:
            path: /webdev
            state: directory
            group: webdev
            mode: '2775'
            setype: httpd_sys_content_t

        - name: create index.html
          copy:
            content: 'Development'
            dest: /webdev/index.html
            setype: httpd_sys_content_t

        - name: link
          file:
            src: /webdev
            dest: /var/www/html/webdev
            state: link

验证剧本语法格式并执行剧本
ansible-playbook --syntax-check webcontent.yml
ansible-playbook webcontent.yml

验证任务执行结果
ansible dev -m shell -a "cat /etc/group | grep -i webdev"     查看webdev组是否创建
ansible dev -m shell -a "ls -ldZ /webdev"                查看webdev目录的权限和安全上下文
ansible dev -m shell -a "ls -alt /var/www/html"          查看链接文件是否成功
curl -l http://node1/webdev/

生成硬件报告

创建剧本任务
vim /home/greg/ansible/hwreport.yml
---
  - name: hwreport.yml
    hosts: all
    tasks:
        - name: wget
          get_url:
            url: http://materials/hwreport.empty
            dest: /root/hwreport.txt

        - name: hostname
          lineinfile:
            path: /root/hwreport.txt
            regexp: "^HOST=inventoryhostname"
            line: "HOST={{ ansible_facts['hostname'] }}"

        - name: MB
          lineinfile:
            path: /root/hwreport.txt
            regexp: "^MEMORY=memory_in_MB"
            line: "MEMORY={{ ansible_facts['memtotal_mb'] }}"

        - name: bios
          lineinfile:
            path: /root/hwreport.txt
            regexp: "^BIOS=BIOS_version"
            line: "BIOS={{ ansible_facts['bios_version'] }}"

        - name: vda defined
          lineinfile:
            path: /root/hwreport.txt
            regexp: "DISK_SIZE_VDA=disk_vda_size"
            line: "DISK_SIZE_VDA={{ ansible_facts['devices']['vda']['size'] }}"
          when: ansible_facts['devices']['vda']['size'] is defined

        - name: vda not defined
          lineinfile:
            path: /root/hwreport.txt
            regexp: "DISK_SIZE_VDA=disk_vda_size"
            line: "DISK_SIZE_VDA=NONE"
          when: ansible_facts['devices']['vda']['size'] is not defined

        - name: vdb defined
          lineinfile:
            path: /root/hwreport.txt
            regexp: "DISK_SIZE_VDB=disk_vdb_size"
            line: "DISK_SIZE_VDB={{ ansible_facts['devices']['vdb']['size'] }}"
          when: ansible_facts['devices']['vdb']['size'] is defined

        - name: vdb not defined
          lineinfile:
            path: /root/hwreport.txt
            regexp: "DISK_SIZE_VDB=disk_vdb_size"
            line: "DISK_SIZE_VDB=NONE"
          when: ansible_facts['devices']['vdb']['size'] is not defined

验证剧本语法格式并执行剧本
ansible-playbook --syntax-check hwreport.yml
ansible-playbook hwreport.yml

验证任务执行结果
ansible all -m shell -a "cat /root/hwreport.txt"

创建密码库

创建存储用户密码的yml文件
vim /home/greg/ansible/locker.yml
---
pw_developer: Imadev
pw_manger: Imamgr

创建加密和解密的密码文件
echo "whenyouwishuponastar" > ~/ansible/secret.txt

配置ansible配置文件定义密码文件路径
vault_password_file = /home/greg/ansible/secret.txt

加密locker.yml文件
ansible-vault encrypt locker.yml

验证任务执行结果
ansible-vault view locker.yml  查看加密文件

创建用户帐户

用户列表的内容

下载要创建的用户列表
cd ~/ansible
wget http://materials/user_list.yml

创建剧本任务
vim ~/ansible/users.yml
---
  - name: user
    hosts: dev,test,prod
    vars_files:
        - /home/greg/ansible/user_list.yml
        - /home/greg/ansible/locker.yml
    tasks:
        - name: group
          group:
            name: devops
            state: present
          when: inventory_hostname in groups['dev'] or inventory_hostname in groups['test']

        - name: group2
          group:
            name: opsmgr
            state: present
          when: inventory_hostname in groups['prod']

        - name: user dev test
          user:
            name: "{{ item.name }}"
            comment: "{{ item.job }}"
            groups: devops
            password: "{{ pw_developer | password_hash('sha512') }}"
            append: yes
          loop: "{{ users }}"
          when: (inventory_hostname in groups['dev'] or inventory_hostname in groups['test']) and item.job == "developer"

        - name: user prod
          user:
            name: "{{ item.name }}"
            comment: "{{ item.job }}"
            groups: opsmgr
            password: "{{ pw_manager | password_hash('sha512') }}"
            append: yes
          loop: "{{ users }}"
          when: inventory_hostname in groups['prod'] and item.job == "manager"

验证剧本语法格式并执行剧本
ansible-playbook --syntax-check users.yml
ansible-playbook users.yml

验证任务执行结果
ansible all -m shell -a "tail -3 /etc/group"
ansible all -m shell -a "tail -3 /etc/passwd"
ansible all -m shell -a "tail -3 /etc/shadow"

更新 Ansible 库的密钥

下载文件
cd ~/ansible/
wget http://materials/salaries.yml

注释密码文件的路径
vim ansible.cfg
#vault_password_file = /home/greg/ansible/secrect.txt

更改文件密码
ansible-vault rekey salaries.yml

取消注释密码文件的路径
vim ansible.cfg
vault_password_file = /home/greg/ansible/secrect.txt

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/477023.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C++中stringstream类详解

本文主要介绍 C 编程语言中 stringstream 类的相关知识&#xff0c;同时通过示例代码介绍 stringstream 类的使用方法。 1 概述 <sstream> 定义了三个类&#xff1a;istringstream、ostringstream 和 stringstream&#xff0c;分别用来进行流的输入、输出和输入输出操作…

快速傅里叶变换FFT学习笔记

点值表示法 我们正常表示一个多项式的方式&#xff0c;形如 A ( x ) a 0 a 1 x a 2 x 2 . . . a n x n A(x)a_0a_1xa_2x^2...a_nx^n A(x)a0​a1​xa2​x2...an​xn&#xff0c;这是正常人容易看懂的&#xff0c;但是&#xff0c;我们还有一种表示法。 我们知道&#xf…

java结束当前循环

在 Java中&#xff0c;当我们要结束一个循环时&#xff0c;通常会使用循环变量的实现类来结束&#xff0c;但在实际开发中&#xff0c;我们经常会遇到某个循环结束后需要进行其他的操作的情况。此时&#xff0c;就需要使用循环变量来结束当前循环。 1、创建一个新的类&#xff…

数据结构_双链表、循环链表、静态链表

目录 1. 双链表 1.1 双链表的初始化 1.2 双链表的插入操作 1.3 双链表的删除操作 1.4 双链表的遍历 2. 循环链表 2.1 循环单链表 2.2 循环双链表 3. 静态链表 4. 顺序表和链表的比较 5. 相关练习 1. 双链表 单链表结点中只有一个指向其后继的指针&#xff0c;使得单…

电子电气架构——车辆E/E架构软硬件解耦

我是穿拖鞋的汉子,魔都中坚持长期主义的工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 人只有在举棋不定,无从把握的时候才感到疲惫。只有去行动就能获得解放,哪怕做的不好也比无所作为强! 本文主要介绍车辆E/E架构常识,主要涉及内容是行业最…

Python实现LBP纹理提取

1、什么是LBP纹理特征&#xff1f; LBP&#xff08;Local Binary Patterns&#xff0c;局部二值模式&#xff09;是提取局部特征作为判别依据的&#xff0c;一种有效的纹理描述算子&#xff0c;度量和提取图像局部的纹理信息。它具有旋转不变性和灰度不变性等显著的优点&#…

uniapp中使用vuex(解决uniapp无法在data和template中获取vuex数据问题)

uniapp中使用vuex&#xff08;解决uniapp无法在data和template中获取vuex数据问题&#xff09; 1. uniapp中引入vuex2. uniapp中使用vuex3. 解决uniapp无法在data和template中获取vuex数据问题 1. uniapp中引入vuex 1 .在根目录下新建文件夹store,在此目录下新建index.js文件&…

第五章——动态规划3

蒙德里安的梦想 我们在黑框内横着放红框&#xff0c;我们发现当横向小方格摆好之后&#xff0c;纵向小方格只能一次纵向摆好&#xff0c;即纵向小方格只有一种方案&#xff0c;即整个摆放小方格的方案数等于横着摆放小方格的方案数 f[i,j]表示的是现在要在第i列摆&#xff0c;j…

代码随想录Day64(一刷完结)

今天学习单调栈解决最后一道题 84.柱状图中的最大矩形 给定 n 个非负整数&#xff0c;用来表示柱状图中各个柱子的高度。每个柱子彼此相邻&#xff0c;且宽度为 1 。 求在该柱状图中&#xff0c;能够勾勒出来的矩形的最大面积。 示例 1: 输入&#xff1a;heights [2,1,5,6,…

C++中的list容器

文章目录 list的介绍list的使用list的构造list iterator的使用list capacitylist元素访问list modifierslist的迭代器失效 list与vector的对比 list的介绍 list是可以在常数范围内的任意位置进行插入和删除的序列式容器&#xff0c;并且该容器可以前后双向迭代&#xff1b;   …

FFMPEG中的filter使用二

上一篇我们在使用滤镜时是手动创建各种滤镜&#xff0c;然后根据处理链路手动链接不同的过滤器&#xff0c;有助于我们理解滤镜的流程。这一篇我们使用参数形式&#xff0c;让ffmpeg自动帮我们创建和链接过滤器&#xff0c;这样可以减少代码量&#xff0c;同时我们可以先使用参…

学系统集成项目管理工程师(中项)系列15_质量管理

1. 质量&#xff08;Quality&#xff09;的定义 1.1. 反应实体满足主体明确和隐含需求的能力的特性总和 1.2. 明确需求是指在标准、规范、图样、技术要求、合同和其他文件中用户明确提出的要求与需要 1.3. 隐含需求是指用户和社会通过市场调研对实体的期望以及公认的、不必明…

thinkphp路由,请求和响应

文章目录 定义获取路由后面的参数跨域请求请求响应 定义 thinkphp定义路由一般在route路由下的app.php中 下面这是一个简单的路由 Route::rule(admin/login,/app/controller/Admin/login)->middleware(\app\middleware\MyMiddleware::class);该路由表示当访问admin/login时…

人工智能课程笔记(7)强化学习(基本概念 Q学习 深度强化学习 附有大量例题)

文章目录 1.强化学习与深度学习的区别2.强化学习中的基本概念3.强化学习、有监督学习和无监督学习的区别4.强化学习的特点5.离散马尔可夫过程6.马尔可夫奖励过程7.马尔可夫决策过程8.策略学习8.1.策略学习概念8.2.策略评估与贝尔曼方程 9.强化学习的最优策略求解10.基于价值的强…

K8s基础1——发展起源、资源对象、集群架构

文章目录 一、发展起源二、资源对象2.1 集群类2.2 应用类2.3 存储类2.4 安全类 三、集群架构 一、发展起源 K8s官方文档 K8s怎么来的&#xff1f; 十几年来&#xff0c;谷歌内部使用的大规模集群管理系统是Brog&#xff0c;基于容器技术实现了资源管理的自动化和跨多个数据中心…

基于Python的连锁超市收银系统的开发与研究_kaic

基于Python的连锁超市收银系统的开发与研究 摘要&#xff1a;近几年来&#xff0c;国内的连锁超市收银系统也在不断的发展与完善&#xff0c;超市收银系统是一个超市管理的核心&#xff0c;他决定了超市的安全性。目前&#xff0c;大大小小的超市基本上由传统的人工管理逐渐过渡…

IT 面试手册 - 序

IT 面试手册 - 序 前言 首先&#xff0c;感谢你阅读我的文章。作为在计算机互联网行业摸爬滚打近十载的半个过来人&#xff0c;在这里分享一些关于求职面试和自我提升的心得感悟&#xff0c;希望能够给你一些启发。 背景 对于 IT 从业者来说&#xff0c;当今这个时代&#x…

Docker的四种网络模式

1.Host 模式 通常来讲&#xff0c;启动新的Docker容器&#xff0c;都会分配独立的Network Namespace隔离子系统&#xff0c;如果在运行是指定为host模式&#xff0c;那么Docker容器将不会获得一个独立的Network Namespace&#xff0c;而是和宿主机共用一个Network Namespace子…

计算机网络知识复习

目录 TCP/IP协议群做了哪些事情&#xff1f; TCP协议为什么是3次握手&#xff0c;4次挥手&#xff1f; 如果网络延迟是30ms&#xff0c;那么Ping(基于UDP的)一个网站需要多少ms&#xff1f; 如果请求一个HTTP协议的网站&#xff0c;TTFB至少ms&#xff1f; CDN更换图片&am…

WeakMap 与 WeakSet

WeakSet WeakSet 结构与 Set 类似&#xff0c;也是不重复的值的集合。 成员都是数组和类似数组的对象&#xff0c;WeakSet 的成员只能是对象&#xff0c;而不能是其他类型的值。 若调用 add() 方法时传入了非数组和类似数组的对象的参数&#xff0c;就会抛出错误。 const b …