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由红帽公司收购,并逐渐成为运维工程师必备的技能之一。该工具具有以下特点:
- 部署简单:只需在主控端部署Ansible环境,被控端无需做任何
- 操作。 默认使用SSH协议:对设备进行管理,保障通信安全。
功能模块丰富:拥有大量常规运维操作模块,可实现日常绝大部分操作。- 支持Playbooks:通过定义多个任务的YAML文件来定制配置和状态管理。
- 轻量级:无需在客户端安装agent,更新时只需在操作机上进行一次更新即可。
Ansible命令的执行过程包括加载配置文件和模块文件、生成并传输临时Python文件、在远程服务器上执行命令、返回结果并删除临时文件。
以下是详细的步骤:
加载配置文件:Ansible首先会加载配置文件,通常为ansible.cfg,这个文件包含了Ansible运行的各种参数和设置。
加载模块文件:根据使用的具体模块(如command、shell等),加载相应的模块文件。这些模块定义了要在远程服务器上执行的具体操作。
生成传输临时Python文件:Ansible将模块或命令生成一个临时的Python(.py)文件,并通过SSH传输到远程服务器的$HOME/.ansible/tmp/ansible-tmp-数字/XXX.PY文件中。
执行命令:Ansible给临时文件添加执行权限,然后在远程服务器上执行这个临时文件,具体命令通过nohup方式在后台运行,确保即使SSH连接断开,命令也能继续执行。
返回结果:命令执行完成后,结果会被传回Ansible主控端,同时输出到终端或保存到指定文件中。
删除临时文件:为了安全性,执行完成后,临时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
的用户应当:
- 在
dev
和test
主机组中的受管节点上创建- 从
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 如果是保存草稿…...

JinDouYun性能测试工具使用方法
1.功能介绍 2. 安卓端支持安卓6及以上的版本,ios支持大部分版本 3. 可以测试游戏,视频,普通应用的性能数据,数据精准,低延迟,无侵入 4.工具下载链接 筋斗云 5.后续功能添加,高版本支持&…...

操作系统 | 学习笔记 | | 王道 | 5.3 磁盘和固态硬盘
5.3 磁盘和固态硬盘 5.3.1 磁盘 磁盘结构 磁盘:磁盘的表面由一些磁性物质组成,可以用这些磁性物质来记录二进制数据 磁道:磁盘的盘面被划分成一个个磁道。这样的一个“圈”就是一个磁道 扇区:一个磁道又被划分成一个个扇区&am…...

【Oauth2整合gateway网关实现微服务单点登录】
文章目录 一.什么是单点登录?二.Oauth2整合网关实现微服务单点登录三.时序图四.代码实现思路1.基于OAuth2独立一个认证中心服务出来2.网关微服务3产品微服务4.订单微服务5.开始测试单点登录 一.什么是单点登录? 单点登录(Single Sign On&…...

WEB领域是不是黄了还是没黄
进入2024年后,WEB领域大批老表失业,一片哀嚎,个个饿的鬼叫狼嚎,为啥呢,下面是我个人的见解和看法。 中国程序员在应用层的集中 市场需求:中国的互联网行业在过去几年中经历了爆炸性增长,尤其是…...

Android系统:系统架构
文章目录 分层设计分块设计总结 分层设计 自上而下分为:应用层、应用架构层、系统运行层、硬件抽象层、Linux内核层 应用层 封装一系列系统App 应用架构层(Framework) 封装一系列运行App需要的Java框架 提供App开发需要的API 系统运行层(Libraries) 封装一系…...

NCNN 源码(1)-模型加载-数据预处理-模型推理
参考 ncnn 第一个版本的代码。 0 整体流程 demo:squeezenet ncnn 自带的一个经典 demo:squeezenet 的代码: // 网络加载 ncnn::Net squeezenet; squeezenet.load_param("squeezenet_v1.1.param"); squeezenet.load_model("squeezenet_…...

重修设计模式-结构型-享元模式
重修设计模式-结构型-享元模式 复用不可变对象,节省内存 享元模式(Flyweight Pattern)核心思想是通过共享对象方式,达到节省内存和提高性能的目的。享元对象需是不可变对象,因为它会被多处代码共享使用,要避…...

JavaScript 运算符
JavaScript 中的运算符可以根据其功能和用途分为几类。以下是主要的运算符类型及其用法: 1. 算术运算符 用于执行基本的数学运算。 : 加法 let sum 5 3; // 8- : 减法 let difference 5 - 3; // 2* : 乘法 let product 5 * 3; // 15/ : 除法 let quotient 5…...

3.js - 运动曲线
这个球,绕着这个红色的线圈转 代码 import * as THREE from three import { OrbitControls } from three/examples/jsm/controls/OrbitControlslet scene,camera,renderer,controls nulllet moon,earth null// 根据,一系列的点,创建曲线 le…...

免费ppt模板哪里找?职场必备这些利器
一眨眼,9月份的尾声渐近,无论是学生还是职场人士,都开始准备着新一轮的演讲和报告。在这个忙碌的时期,一份精美的PPT模板能够大幅提升你的工作效率,让你的演示更加引人入胜。 不用担心高昂的版权费用,市场…...