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

RHCS认证-Linux(RHel9)-Ansible

文章目录

  • 一、ansible 简介
  • 二 、ansible部署
  • 三、ansible服务端测试
  • 四 、ansible 清单inventory
  • 五、Ad-hot 点对点模式
  • 六、YAML语言模式
  • 七、RHCS-Ansible
    • 附:安装CentOS-Stream 9系统
    • 7.1 ansible 执行过程
    • 7.2 安装ansible,ansible-navigator
    • 7.2 部署ansible
    • 7.3 ansible-navigator
    • 7.4 YAML
    • 7.5 管理变量和事实
    • 7.6 管理机密
    • 7.7 管理事实
    • 7.8 实施任务控制
      • 循环使用变量
      • 有条件的运行任务
      • 处理程序handlers
      • 错误处理
    • 7.9 管理复杂的playbook
      • 创建角色
  • 八.训练题
    • 1. 安装和配置 Ansible安装ansible
    • 2. 配置系统以使用默认存储库
    • 3. 安装软件包
    • 4. 配置collection
    • 5.使用 RHEL 系统角色
    • 6.使用 Ansible Galaxy 安装角色
    • 7. 创建和使用角色
    • 8.从 Ansible Galaxy 使用角色
    • 9.创建和使用分区
    • 10. 生成主机文件
    • 11. 修改文件内容
    • 12. 创建 Web 内容目录
    • 13. 生成硬件报告
    • 14. 创建密码库
    • 15. 创建用户帐户

一、ansible 简介

Ansible是一种基于Python开发的自动化运维工具,集成了多种运维工具的优点,主要用于批量系统配置、程序部署和运行命令等任务。它的核心在于提供一个简单易用且功能强大的框架,通过SSH协议与远程主机通信,无需在被管节点上安装客户端。

Ansible由红帽公司收购,并逐渐成为运维工程师必备的技能之一。该工具具有以下特点:

  1. 部署简单:只需在主控端部署Ansible环境,被控端无需做任何
  2. 操作。 默认使用SSH协议:对设备进行管理,保障通信安全。
    功能模块丰富:拥有大量常规运维操作模块,可实现日常绝大部分操作。
  3. 支持Playbooks:通过定义多个任务的YAML文件来定制配置和状态管理。
  4. 轻量级:无需在客户端安装agent,更新时只需在操作机上进行一次更新即可。

在这里插入图片描述在这里插入图片描述

在这里插入图片描述

Ansible命令的执行过程包括加载配置文件和模块文件、生成并传输临时Python文件、在远程服务器上执行命令、返回结果并删除临时文件。
以下是详细的步骤:

  1. 加载配置文件:Ansible首先会加载配置文件,通常为ansible.cfg,这个文件包含了Ansible运行的各种参数和设置。

  2. 加载模块文件:根据使用的具体模块(如command、shell等),加载相应的模块文件。这些模块定义了要在远程服务器上执行的具体操作。

  3. 生成传输临时Python文件:Ansible将模块或命令生成一个临时的Python(.py)文件,并通过SSH传输到远程服务器的$HOME/.ansible/tmp/ansible-tmp-数字/XXX.PY文件中。

  4. 执行命令:Ansible给临时文件添加执行权限,然后在远程服务器上执行这个临时文件,具体命令通过nohup方式在后台运行,确保即使SSH连接断开,命令也能继续执行。

  5. 返回结果:命令执行完成后,结果会被传回Ansible主控端,同时输出到终端或保存到指定文件中。

  6. 删除临时文件:为了安全性,执行完成后,临时Python文件会被删除

ansible 工作机制

在这里插入图片描述

二 、ansible部署

# 下载yum源
wget -O /etc/yum.repos.d/CentOS-7.repo http://mirrors.aliyun.com/repo/Centos-7.repo
# 安装epel-release源
yum install -y epel-release
# 搜索ansible
yum list |grep ansible
# 安装ansible
dnf install ansible
# 验证安装
rpm -ql ansible
rpm -qc ansible
#ansible所有模块
ansible-doc -l 
#yum模块
ansible-doc -s yum

三、ansible服务端测试

# 测试 Ansible 是否能成功连接到本地主机(localhost)
# -m ping 模块 主机是否在线
ansible localhost -m ping
.........
localhost | SUCCESS => {"changed": false,"ping": "pong"
}
.........
# 定义主机清单
vim /etc/ansible/hosts
.........43 ## db-[99:101]-node.example.com44 centos245 centos3
.........ssh-keygen
ssh-copy-id centos2
# 测试连通性
#可提前测试ssh
ansible centos2 -m ping
ansible centos3 -m ping
ansible centos5 -m ping

在这里插入图片描述

四 、ansible 清单inventory

#查找配置
ansible --version
.........
#ansible 2.9.27
#  config file = /etc/ansible/ansible.cfg
.........  
# 查找包
rpm -qf /etc/ansible/ansible.cfg
.........  
# ansible-2.9.27-1.el7.noarch
.........  
#查找配置
rpm -qc ansible-2.9.27-1.el7.noarch
.........  
#/etc/ansible/ansible.cfg
#/etc/ansible/hosts
.........  
# 具体配置
vim /etc/ansible/ansible.cfg
.........  #10 [defaults]#11#12 # some basic default values...#13#14 #inventory      = /etc/ansible/hosts
.........  
vim /etc/ansible/hosts
# 增加主机组
ansible webserver -m ping
.........44 [webserver]45 centos246 centos3.........
#增加账号密码
.........45 centos2  ansible_ssh_user="root" ansible_ssh_pass="redhat".........#增加端口#centos2 vim /etc/ssh/sshd_config 修改端口 port 2222.........45 centos2  ansible_ssh_user="root" ansible_ssh_pass="redhat" ansible_ssh_port="2222".........
# 组变量.........44 [webserver]45 centos246 centos34748 [webserver:vars]  # 注意是vars 且需换行49 ansible_ssh_user="root"50 ansible_ssh_pass="redhat"51 ansible_ssh_port="22".........# 子分组.........44 [webserver1]45 centos246 centos34748 [webserver2]49 centos55051 [webserver:children]52 webserver153 webserver25455 [webserver:vars]56 ansible_ssh_user="root"57 ansible_ssh_pass="redhat"58 ansible_ssh_port="22".........# 自定义主机清单,可以不使用/etc/ansible/hosts
ansible -i hosts webserver -m ping

五、Ad-hot 点对点模式

Ad-hot 点对点模式是Ansible一种便捷的任务执行方式,适用于临时性操作和快速命令执行

# 多少个模块
ansible-doc -l |wc -l
.......
7736#或89 安装的ansible-core 7736社区版
.......
# 使用copy模块
ansible-doc copy
ansible webserver -m copy -a 'src=/etc/hosts dest=/tmp/copy.txt mode=777 backup=yes'
# 用户模块
ansible-doc user
##创建用户
ansible webserver -m user -a 'name=lih state=present'
#软件包管理yum或dnf
##安装http
ansible webserver -m dnf -a "name=httpd state=latest enabled=yes"
#服务 
##启动服务
ansible webserver  -m service -a "name=httpd state=started enable=yes"
# 文件模块
## 创建文件
ansible webserver  -m file -a "path=/tmp/addfile.txt mode=777 state=touch"
## 创建文件夹
ansible webserver  -m file -a "path=/tmp/addd mode=777 state=directory"
# 收集模块
ansible webserver -m setup
##收集IP
ansible webserver -m setup -a "filter=ansible_all_ipv4_addresses"
# fetch(获取)
ansible centos2 -m fetch -a "src=/tmp/fetch.txt dest=/root/"
.........#测试结果多了层centos2目录
[root@centos1 tmp]# cat /root/centos2/tmp/fetch.txt
2020202020202020202020202020202020202020
.........
# script(shell脚本)
ansible centos2 -m script -a "/root/addtime.sh"
.........
[root@centos1 ~]# cat addtime.sh
date > /tmp/time.txt
.........

六、YAML语言模式

vim apache.yaml
.........
- hosts: centos2 # 冒号空格 减号空格tasks:- name: installyum: name=httpd state=present  #yum 和name对齐- name: serviceservice: name=httpd state=started
.........#检查语法
ansible-playbook apache.yaml --syntax-check
#列出任务
ansible-playbook apache.yaml --list-task
#列出主机
ansible-playbook apache.yaml --list-host
#执行
ansible-playbook apache.yaml

在这里插入图片描述

七、RHCS-Ansible

红帽推出的Ansible自动化平台2。这是红帽针对混合云自动化的新标准,旨在优化不断演变的混合云大规模计算,并引入了自足式自动化功能,将自动化更深入地转移到应用开发生命周期中

在这里插入图片描述在这里插入图片描述

附:安装CentOS-Stream 9系统

CentOS,是基于Red Hat Linux提供的可自由使用源代码的企业级Linux发行版本;是一个稳定,可预测,可管理和可复制的免费企业级计算平台。 下载地址: https://mirrors.aliyun.com/centos/

安装VMware workstion 17或以上本
下载CentOS-Stream9镜像:

官网:https://mirror.stream.centos.org/9-stream/BaseOS/x86_64/iso/
阿里云:https://mirrors.aliyun.com/centos-stream/9-stream/BaseOS/x86_64/iso/
清华:https://mirrors.tuna.tsinghua.edu.cn/centos-stream/9-stream/BaseOS/x86_64/iso/
#[ ]CentOS-Stream-9-20240724.0-x86_64-dvd1.iso  11G# ubuntu下载
https://releases.ubuntu.com/18.04.6/
vim /etc/yum.repos.d/ansible.repo
.........
[ansible]
name=ansible
baseurl=https://mirrors.aliyun.com/epel/9/Everything/x86_64/
enabled=1
gpgcheck=0
.........

部暑Ansible环境

# 1.1准备三台主机 CentOS Stream 9   
control.lab.example.com  192.168.10.91   控制主机 
node1.lab.example.com    192.168.10.92   被控制主机  
node2.lab.example.com    192.168.10.93   被控制主机 

2)配置所有主机允许root ssh登录

vim /etc/ssh/sshd_config #PermitRootLogin yes
systemctl restart sshd

3)在管理机实现免密

ssh-keygen
ssh-copy-id root@192.168.10.92
ssh-copy-id root@192.168.10.93

)定义inventory,主要清单,主机分组

vim /etc/ansible/hosts
[servers]
192.168.10.92
192.168.10.93

)修改配置文件

# 可默认不修改
vim /etc/ansible/ansible.cfg
[defaults]
inventory  = /etc/ansible/hosts
remote_user = root
host_key_checking = False

测试

ansible servers -m ping 

在这里插入图片描述

ansible-navigator

pip config set global.index-url https://mirrors.aliyun.com/pypi/simple/ 
pip install ansible-navigator 
ansible-navigator

在这里插入图片描述

podman images

在这里插入图片描述

ansible-navigator config list

7.1 ansible 执行过程

> 加载自己的配置文件,默认/etc/ansible/ansible.cfg; 
> 查找对应的主机配置文件,找到要执行的主机或者组;
> 加载自己对应的模块文件,如 command; 
> 通过ansible将模块或命令生成对应的临时py文件(python脚本)> 并将该文件传输至远程服务器; 
> 对应执行用户的家目录的.ansible/tmp/XXX/XXX.PY文件;
> 给文件 +x 执行权限;
> 执行并返回结果; 删除临时py文件,sleep 0退出

简单理解就是Ansible在运行时,首先读取ansible.cfg中的配置,根据规则获取Inventory中的管理主机列表,并行的在这些主机中执行配置的任务,最后等待执行返回的结果

7.2 安装ansible,ansible-navigator

多次实践后,个人理解,ansible-navigator是ansible的升级,同一配置文件等,简单重整理一部分,其他重复部分可忽略。

在这里插入图片描述

在这里插入图片描述

[student@workstation ~]$ dnf search ansible
[root@workstation ~]'#' dnf install -y ansible-navigator.noarch ansible-core.x86_64
# 查询验证
ansible-navigator --version #显示Ansible Navigator工具的版本,该工具是Ansible Automation Platform的一部分,用于帮助开发者更方便地构建和测试Playbook
ansible --version #显示正在使用的Ansible核心程序的版本rpm -qc ansible-core
---
/etc/ansible/ansible.cfg # 配置文件
/etc/ansible/hosts # 清单文件
---# 容器配置
podman --versionvim .ansible-navigator.yml
---
ansible-navigator:execution-environment:image: utility.lab.example.com/ee-supported-rhel8:latestpull:policy: missing
---
# 配置镜像仓库vim /etc/containers/registries.conf
cat /etc/containers/registries.conf |grep -v ^# |grep -v ^$
---------#old
unqualified-search-registries = ["registry.fedoraproject.org",
"registry.access.redhat.com", "registry.centos.org", "quay.io", "docker.io"]
short-name-mode = "enforcing"
---------cat /etc/containers/registries.conf |grep -v ^#
---------#new
unqualified-search-registries = ["registry.lab.example.com"]
[[registry]]
insecure = true
blocked = false
location = "registry.lab.example.com"
---------vim /etc/hosts
podman images  #内容导航器使用默认的执行环境
ansible-navigator images  #显示本地可用镜像列表

在这里插入图片描述

podman images

在这里插入图片描述

ansible-navigator images

在这里插入图片描述

ansible-navigator collections

在这里插入图片描述

7.2 部署ansible

构建Ansible 清单
管理Ansible 配置文件
编写和运行playbook
实施多个play

>

系统默认清单文件
/etc/ansible/hosts:

vim /etc/ansible/hosts
---
servera
serverb
---
>  #验证清单 
ansible-navigator inventory -i /etc/ansible/hosts --list -m stdout
ansible-navigator inventory -i /etc/ansible/hosts --graph -m stdout

在这里插入图片描述
在这里插入图片描述在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
配置Ansible
ansible和ansible-navigator的配置文件

#ansible配置文件
which ansible # 文件
rpm -qf /bin/ansible # 安装包
rpm -qc ansible-core-2.13.0-2.el9ap.x86_64 #配置文件
vim /etc/ansible/ansible.cfg # 
ansible-config init --disabled > ansible.cfg#当前生成
vim /etc/ansible/ansible.cfg
.........
138 inventory=/home/lihui/inventory
.........
#其他命令
ansible ungrouped --list-hosts  #

7.3 ansible-navigator

在这里插入图片描述
在这里插入图片描述

#ansible-navigator配置文件
[student@workstation ~]$ cat ~/.ansible-navigator.yml
---
ansible-navigator:execution-environment:image: utility.lab.example.com/ee-supported-rhel8:latestpull:policy: missing
---
或程序生成yml配置
ansible-navigator settings --effective>/tmp/abc.ymlansible-navigator doc -l |wc -l
.........
118
.........

ansible 配置

ansible-config init --disabled > ansible.cfg#当前生成
vim /etc/ansible/ansible.cfg
.........
138 inventory=/home/lihui/inventory
.........
ansible --version #查配置文件
ansible all --list-host # ansible
ansible-navigator inventory -m stdout --graph #ansible-navigator #or list

在这里插入图片描述

# 搜索模块
ansible-navigator collections  -m stdout  |grep firewalld

7.4 YAML

在这里插入图片描述

部分基本案例ansible-playbook可参考章节六
ansible-navigator

调整Tab键缩进

在这里插入图片描述

# 帮助文档
# 查找ansible.posix.firewalld
ansible-navigator collections -m stdout |grep firewalld  ansible-navigator doc user -m stdout #查找:EXAMPLES
vim useradd.yml
........
- name: create userhosts: servertasks:- name: Add the user 'johnd' ansible.builtin.user:name: johndcomment: John Doeuid: 1040group: root
........
#语法检查
ansible-navigator run useradd.yml -m stdout --syntax-check
# 执行
ansible-navigator run useradd.yml
# 提高输出的详细程度
ansible-navigator run useradd.yml -m stdout -vvvv# v-vvvv
# 生产环境检查
ansible-navigator run useradd.yml -m stdout --check

在这里插入图片描述
同一yml文件中再增加play

# 查询控制节点上的模块列表==ansible软件自身带的核心模块
ansible-doc -l |grep dnf
#查询自动化执行环境中的模块列表=容器镜像中带来的模块列表
ansible-navigator doc -l |grep dnf
# 具体模块帮助和案例EXAMPLES
ansible-navigator doc ansible.builtin.dnf -m stdout
vim useradd.yml
.........
#在一个palybook中有多个靠左写的play
#play要有- name hosts tasks
#task要有- name 参数
---
- name: create userhosts: servertasks:- name: Add the user 'johnd' ansible.builtin.user:name: johndcomment: John Doeuid: 1040group: root- name: installhosts: servertasks:- name: Install the latest version of Apacheansible.builtin.dnf:name: httpdstate: latest#1.Ctrl+v  2.下箭头到(需移动的内容) 3.Shift+i 首行移动 4.Esc (其他行移动) #或 1.v 2.下箭头 3.Shift+>(整体移动) 4..(重复执行)u(撤回上次)
.........
# 语法检查
ansible-navigator run useradd.yml -m stdout --syntax-check
# 模拟执行
ansible-navigator run useradd.yml -m stdout --check
ansible-navigator run useradd.yml -m stdout

在这里插入图片描述

选择模块

在这里插入图片描述

7.5 管理变量和事实

变量作为第一个参数和第一个值存在,必须加双引号“{{ }}”

vars:变量定义

vim dnfvar.yml
.........
---
- name: dnf installhosts: servervars:- package: httpdtasks:- name: install {{package}}ansible.builtin.dnf:name: "{{package}}"state: present
.........

vars_file 变量定义

vim dnfvar.yml
........
---
- name: dnf installhosts: servervars_files:- /home/lihui/vars.ymltasks:- name: install {{package}}ansible.builtin.dnf:name: "{{package}}"state: present# 显示运行结果register: install_result # 存储本模块运行输出到变量中- debug:var: install_result........vim vars.yml
.........
package: ftp
........

清单中定义主机或组变量

# 清单中定义主机或组变量
vim inventory
.........
[server]
192.168.10.92 
centos93[server:vars]
package=ftp
.........

7.6 管理机密

在Ansible的使用过程中,经常会遇到处理敏感数据(如密码、密钥等)的情况。直接在剧本或角色中以明文形式存储这些敏感数据,不仅不安全,也不符合最佳实践。为解决这一问题,Ansible提供了一个名为Vault的功能

ansible-vault --help
# 创建加密文件
ansible-vault create sec1.txt
# 查看加密文件
ansible-vault view sec1.txt
# 编辑加密文件
ansible-vault edit sec1.txt
#修改密码
ansible-vault rekey sec1.txt
# 解密
ansible-vault decrypt  sec1.txt
# 查看为内容
cat sec1.txt
#加密
ansible-vault encrypt sec1.txt
#查看为加密后数字
cat sec1.txt#把密码放在文本文件中使用
echo 123456 >mima.txt
ansible-vault view sec1.txt --vault-id=mima.txt#配置文件中 配置文件密码
vim ansible.cfg
........
275 vault_password_file=/home/lihui/mimasec.txt
........
ansible-vault view sec1.txt

在这里插入图片描述

7.7 管理事实

# 临时命令ad-hoc方式收集事实
ansible server -m setup -a filter=*hostname*# 帮助文档 EXAMPLES
ansible-doc debug
.........
EXAMPLES
- name: Print return information from the previous taskansible.builtin.debug:var: resultverbosity: 2
..........# 查找var名称 var: ansible_all_ipv4_addresses
# 或ansible_default_ipv4.addresses
ansible server -m setup -a filter=*ipv4*
.........
192.168.10.92 | SUCCESS => {"ansible_facts": {"ansible_all_ipv4_addresses": ["192.168.10.92"],"ansible_default_ipv4": {"address": "192.168.10.92","alias": "ens32","broadcast": "192.168.10.255","gateway": "192.168.10.2","interface": "ens32","macaddress": "00:0c:29:af:ad:98","mtu": 1500,"netmask": "255.255.255.0","network": "192.168.10.0","prefix": "24","type": "ether"},"discovered_interpreter_python": "/usr/bin/python3"},"changed": false
}
.........# playbook 收集事实
vim fact.yml
.........
---
- name: facthosts: servertasks:- name: Print return information from the previous taskansible.builtin.debug:var: ansible_all_ipv4_addresses.........ansible dev -m debug -a 'var=inventory_hostname'

在这里插入图片描述
收集事实+魔法变量

vim debug.yml
---
- name:hosts: alltasks:- debug:var: hostvarsansible-navigator run debug.yml -m stdout >1.txt
或ansible all -m setup >1.txt
# 
vim 1.txt 

在这里插入图片描述

7.8 实施任务控制

在这里插入图片描述

循环使用变量

在这里插入图片描述
循环字典列表
在这里插入图片描述

# 循环案例
vim loop.yml
.........
---
- name: server loophosts: servervars:users:- name: jan1comment: tom1- name: jan2comment: tom2tasks:- name: server loopansible.builtin.user:name: "{{ item.name}}"comment: "{{item.comment}}"state: presentloop: "{{users}}"
.........
# 执行
ansible-navigator run loop.yml -m stdout
# 验证
ansible server -m shell -a 'tail /etc/passwd'

在这里插入图片描述

有条件的运行任务

when 判断对象是当前模块,和模块在同一下列层次

vim when.yml
.........
---
- name: server whenhosts: servertasks:- name: server whenansible.builtin.service:name: httpdstate: startedwhen: ansible_default_ipv4.address == "192.168.10.92"
.........
# 执行
ansible-navigator run when.yml -m stdout
# 检查
ansible server -m shell -a 'systemctl status httpd'

在这里插入图片描述
多个条件
在这里插入图片描述
循环和条件组合
在这里插入图片描述

处理程序handlers

.........
---
- name: changehosts: servertasks:- name: installansible.builtin.yum:name: httpdstate: latest- name: copyansible.builtin.copy:content: heiheicdest: /var/www/html/index.htmlnotify:- restart- name: startansible.builtin.service:name: httpdstate: startedhandlers:- name: restartansible.builtin.service:name: httpdstate: restarted
.........

在这里插入图片描述
在这里插入图片描述

错误处理

在这里插入图片描述
在这里插入图片描述

7.9 管理复杂的playbook

vim main.yml
---
- name: httphosts: node1tasks:- import_tasks: task/install_httpd.yml- import_tasks: task/start_httpd.ymlvim task/install_httpd.yml
---
- name: Install the latest version of Apacheansible.builtin.yum:name: httpdstate: latestvim task/start_httpd.yml 
---
- name: Make sure a service unit is runningansible.builtin.systemd:state: startedname: httpd

创建角色

#配置路径vim ansible.cfg 
#查看ansible-galaxy --helpansible-galaxy listansible-galaxy role --help
# 创建角色ansible-galaxy init roles/apachetree roles/apache/

在这里插入图片描述

vim roles/apache/tasks/main.yml
---
- name: Install httpansible.builtin.yum:name: httpdstate: latest
- name: Makeansible.builtin.systemd:state: startedname: httpd
- name: Createansible.builtin.template:src: jin2.j2       # templates 中dest: /var/www/html/index.htmlnotify: restart     # handers 中vim roles/apache/templates/jin2.j2
------
wecole to {{ ansible_default_ipv4.address }} and {{ ansible_hostname }} and {{ ansible_nodename }}
------vim roles/apache/handlers/main.yml
---
# handlers file for roles/apache
- name: restartansible.builtin.systemd:state: restartedname: httpdvim roles.yml
---
- name: install apachehosts: node1roles:- apache
#运行
ansible-navigator run roles.yml -m stdout
# 验证
curl localhost

在这里插入图片描述

八.训练题

1. 安装和配置 Ansible安装ansible

*$ sudo yum -y install ansible-core ansible-navigator
创建文件夹
*$ mkdir -p /home/greg/ansible/roles
切换工作目录
*$ cd /home/greg/ansible
拷贝配置文件
$ cat /etc/ansible/ansible.cfg
*$ ansible-config init --disabled > /home/greg/ansible/ansible.cfg
创建集合存储目录
*$ mkdir /home/greg/ansible/mycollection
编辑配置文件
*$ vim ansible.cfg
---------
[defaults]
## 配置文件中,按题要求修改,自最好建到同一文件ansible中
inventory = /home/greg/ansible/inventory
remote_user = greg
host_key_checking = False
vault_password_file = /home/greg/ansible/secret.txt
roles_path    = /home/greg/ansible/roles
collections_path=./mycollection/:.ansible/collections:/usr/share/ansible/collections
[privileg/ree_escalation]
become=True
---------*$ vim /home/greg/ansible/inventory
---------
[dev]
node1
[test]
node2
[prod]
node3
node4
[balancers]
node5
[webservers:children]
prod 
---------

2. 配置系统以使用默认存储库

---
- name: repositoryhosts: alltasks:- ansible.builtin.yum_repository:file: rhel  #file相同,会将配置放到相同repo中。name: EX294_BASEdescription: "EX294 base software"baseurl: http://content/rhel9.0/x86_64/dvd/BaseOSgpgcheck: yesgpgkey: http://content/rhel9.0/x86_64/dvd/RPM-GPG-KEY-redhat-releaseenabled: yes- ansible.builtin.yum_repository: file: rhelname: EX294_STREAMdescription: "EX294 stream software"baseurl: http://content/rhel9.0/x86_64/dvd/AppStreamgpgcheck: yesgpgkey: http://content/rhel9.0/x86_64/dvd/RPM-GPG-KEY-redhat-releaseenabled: yes

3. 安装软件包

# php` 和 `mariadb` 软件包安装到 
#`dev`、`test` 和 `prod` 主机组中的主机上
---
- name: play 1hosts: dev,test,prodtasks:- name: ensure a list of packages installedansible.builtin.yum:name: "{{ packages }}"vars:packages:- php- mariadb

4. 配置collection

配置 collection

  • http://classroom/materials/
    • redhat-insights-1.0.7.tar.gz
    • community-general-5.5.0.tar.gz
    • redhat-rhel_system_roles-1.19.3.tar.gz
  • 上面3个安装在/home/greg/ansible/mycollection目录中
$ vim requirements.yml
---------
---
collections:
- name: http://classroom/materials/redhat-insights-1.0.7.tar.gz
- name: http://classroom/materials/community-general-5.5.0.tar.gz
- name: http://classroom/materials/redhat-rhel_system_roles-1.19.3.tar.gz
---------
$ ansible-galaxy collection install \-r requirements.yml \-p /home/greg/ansible/mycollection

5.使用 RHEL 系统角色

#不安装角色包可以使用该条命令搜索
find ./mycollection/ -name  selinux-playbook.yml $ vim /home/greg/ansible/selinux.yml
---------
---
- hosts: allvars:selinux_policy: targetedselinux_state: enforcingroles:- redhat.rhel_system_roles.selinux 
---------

6.使用 Ansible Galaxy 安装角色

从URL 下载角色并安装到 /home/greg/ansible/roles

$ vim /home/greg/ansible/roles/requirements.yml
---------
---
- src: http://classroom/materials/haproxy.tarname: balancer
- src: http://classroom/materials/phpinfo.tarname: phpinfo
---------

7. 创建和使用角色

创建和使用角色

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

  • httpd 软件包已安装,设为在系统启动时启用启动

  • 防火墙已启用并正在运行,并使用允许访问 Web 服务器的规则

  • 模板文件 index.html.j2 已存在,用于创建具有以下输出的文件 /var/www/html/index.html

    Welcome to HOSTNAME on IPADDRESS
    

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

创建一个名为 /home/greg/ansible/apache.yml 的 playbook:

  • 该 play 在 webservers 主机组中的主机上运行并将使用 apache 角色
#生成在在指定的目录
$ ansible-galaxy role init \--init-path /home/greg/ansible/roles \apache
#查看
$ ansible-galaxy list
# 查看目录
tree main.yml
vim roles/apache/tasks/main.yml
---------
---
- name: Install the latest version of Apacheansible.builtin.yum:name: httpdstate: latest
- name: Start service httpd, if not startedansible.builtin.systemd:name: httpdstate: startedenabled: yes
- name: Start service firewalld, if not startedansible.builtin.systemd:name: firewalldstate: startedenabled: yes
#考试时先做第五题否则没有posix集合
- name: permit apacheansible.posix.firewalld:service: httppermanent: yesstate: enabledimmediate: yes
- name: j2ansible.builtin.template:
# path = roles/apache/templates/src: index.html.j2dest: /var/www/html/index.html# template 添加模板vim roles/apache/templates/index.html.j2
---------
Welcome to {{ ansible_nodename }} on {{ ansible_default_ipv4.address }}
---------
# 使用角色
vim /home/greg/ansible/apache.yml
---------
---
- name: 创建和使用角色hosts: webserversroles:- apache
---------
# 运行
ansible-navigator run apache.yml -m stdout

8.从 Ansible Galaxy 使用角色

 vim /home/greg/ansible/roles.yml---------
---
- name: 从 Ansible Galaxy 使用角色 1 hosts: webserversroles:- phpinfo- name: 从 Ansible Galaxy 使用角色 2hosts: balancersroles:- balancer
----------

9.创建和使用分区

创建一个名为 /home/greg/ansible/partition.yml的 playbook,它将在prod 主机上运行以执行下列任务:

  • 该playbook只有一个play

  • 在prod主机组中创建分区

  • vdd创建一个1500M主分区,分区号为1,格式化ext4,并挂载到/newpart

  • vde创建一个1500M主分区,分区号为1,格式化ext4,并挂载到/newpart10

  • 如果磁盘空间不够,给出如下提示信息

Could not create partition of that size
  • 改为创建800M分区
  • 如果vde不存在,应显示提示信息
this disk is not exist

vim /home/greg/ansible/partition.yml

---
- name: create and use partitionhosts: prodtasks:- block:- name: Create a partition with 1500mcommunity.general.parted:device: "{{ item }}"number: 1state: presentpart_end: 1500MiBloop:- /dev/vdd- /dev/vderescue:- name: report no 1500mansible.builtin.debug:msg: Could not create partition of that size- name: Create a partition with 800mcommunity.general.parted:device: "{{ item }}"number: 1state: presentpart_end: 800MiBloop:- /dev/vdd- /dev/vdeignore_errors: yesalways:- name: Create a ext4 filesystemcommunity.general.filesystem:fstype: ext4dev: "{{ item }}"loop:- /dev/vdd1- /dev/vde1ignore_errors: yes- name: Mount newpartansible.posix.mount:path: /newpartsrc: /dev/vdd1fstype: ext4state: mountedwhen: ansible_devices.vdd is defined- name: Mount newpart1ansible.posix.mount:path: /newpart10src: /dev/vde1fstype: ext4state: mountedwhen: ansible_devices.vde is defined- name: report no vdeansible.builtin.debug:msg: this disk is not existwhen: ansible_devices.vde is not defined

10. 生成主机文件

$ vim hosts.yml

---
- name: 生成主机文件hosts: all tasks:- name: Template a file to /etc/myhostsansible.builtin.template:src: /home/greg/ansible/hosts.j2dest: /etc/myhostswhen: inventory_hostname in groups.dev

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_default_ipv4.address }} {{ hostvars[host].ansible_nodename }} {{ hostvars[host].ansible_hostname }} 
{% endfor %}

11. 修改文件内容

按照下方所述,创建一个名为 /home/greg/ansible/issue.yml 的 playbook :

  • 该 playbook 将在所有清单主机上运行
  • 该 playbook 会将 /etc/issue 的内容替换为下方所示的一行文本:
    • dev 主机组中的主机上,这行文本显示 为:Development
    • test 主机组中的主机上,这行文本显示 为:Test
    • prod 主机组中的主机上,这行文本显示 : Production
---
- name: 修改文件内容hosts: alltasks:- name: Copy using inline content 1ansible.builtin.copy:content: 'Development'dest: /etc/issuewhen: inventory_hostname in groups.dev- name: Copy using inline content 2ansible.builtin.copy:content: 'Test'dest: /etc/issuewhen: inventory_hostname in groups.test- name: Copy using inline content 3ansible.builtin.copy:content: 'Production'dest: /etc/issuewhen: inventory_hostname in groups.prod

验证
ansible all -a ‘cat /etc/issue’

12. 创建 Web 内容目录

创建 Web 内容目录

按照下方所述,创建一个名为 /home/greg/ansible/webcontent.yml 的 playbook :

  • 该 playbook 在 dev 主机组中的受管节点上运行

  • 创建符合下列要求的目录/webdev

    • 所有者为 webdev
    • 具有常规权限:owner=read+write+execute, group=read+write+execute,other=read+execute
    • 具有特殊权限:设置组 ID
  • 用符号链接将 /var/www/html/webdev(链接文件) 链接到 /webdev(源文件)

  • 创建文件 /webdev/index.html ,其中包含如下所示的单行文件: Development

  • dev 主机组中主机上浏览此目录(例如 http://172.25.250.9/webdev/ )将生成以下输出:

    Development
    

vim /home/greg/ansible/webcontent.yml

---
- name: 创建 Web 内容目录hosts: dev
## 存在 httpd 服务;才存在主目录 /var/www/html
## 可以使用『角色』启动服务roles:- apachetasks:
## 可以使用『模块』启动服务
#  - name: Start service httpd, if not started
#    ansible.builtin.service:
#      name: httpd
#      state: started
#      enabled: yes- name: Create a directory if it does not existansible.builtin.file:path: /webdevstate: directorygroup: webdevmode: u=rwx,g=rwxs,o=rx
#     mode: '2775'- name: Create a symbolic linkansible.builtin.file:src: /webdevdest: /var/www/html/webdevstate: link- name: Copy using inline contentansible.builtin.copy:content: 'Development'dest: /webdev/index.htmlsetype: httpd_sys_content_t

13. 生成硬件报告

生成硬件报告

创建一个名为 /home/greg/ansible/hwreport.yml 的 playbook ,它将在所有受管节点上生成含有以下信息的输出文件 /root/hwreport.txt

  • xz
  • MB 表示的总内存大小
  • BIOS 版本
  • 磁盘设备 vda 的大小
  • 磁盘设备 vdb 的大小
  • 输出文件中的每一行含有一个 key=value 对

您的 playbook 应当:

  • http://classroom/materials/hwreport.empty 下载文件,并将它保存为 /root/hwreport.txt
  • 使用正确的值改为 /root/hwreport.txt
  • 如果硬件项不存在,相关的值应设为 NONE

搜索魔法变量、
$ ansible all -m setup > setup.txt
创建
vim /home/greg/ansible/hwreport.yml

name: 生成硬件报告
hosts: all 
tasks:- name: Download foo.confansible.builtin.get_url:url: http://materials/hwreport.emptydest: /root/hwreport.txt- name: Ensure 1ansible.builtin.lineinfile:path: /root/hwreport.txtregexp: '^HOST='line: HOST={{ inventory_hostname | default('admin', true) }}- name: Ensure 2ansible.builtin.lineinfile:path: /root/hwreport.txtregexp: '^MEMORY='line: MEMORY={{ ansible_memtotal_mb }}- name: Ensure 3ansible.builtin.lineinfile:path: /root/hwreport.txtregexp: '^BIOS='line: BIOS={{ ansible_bios_version }}- name: Ensure 4ansible.builtin.lineinfile:path: /root/hwreport.txtregexp: '^DISK_SIZE_VDA='line: DISK_SIZE_VDA={{ ansible_devices.vda.size }}- name: Ensure 5ansible.builtin.lineinfile:path: /root/hwreport.txtregexp: '^DISK_SIZE_VDB='line: DISK_SIZE_VDB={{ ansible_devices.vdb.size | default('NONE', true) }}

14. 创建密码库

创建密码库

按照下方所述,创建一个 Ansible 库来存储用户密码:

  • 库名称为 /home/greg/ansible/locker.yml
  • 库中含有两个变量,名称如下:
    • pw_developer,值为 Imadev
    • pw_manager,值为 Imamgr
  • 用于加密和解密该库的密码为 whenyouwishuponastar
    • 密码存储在文件 /home/greg/ansible/secret.txt

密码本
$ echo whenyouwishuponastar > /home/greg/ansible/secret.txt

$ vim ansible.cfg

...内容省略...
vault_password_file = /home/greg/ansible/secret.txt

ansible-vault create /home/greg/ansible/locker.yml

---
pw_developer: Imadev
pw_manager: Imamgr

查看内容
$ ansible-vault view /home/greg/ansible/locker.yml
内容无法查看
$ cat /home/greg/ansible/locker.yml

15. 创建用户帐户

创建用户帐户

  • http://classroom/materials/user_list.yml 下载要创建的用户的列表,并将它保存到 /home/greg/ansible
  • 在本次练习中使用在其他位置创建的密码库 /home/greg/ansible/locker.yml 。创建名为 /home/greg/ansible/users.yml 的 playbook ,从而按以下所述创建用户帐户:
    • 职位描述为 developer 的用户应当:
      • devtest 主机组中的受管节点上创建
      • pw_developer 变量分配密码
      • 密码最大有效期30
      • 是补充组 devops 的成员
    • 职位描述为 manager 的用户应当:
      • prod 主机组中的受管节点上创建
      • pw_manager 变量分配密码
      • 密码最大有效期30
      • 是补充组 opsmgr 的成员
  • 密码采用 sha512 哈希格式。
  • 您的 playbook 应能够在本次练习中使用在其他位置创建的库密码文件 /home/greg/ansible/secret.txt 正常运行。
---
- name: 创建用户帐户 1hosts: dev,testvars_files:- /home/greg/ansible/locker.yml- /home/greg/ansible/user_list.ymltasks:- name: Ensure group 1ansible.builtin.group:name: devopsstate: present- name: Add the user 1ansible.builtin.user:name: "{{ item.name }}"groups: devopspassword: "{{ pw_developer | password_hash('sha512') }}"password_expire_max: "{{ item.password_expire_max }}"loop: "{{ users }}"when: item.job == 'developer'- name: 创建用户帐户 2hosts: prodvars_files:- /home/greg/ansible/locker.yml- /home/greg/ansible/user_list.ymltasks:- name: Ensure group 2ansible.builtin.group:name: opsmgrstate: present- name: Add the user 2ansible.builtin.user:name: "{{ item.name }}"groups: opsmgrpassword: "{{ pw_manager | password_hash('sha512') }}"password_expire_max: "{{ item.password_expire_max }}"loop: "{{ users }}"when: item.job == 'manager'

相关文章:

RHCS认证-Linux(RHel9)-Ansible

文章目录 一、ansible 简介二 、ansible部署三、ansible服务端测试四 、ansible 清单inventory五、Ad-hot 点对点模式六、YAML语言模式七、RHCS-Ansible附:安装CentOS-Stream 9系统7.1 ansible 执行过程7.2 安装ansible,ansible-navigator7.2 部署ansibl…...

【Python】Spyder:科学 Python 开发环境

在数据科学和科学计算领域,Python 已经成为了一个不可或缺的工具。为了提高开发效率和改善编程体验,一个功能强大且用户友好的开发环境是必需的。Spyder(Scientific Python Development Environment)正是这样一个为科学计算和数据…...

SpringBootWeb响应

2. 响应 前面我们学习过HTTL协议的交互方式:请求响应模式(有请求就有响应) 那么Controller程序呢,除了接收请求外,还可以进行响应。 2.1 ResponseBody 在我们前面所编写的controller方法中,都已经设置了…...

CMake 构建Qt程序弹出黑色控制台

CMake 构建Qt程序弹出黑色控制台...

虚拟机centos_7 配置教程(镜像源、配置centos、静态ip地址、Finalshell远程操控使用)

文章目录 一、下载镜像源(准备工作)1、开源网站2、下载 二、VMware配置centos三、配置静态IP地址四、Finalshell使用1、下载Finalshell2、连接虚拟机 五、谢谢观看! 一、下载镜像源(准备工作) 1、开源网站 有许多开源…...

git 删除 git push 失败的记录

文章目录 问题分析 问题 git push 失败后如何清理 commit 提交的内容 当我们 git push 失败后,如果下次有新的改动需要push时,会出现如下报错 分析 找到需要回退的那次commit的 哈希值 git log然后就回退到了指定版本,这个时候再把新修改…...

【专题】2024年中国白酒行业数字化转型研究报告合集PDF分享(附原数据表)

原文链接:https://tecdat.cn/?p37755 消费人群趋于年轻化,消费需求迈向健康化,消费场景与渠道走向多元化,这些因素共同驱动企业凭借数据能力来适应市场的变化。从消费市场来看,消费群体、需求、场景及渠道皆展现出与…...

哪款品牌充电宝性价比比较高?五款性价比绝佳充电宝推荐

在现代生活中,充电宝已经成为我们日常出行和工作的必备品。然而,面对市场上琳琅满目的充电宝品牌,大家往往难以抉择。尤其是在近期,充电宝不合格产品的数量持续上升,据最新抽查结果显示,不合格率已经上升到…...

巨坑!!华为大数据平台sparksql,连接gauss200数据库

最近用华为大数据平台fusion6.5平台,写了一个sparksql 读取gauss200的MPP数据库的程序。 首先将spark 相关的jar依赖包,必须在华为大数据平台的客户端的spark/jars 这个文件里面去找到然后添加到idea 依赖里面。打包要把整体包打在里面。 核心代码片段…...

BGP相关知识笔记

技术背景: 在只有IGP(诸如OSPF、IS-IS、RIP等协议,因为最初是被设计在一个单域中进行一个路由操纵,因此被统一称为Interior Gateway Protocol,内部网关协议)的时代,域间路由无法实现一个全局路由…...

在 Windows 上运行 Vue 项目时解决 ‘NODE_OPTIONS‘ 错误

在 Windows 上运行 Vue 项目时解决 ‘NODE_OPTIONS’ 错误 在 Windows 系统上启动 Vue 项目时,遭遇报错。具体报错信息如下: ‘NODE_OPTIONS‘ 不是内部或外部命令,也不是可运行的程序或批处理文件。这个错误通常意味着 Windows 系统无法识…...

面试真题:谈一谈Mysql的分库分表

分表和分库是什么?有什么区别? 分库是一种水平扩展数据库的技术,将数据根据一定规则划分到多个独立的数据库中。每个数据库只负责存储部分数据,实现了数据的拆分和分布式存储。分库主要是为了解决并发连接过多,单机 my…...

玄机靶场--蚁剑流量

木马的连接密码是多少 黑客执行的第一个命令是什么 id 黑客读取了哪个文件的内容,提交文件绝对路径 /etc/passwd 黑客上传了什么文件到服务器,提交文件名 黑客上传的文件内容是什么 黑客下载了哪个文件,提交文件绝对路径 蚁剑流量特征总结 …...

uniapp map设置高度为100%后,会拉伸父容器的高度

推荐学习文档 golang应用级os框架,欢迎stargolang应用级os框架使用案例,欢迎star案例:基于golang开发的一款超有个性的旅游计划app经历golang实战大纲golang优秀开发常用开源库汇总想学习更多golang知识,这里有免费的golang学习笔…...

CICD从无到会

一 CICD是什么 CI/CD 是指持续集成(Continuous Integration)和持续部署(Continuous Deployment)或持续交付(Continuous Delivery) 1.1 持续集成(Continuous Integration) 持续集成是…...

责任链模式优化 文章发布的接口(长度验证,敏感词验证,图片验证等环节) 代码,示例

需求:后端需要提供一个文章发布的接口,接口中需要先对文章内容进行如下校验,校验通过后才能发布 1. 文章长度不能超过1万个字符 2. 不能有敏感词 3. 文章中图片需要合规 责任链相当于一个链条一样,链条上有很多节点,节…...

Java流程控制语句——条件控制语句详解(附有流程图)#Java条件控制语句有哪些?#if-else、switch

在 Java 编程中,条件控制语句用于控制程序的执行路径,决定根据某些条件来选择执行某段代码或跳过某段代码。它们是 Java 编程的重要组成部分,帮助开发者根据不同的输入、状态或数据流来编写更加灵活和动态的代码。在本文中,我们将…...

十一、SOA(SOA的具体设计模式)

我们现在深入学习SOA的具体设计模式。SOA架构中的设计模式主要是指导服务如何设计、实现、部署和管理,确保服务的松耦合、高可用性、扩展性和复用性。SOA常见的设计模式可以分为以下几类: 1. 服务层次设计模式 1.1. 基础服务(Fundamental S…...

Mybatis原理

一. 为什么要使用Mybatis? 1.1 jdbc的使用步骤 首先,在pox.xml中引入MySQl驱动的依赖 第一步, Class.forName 注册驱动 第二步,获取一个Connection。 第三步,创建一个Statement对象。 第四步,execute()方法执行SQL。execute()方…...

黑马头条day3-2 自媒体文章管理

前边还有一个 素材列表查询 没什么难度 就略过了 查询所有频道和查询自媒体文章也是和素材列表查询类似 就是普通的查询 所以略过了 文章发布 这个其实挺复杂的 一共三张表 一个文章表 一个素材表 一个文章和素材的关联表 区分修改与新增就是看是否存在id 如果是保存草稿…...

web vue 项目 Docker化部署

Web 项目 Docker 化部署详细教程 目录 Web 项目 Docker 化部署概述Dockerfile 详解 构建阶段生产阶段 构建和运行 Docker 镜像 1. Web 项目 Docker 化部署概述 Docker 化部署的主要步骤分为以下几个阶段: 构建阶段(Build Stage)&#xff1a…...

Docker 离线安装指南

参考文章 1、确认操作系统类型及内核版本 Docker依赖于Linux内核的一些特性,不同版本的Docker对内核版本有不同要求。例如,Docker 17.06及之后的版本通常需要Linux内核3.10及以上版本,Docker17.09及更高版本对应Linux内核4.9.x及更高版本。…...

vscode里如何用git

打开vs终端执行如下: 1 初始化 Git 仓库(如果尚未初始化) git init 2 添加文件到 Git 仓库 git add . 3 使用 git commit 命令来提交你的更改。确保在提交时加上一个有用的消息。 git commit -m "备注信息" 4 …...

(十)学生端搭建

本次旨在将之前的已完成的部分功能进行拼装到学生端,同时完善学生端的构建。本次工作主要包括: 1.学生端整体界面布局 2.模拟考场与部分个人画像流程的串联 3.整体学生端逻辑 一、学生端 在主界面可以选择自己的用户角色 选择学生则进入学生登录界面…...

剑指offer20_链表中环的入口节点

链表中环的入口节点 给定一个链表,若其中包含环,则输出环的入口节点。 若其中不包含环,则输出null。 数据范围 节点 val 值取值范围 [ 1 , 1000 ] [1,1000] [1,1000]。 节点 val 值各不相同。 链表长度 [ 0 , 500 ] [0,500] [0,500]。 …...

oracle与MySQL数据库之间数据同步的技术要点

Oracle与MySQL数据库之间的数据同步是一个涉及多个技术要点的复杂任务。由于Oracle和MySQL的架构差异,它们的数据同步要求既要保持数据的准确性和一致性,又要处理好性能问题。以下是一些主要的技术要点: 数据结构差异 数据类型差异&#xff…...

【SQL学习笔记1】增删改查+多表连接全解析(内附SQL免费在线练习工具)

可以使用Sqliteviz这个网站免费编写sql语句,它能够让用户直接在浏览器内练习SQL的语法,不需要安装任何软件。 链接如下: sqliteviz 注意: 在转写SQL语法时,关键字之间有一个特定的顺序,这个顺序会影响到…...

mysql已经安装,但是通过rpm -q 没有找mysql相关的已安装包

文章目录 现象:mysql已经安装,但是通过rpm -q 没有找mysql相关的已安装包遇到 rpm 命令找不到已经安装的 MySQL 包时,可能是因为以下几个原因:1.MySQL 不是通过 RPM 包安装的2.RPM 数据库损坏3.使用了不同的包名或路径4.使用其他包…...

代理篇12|深入理解 Vite中的Proxy接口代理配置

在前端开发中,常常会遇到 跨域请求接口 的情况。为了解决这个问题,Vite 和 Webpack 都提供了 proxy 代理功能,用于将本地开发请求转发到后端服务器。 什么是代理(proxy)? 代理是在开发过程中,前端项目通过开发服务器,将指定的请求“转发”到真实的后端服务器,从而绕…...

10-Oracle 23 ai Vector Search 概述和参数

一、Oracle AI Vector Search 概述 企业和个人都在尝试各种AI,使用客户端或是内部自己搭建集成大模型的终端,加速与大型语言模型(LLM)的结合,同时使用检索增强生成(Retrieval Augmented Generation &#…...