RHCSA-CE笔记

113 阅读12分钟

CSA

第1天

linux安装与介绍,目录树结构,主要目录介绍

终端介绍(修改主机名),快捷键。命令的组成格式,命令帮助(man,help)ls,cd,mkdir,touch,rm,mv

1.基础命令
hostname 显示主机名
hostnamectl set-hostname 要设置的名称 设置名称
bash 刷新
ctrl shift = 放大终端
ctrl - 缩小终端
ctrl + l 清屏
ctrl + c 中断进程
tab 命令补全
history 历史命令(!+命令编号可调用历史命令)
ctrl + shift + c 复制
ctrl + shift + v 粘贴
/tmp 存放临时文件

ls主命令(查看目录下的文件信息)
ls -l 查看文件详细信息(缩写ll)
ls -lh 查看文件大小
ls -ld 目录路径 查看目录本身的文件信息
ls -a 查看目录下隐藏文件(以.开头的文件,就是隐藏文件)

cd命令(切换路径)
cd .. 返回到当前路径的上一路径
cd 或者cd ~ 返回当前目录的家目录
cd - 返回上一次所处的目录
./ 当前路径下

绝对路径:完整路径
相对路径:相对当前的路径

绝对路径与相对路径的区别
[root@workstation ~]# pwd      //当前路径
/root
[root@workstation ~]# cd home  //当前路径下找home
bash: cd: home: No such file or directory   //报错
[root@workstation ~]# ls       //  查找当前路径下无home
anaconda-ks.cfg  Documents  Music     Public     Videos
Desktop          Downloads  Pictures  Templates
[root@workstation ~]# cd /    // 根目录
[root@workstation /]# pwd
/
[root@workstation /]# ls    //查找根目录下有home
afs  boot  etc   lib    media  opt   root  sbin  sys  usr
bin  dev   home  lib64  mnt    proc  run   srv   tmp  var

[root@workstation ~]# cd /    //切换到根目录
[root@workstation /]# cd home/    //从根目录到home
[root@workstation home]# cd
[root@workstation ~]# cd /home/    // 完整路径
[root@workstation home]# 

mkdir命令(创建目录)
mkdir +绝对/相对路径
mkdir -p 创建多级目录
tree 查看

创建多级目录
[root@workstation B]# mkdir -p dirA/dirB/dirC
[root@workstation B]# tree dirA
dirA
└── dirB
    └── dirC

2 directories, 0 files

touch(创建普通的文本文件)

在多级目录dirC下创建文本文件1.txt
[root@workstation ~]# mkdir -p dirA/dirB/dirC
[root@workstation ~]# 
[root@workstation ~]# touch ./dirA/dirB/dirC/1.txt
[root@workstation ~]# ls
A                Desktop  Documents  Music     Public     Videos
anaconda-ks.cfg  dirA     Downloads  Pictures  Templates
[root@workstation ~]# cd /root/dirA/dirB/dirC
[root@workstation dirC]# ls
1.txt

rm(删除)无回收站,不可找回
rm 删除内容 删除时询问
rm -f 强制删除
rm -rf +目录路径 删除路径
rm -rf + 目录路径/* 删除路径下的所有内容
rm -rf + 目录路径/* 如: ./dirA/* 删除dirA路径下的所有内容,但dirA路径自身不删除

mv(移动路径)
mv 旧文件名 目的位置
mv a b 将a移动到b中(如果在移动的目录后面跟上一个文件名,如果文件名不存在,就是移动并且重命名)

[root@workstation ~]# mv ./A/B ./jiance
[root@workstation ~]# tree
.
├── A
├── anaconda-ks.cfg
├── Desktop
├── Documents
├── Downloads
├── jiance
│   ├── B
│   │   └── C
│   └── redhat
│       ├── 2024-2-24
│       └── 2024.html
├── Music
├── Pictures
├── Public
├── Templates
└── Videos

14 directories, 2 files
[root@workstation ~]# mv ./jiance/redhat/2024.html ./jiance/B/2025.html
[root@workstation ~]# tree
.
├── A
├── anaconda-ks.cfg
├── Desktop
├── Documents
├── Downloads
├── jiance
│   ├── B
│   │   ├── 2025.html
│   │   └── C
│   └── redhat
│       └── 2024-2-24
├── Music
├── Pictures
├── Public
├── Templates
└── Videos

14 directories, 2 files

cp命令(复制)(cp命令会改变文件原属性)

cp 复制文件 目标文件
cp -r 复制目录 目标目录
cp -p 保留文件原属性
-a = -r + -p

第2天

tar,cat,less,more,head,tail(查看文档),find(根据用户名查找),grep,管道符(|),重定向符,ln,vim,管理本地用户和组。

tar命令(打包压缩)
tar -cvf(第四个选项) 打包后的包名 打包的对象:
tar -c 创建
tar -v 显示创建的过程,显示压缩的过程
tar -f 指定包
第四个选项:查找的算法(用man或者--help方法查询)
tar --gzip -cvf 若已知算法名称,也可这样写
tar -cvf 包的路径 (-x解压,-v 显示过程,-f 指定包,可加-C指定解压的路径)
tar -C 解压后放在的路径,默认在home下

man主命令(用来查看命令的信息帮助信息,一般用来查看例子的使用)
跳出man界面后,可输入“/+要查找的算法”,会跳转到算法所在的位置,找到对应算法选项,后按“Q”退出界面

- --help帮助命令

file查看算法

[root@workstation ~]# man tar   //查找算法gzip
[root@workstation ~]# tar -zcvf  B.gz ./jiance/B     //-z是查找到的压缩算法
./jiance/B/
./jiance/B/C/
./jiance/B/2025.html
[root@workstation ~]# file B.gz
B.gz: gzip compressed data, from Unix, original size modulo 2^32 10240

cat命令 显示文件所有内容在终端上(适用于小文件的查看)
cat 文件路径

more命令
more 文件路径 将文档的内容按页进行输出,空格键进行翻页,b键返回上一页。输出完毕退出,退出后终端有文档残留

less命令
mless 文件路径 将文档的内容按页进行输出,空格键进行翻页,上下方向键按行输出,按q完成,退出后终端无文档残留

head命令

tail命令

find命令查找文件
find 查找的范围 查找的方式
(1)按名字查找
find -name 按名字查找 -i模糊查找 “pa**” find -iname 按名字查找,不区分大小写 find -size 大小范围 find -user 文件所有者 find -perm 权限

模糊查找:

[root@workstation /]# find /etc -iname "*a"   //在etc文件下,找以a结尾的文件,且a不区分大小写
/etc/skel/.mozilla
/etc/logrotate.d/samba
/etc/rhsm/ca
/etc/pki/swid/CA
/etc/pki/rpm-gpg/RPM-GPG-KEY-redhat-beta
/etc/pki/ca-trust/extracted/java
/etc/pki/java
/etc/pki/fwupd-metadata
/etc/pki/fwupd-metadata/GPG-KEY-Linux-Foundation-Metadata
/etc/samba
/etc/sysconfig/samba
/etc/sysconfig/qemu-ga
/etc/sysconfig/anaconda
/etc/selinux/targeted/contexts/files/media
/etc/brltty/Input/ba
/etc/brltty/Input/fa
/etc/alsa
/etc/qemu-ga

(2)按文件大小范围查找
find -size 查找的范围,指定大小的文件 特征
find -size + ...(+代表大于...)
find -size - ...(-代表小于...)
find / -size +10M -size -20M(查找在根目录下大于10M,小于20M)

(3)根据文件的所有者来查找 find 查找范围 -user 所有名字

(4)批量操作
find 查找范围 查找方式 -exec 执行命令 {} 执行文件 ;cd(\;代表结束符,{}代替find查找到的文件)

# 查找根目录下redhat的文件,执行cp操作
[root@workstation ~]# find / -user redhat -exec cp -a {} /root/jiance \;

grep文本过滤
grep “关键字” 文件的路径
grep -i 忽略大小写
grep -n 显示关键字段所在行数
grep -v 反选

“|” 管道符(连接命令) 将前一个命令的正确输出,作为后一个命令的输入参数用

重定向符
1.标准输入:

2.标准输出: 输出重定向

  • 正确重定向:> 覆盖 ; >> 叠加 ; 1> ; 1>> ;只有当前面的命令运行结果是正确的情况下,才会进行重定向。

  • 错误重定向:2> ; 2>>;只有当前面的命令运行结果是错误的情况下,才会进行重定向。

  • 混合重定向:&> ; $>>;无论前面的命令运行结果是正确还是错误,都会进行重定向。

  • · >/dev/null 黑洞 ping 127.0.0.1 >/dev/null

echo 输出“内容” echo 输出“内容” > 文件名

link链接
1.硬链接
2.软链接

vim 路径
1.命令模式

2.编辑模式

3.底行命令模式

管理本地用户和组
(1)root:用户名
(2)x:密码的占位符,早期密码是写在这个位置上的,后来为了考虑到安全的问题,就把密码重新放到/etc/shadow文件中。
(3)0:uid,系统不是根据用户名来识别用户的,而是根据uid来识别用户身份。root用户uid=0,0<系统用户0<uid<1000,普通用户uid>=1000
(4)0:gid,用户的主组id 
(5)root:解释说明用, 一般和用户名一样。在登录界面出现用户名其实就这个字段。
(6)/root:用户的家目录,是用来存放用户个人的数据和配置文件
(7)/bin/bash:shell类型,shell是介于用户和操作系统之间的解释器,它将用户输入的命令翻译成系统能够理解的语言。/bin/bash最常见的shell,而如果shell类型为/sbin/nologin,那么用户就无法登录到终端。(SSH)

1.创建用户  /etc/passwd

useradd [选项]  用户名
选项:
-u   指定用户的uid
-g   指定用户的主组id(用户的主组id必须事先存在)
-c   修改用户的注释说明     /rr/redhat
-d   指明用户的家目录(如果不指明的话,默认就是/home/用户名)
-s   指明用户的shell类型
-G   指定用户的附加组

2.设置密码
第一种方式:passwd  用户名
第二种方式:echo “ ” | passwd --stdin 用户名

3.修改用户信息

usermod  [选项]   用户名
选项: -u   修改用户的uid
-g   修改用户的主组id(用户的主组id必须事先存在)
-c   修改用户的注释说明
-d   修改用户的家目录(如果不指明的话,默认就是/home/用户名)
-s   修改用户的shell类型,如果shell类型为/sbin/nologin那么此用户无法登录到终端。
-G   修改用户的附加组,如果直接使用-G的话,会将原有的附加组进行覆盖,如果不想覆盖的话,可以使用-aG在原有附加组的基础上进行追加。

id student    查看student用户uid等信息

4.删除用户 userdel  -r  用户名user01  (注意:除非题目要求不加上-r,一般情况下都是要加上-r对用户进行删除,如果没有加上-r,那么删除用户后,用户的家目录,邮箱目录里的数据依然会残留在系统中,导致数据安全的问题)。

注意:如果忘记使用-r了,用户且已经删除,那么可以创建一个uid和用户名与残留数据用户一样的新用户,然后对新用户重新删除(加上-r)

\ 1.创建组\ groupadd [选项] 组名\ -g 指明gid

2.修改组信息\ groupmod [选项] 组名\ -g 修改gid
-n 修改组名

难点:给用户添加附加组\ usermod 用户名 -aG 附加组名  

3.删除组 groupdel  组名

注意:删除组时,如果该组已经作为用户的主组,那么是不能直接删除,要么更换主组,要么连同用户一起删除。

第3天

用户提权sudo,权限管理,网络配置,重置密码,切换普通用户

切换普通用户的方式(3种)
1.su - 用户名 (返回之前用户时,要用exit命令,不要用su - 来回进行切换)
2.Su 用户名 (只切换用户)
3.ssh 用户名@localhost/主机名/主机IP

sudo命令用户提权
sudo 要执行的操作

chmod修改文件的权限(权限管理)
文件所有者u ,文件所属组g,其他用户o

chown 文件的所属关系
修改文件的所有者和所属组(- R可以对文件进行批量修改)

chown 文件所有者 文件路径名 (修改文件的所有者)

chown :文件所属组 文件路径 (修改文件的所属组)

umask
vim ~/.bashrc 进入到最后进行增添

umtui

第4天

配置ssh,进程管理,系统调优,控制作业,计划任务(crontab -e -u),yum仓库,服务控制,防火墙。

cron

服务控制

systemctl status 服务名   查看服务状态

systemctl start 服务名    启动服务

systemctl enable  服务名  设置服务的开机自启

systemctl  restart  服务名   重启服务

systemctl  stop    服务名    停止服务

systemctl disable  服务名    取消服务的开机自启

第5天

selinux,磁盘管理,交换分区,时间同步

selinux

修改上下文路径

网页访问问题

搭建yum仓库--下载httpd--确认httpd状态(是否开启)--selinux模式(临时setenforce和永久/etc/selinux/config)--上下文类型(修改man semanaga-fcontext)--vim /etc/httpd/conf/httpd.conf(是否监听了对应的端口)--selinux(man semanage-port)--防火墙(--list-all man firewall-cmd reload重新加载)--重启httpd服务,并设置成开启自启动

第六天

逻辑卷,vdo,容器podman 分区 添加硬盘--分区--格式化--挂载

vgextend

lvextend -r -L 扩容后逻辑卷的大小 要扩容的逻辑卷路径
lvextend -L +1G /dev/vg123/lv123

scp .\文件 redhat@192.168.80.100:/home/redhat

/mnt/aap/ansible-automation-platform-setup-bundle-2.2.1-1/bundle/el9

[redhat@master project]$ vim ansible.cfg 
[redhat@master project]$ cat ansible.cfg
[defaults]
inventory=/home/redhat/project/inventory
remote_user=redhat
ask_pass=False
host_key_checking=false

[privilege_escalation]
become=true
become_method=sudo
become_user=root
become_ask_pass=False

CE

使用playbook剧本

playbook使用yaml格式进行编写,文件名一般以.yml作为结尾

命令:
ansible-navigator doc -l 查找所有模块
ansible-navigator doc -m stdout 模块名 查找一个模块的用法
ansible-navigator run -m stdout --check 剧本名 查看是否有格式语法错误
ansible-navigator run -m stdout 剧本名 运行剧本 (fail=1才代表失败) ansible 针对的清单文件(hosts的对象,server/servera/serverb......) -m shell -a "......" 查看具体过程/内容

模块名作用
ansible.builtin.package自动调用对应Linux环境中的软件包管理器去进行软 件包的安装和卸载等管理工作
ansible.builtin.yum_repository管理基于 yum/dnf 软件包管理器的软件仓库配置文件
ansible.builtin.apt_repository管理基于 apt 软件包管理器的软件仓库配置文件
ansible.builtin.yum使用Linux环境中的 yum 工具来完成软件包相关的管 理工作
ansible.builtin.dnf使用Linux环境中的 dnf 工具来完成软件包相关的管 理工作
ansible.builtin.copy实现控制主机上的文件复到受控主机或者是在受控 主机上进行本地文件的复制
ansible.builtin.file实现受控主机主机上文件的管理工作
ansible.builtin.lineinfile用于确保特定格式行内容是否在文本文件中存在
ansible.posix.firewalld基于 firewalld 服务管理受控主机的防火墙功能
ansible.builtin.reboot管理受控主机的重启
ansible.builtin.systemd基于 systemd 服务管理受控主机上的服务
ansible.builtin.service用于管理受控主机上的服务(部分功能等效于 ansible.builtin.systemd )
ansible.builtin.user管理受控主机上的用户
ansible.builtin.group管理受控主机上的组
ansible.builtin.get_url在受控主机上实现文件下载功能
ansible.builtin.command在受控主机上直接执行任意命令(此模块不幂等, 命令中不可以使用管道符或者重定向符号等功能)
ansible.builtin.shell在受控主机上直接执行任意命令(此模块不幂等, 命令中可以使用管道符或者重定向符号等功能)
ansible.builtin.template使用 jinja2 模板给受控主机生成特定内容格式的文 件
ansible.builtin.fetch从受控主机上收集相关的文件到控制主机
ansible.builtin.stat用于在受控主机上检查文件状态
ansible.builtin.blockinfile在受控主机上的文件中添加特定的文本块内容
ansible.builtin.debug用于playbook编写过程中显示调试信息
ansible.builtin.cron用于管理受控主机的计划任务
ansible.builtin.hostname用于管理受控主机的主机名
community.general.parted用于管理受控主机的磁盘分区(需要通过社区单独 安装)
community.general.filesystem用于管理受控主机的块设备文件系统格式化(需要 通过社区单独安装)
ansible.posix.mount用于管理受控主机的文件系统挂载

练习
要求:在serverb上创建一个user03,附加组为group01,group02,主组为3005,再同时创建一个名称为sysmgrs的组,gid为3005

剧本:

---    
 - hosts: serverb
   tasks:
     - name: groupadd 1
       ansible.builtin.group:
         name: group01
         state: present
     - name: groupadd 2
       ansible.builtin.group:
         name: group02
         state: present
     - name: sysmgrs
       ansible.builtin.group:
         name: sysmgrs
         gid: "3005"
         state: present
     - name: useradd
       ansible.builtin.user:
         name: user03
         groups: group01,group02
         group: 3005
         append: yes

dnf安装

剧本:yum_repository.yml
步骤:搭建yum库-->安装

搭建yum库
1.用到的模块是yum_repository模块,通过ansible-navigator doc -m stdout yum_repository 命令进去模块,输入/EXAM查询例子,编写剧本:

image.png

2.编写完毕后,通过以下命令进行查询

[redhat@master project]$ ansible server(主句) -m shell -a "ls /etc/yum.repos.d"   
[redhat@master project]$ ansible server -m shell -a "cat /etc/yum.repos.d/baseos1.repo" 
[redhat@master project]$ ansible server -m shell -a "cat /etc/yum.repos.d/baseos2.repo" 

image.png

cat进入查看,确保没有问题才能正常运行 image.png

image.png 图中repo是自动生成的(后缀)

安装
1.用到的模块是dnf模块,通过ansible-navigator doc -m stdout dnf 命令进去模块,输入/EXAM查询例子,编写剧本:

image.png

2.编写完毕后,用以下命令进行查看

ansible servera -m shell-a "rmp -q httpd"   
ansible serverb -m shell-a "rmp -q mariadb"   
剧本代码如下
[redhat@master project]$ vim yum_repository.yml
//写yum_repository.yml剧本
---
//搭建yum库
 - hosts: server
   tasks:
     - name: add repo 1
       ansible.builtin.yum_repository:
         name: baseos1
         description: baseos repo
         baseurl: http://192.168.80.100/rhel-9-for-x86_64-baseos-rpms
         enabled: yes
         gpgcheck: no
     - name: add repo 2
       ansible.builtin.yum_repository:
         name: baseos2
         description: baseos repo
         baseurl: http://192.168.80.100/rhel-9-for-x86_64-appstream-rpms
         enabled: yes
         gpgcheck: no
 
 //安装dnf
 - hosts: servera
   tasks:
     - name: install httpd
       ansible.builtin.dnf:
         name: httpd
         state: present
 - hosts: serverb
   tasks:
     - name: install mariadb-server
       ansible.builtin.dnf:
         name: mariadb-server
         state: present

变量

1.普通变量

题目要求:
使用变量的方式在server上创建用户user02,uid为6666,name的变量名为username,uid的变量名为userid

---
 - hosts: server
   vars:
     username: user02
     userid: 6666
   tasks:
     - name: useradd
       ansible.builtin.user:
         name: "{{ username }}"
         uid: "{{ userid }}"
         state: present
[redhat@master project]$ vim user02.yml
[redhat@master project]$ ansible-navigator run -m stdout user02.yml

[redhat@master project]$ ansible server -m shell -a "id user02"
2.列表变量

题目要求:
创建用户student01,student02,密码都是2。用户名用列表变量usernames 存储,密码单独用普通变量password存储,受控节点serverb

提示:
密码加密算法:password: "{{ password | password_hash('sha512') }}"

[redhat@master project]$ vim user02.yml
[redhat@master project]$ ansible-navigator run -m stdout user02.yml
---   
 - hosts: serverb
   vars:
     usernames:
       - student01
       - student02
     password: '2'
   tasks:
     - name: useradd 01
       ansible.builtin.user:
         name: "{{ usernames[0] }}"
         password: "{{ password | password_hash('sha512') }}"
         state: present
     - name: useradd 02
       ansible.builtin.user:
         name: "{{ usernames[1] }}"
         password: "{{ password | password_hash('sha512') }}"
         state: present

如果password: '2'中2没用引号引起来,则会出现以下报错: image.png

3.字典变量

题目要求:

image.png 将上述debug模块输出修改为user模块,利用字典变量,在server上创建用户student03,student04,要求uid为2003和2004

提示: debug模块直接打印输出,而name模块要求指定一个name: "{{ userlist[0]['username'] }}"中第二个[]中username要加要加‘’引号引起来,作为变量。

---
 - hosts: server
   vars:
     userlist: 
       - username: student03
         uid: '2003'
       - username: student04
         uid: '2004'
   tasks:
     - name: useradd 01
       ansible.builtin.user:
         name: "{{ userlist[0]['username'] }}"
         uid: "{{ userlist[0]['uid'] }}"
         state: present
     - name: useradd 02  
       ansible.builtin.user:
         name: "{{ userlist[1]['username'] }}"
         uid: "{{ userlist[1]['uid'] }}"
         state: present 

image.png

4.事实变量(ansible_facts)

收集所有事实变量

---       
 - hosts: servera
   gather_facts: yes
   tasks: 
     - name: facts
       ansible.builtin.debug:
         var: ansible_facts

通过此剧本可查找到所有事实变量,ansible-navigator run -m stdout facts.yml > 1.txt可写入1.txt文件,vim 1.txt进入进行查找
如:
address写法:ansible_facts['default_ipv4']['address']
hostname写法:ansible_facts['hostname']
fqdn域名写法:ansible_facts['fqdn']

"{{}}",查找输出

---       
 - hosts: server
   tasks: 
     - name: debug sth
       ansible.builtin.debug:
         msg: "{{ansible_facts['default_ipv4']['address']}}"

输出形式: image.png

不加"{{}}",直接输出

---   
 - hosts: server
   tasks: 
     - name: debug sth
       ansible.builtin.debug:
         msg: ansible_facts['default_ipv4']['address']

输出形式: image.png

综合练习:

--- 
 - hosts: server
   gather_facts: yes
   tasks:
     - name: debug sth
       ansible.builtin.debug:
         msg: >
             "{{ansible_facts['hostname']}} 's default IPv4 address is"
             "{{ansible_facts['default_ipv4']['address']}}"

输出形式: image.png

循环(loop)

loop循环要用item取值
用此循环改写dnf安装中的yum库yum_repository.yml剧本

---
 - hosts: server
   tasks:
     - name: add repo 1
       loop:
         - repo_name: baseos
         - repo_name: appstream
       ansible.builtin.yum_repository:
         name: "{{item['repo_name']}}"
         description: "{{item['repo_name']}} repo"
         baseurl: "http://192.168.80.100/rhel-9-for-x86_64-{{item['repo_name']}}-rpms"
         enabled: yes
         gpgcheck: no

运行结果如下: image.png

练习题目要求:
创建用户user01,user02,user03,user04,uid分别为3003,2001,2002,2004

---         
 - hosts: servera
   tasks:   
     - name: useradd
       loop:
         - username: user01
           userid: "3003"
         - username: user02
           userid: "2001"
         - username: user03
           userid: "2002"
         - username: user04
           userid: "2004"
       ansible.builtin.user:
           name: "{{ item['username'] }}"
           uid: "{{ item['userid'] }}"
           state: present

image.png

userid=2003时会出现以下报错:

image.png

其中UID '2003' already exists表示uid=2003已经存在了,注意是在servera中存在,要在servera中查找。可直接在servera里查找,也可通过master远程访问,下图为远程访问:

image.png

以下报错代表意思相同

image.png

UID 2000 is not uniqueuid=2000已经存在了

when有条件的执行任务

用when语句改写dnf安装中的yum库yum_repository.yml剧本

---     
 - hosts: server
#用loop进行yum库优化
   tasks:
     - name: use loop add repo
       loop:
         - repo_name: baseos
         - repo_name: appstream    
       ansible.builtin.yum_repository:
         name: "{{item['repo_name']}}"
         description: "{{item['repo_name']}} repo" 
         baseurl: "http://192.168.80.100/rhel-9-for-x86_64-{{item['repo_name']}}-rpms"
         enabled: yes
         gpgcheck: no
#用when语句进行安装优化:        
     - name: install httpd
       ansible.builtin.dnf:
         name: httpd
         state: present
       when: inventory_hostname in groups['servera']
     - name: install mariadb-server
       ansible.builtin.dnf:
         name: mariadb-server
         state: present
       when: inventory_hostname in groups['serverb']

image.png

运行结果如下:
image.png

block结构

题目要求:
在serverb上安装一个软件httpd,如果安装失败则打印信息”httpd软件安装失败”,然后重启服务。使用语法block rescue always来写

---            
 - hosts: serverb
   tasks:      
     - name: dnf httpd
       block:  
          - name: dnf
            ansible.builtin.dnf:
              name: httpd
              state: present
       rescue: 
          - name: debug
            ansible.builtin.debug:
              msg: httpd软件安装失败
       always: 
          - name: restart
            ansible.builtin.service:
              name: httpd     #重启服务要写服务器的名字httpd
              state: restarted

image.png

剧本拆分

---   
 - name: budeg
   ansible.builtin.debug:
     msg: "hello"
---
 - name: budeg2
   ansible.builtin.debug:
     msg: "world"
--- 
 - name: run
   hosts: servera
   tasks:
     - import_tasks: ./im.yml
     - include_tasks: ./in.yml

角色role

[redhat@master project]$ mkdir role  # 这里最好写roles,已经错了,将错就错
[redhat@master project]$ vim ansible.cfg 
[redhat@master project]$ cat ansible.cfg 
[defaults]
inventory=/home/redhat/project/inventory
remote_user=redhat
ask_pass=false
host_key_checking=false
roles_path=/home/redhat/project/role  # 规范role

[privilege_escalation]
become=true
become_ask_pass=False
become_method=sudo
become_user=root
[redhat@master project]$ 
[redhat@master project]$ ansible-navigator exec -- ansible-galaxy init mysql --init-path=./role
- Role mysql was created successfully
[redhat@master project]$ ansible-navigator exec -- ansible-galaxy role list
# /home/redhat/project/roles

role的结构

image.png

── role
│   └── mysql
│       ├── defaults
│       │   └── main.yml
│       ├── files
│       ├── handlers
│       │   └── main.yml
│       ├── meta
│       │   └── main.yml
│       ├── README.md  # 角色使用说明书
│       ├── tasks
│       │   └── main.yml
│       ├── templates
│       ├── tests
│       │   ├── inventory
│       │   └── test.yml
│       └── vars
│           └── main.yml

自定义角色

for循环

669cf10f70299e75a7eaf166b03bec0.png 代码:

[redhat@master project]$ cat role/mysql/templates/index.j2
{% for item in hostvars %}
{{ hostvars[item]['ansible_facts']['default_ipv4']['address'] }} {{ hostvars[item]['ansible_facts']['hostname'] }}
{% endfor %}

写命令
role/mysql/tasks/main.yml中写执行的命令

eed7ab23f66d72185330f5df066c4cd.png

[redhat@master project]$ cat role/mysql/tasks/main.yml 
---
# tasks file for mysql
- name: use tem
  ansible.builtin.template:
     src: index.j2
     dest: /home/redhat

调用角色

301d8f77ab8117695e13d93c8d8d22b.png

[redhat@master project]$ cat mysql.yml
---
 - hosts: server
   roles:
     - mysql

验证:

4ceb61dbb7c527b9a747dfe55d4a437.png

[redhat@master project]$ ansible server -m shell -a "cat /home/redhat/index.j2"
192.168.80.130 | CHANGED | rc=0 >>
192.168.80.129 servera
192.168.80.130 serverb
192.168.80.129 | CHANGED | rc=0 >>
192.168.80.129 servera
192.168.80.130 serverb

下载别人给准备好的角色

1.通过网站下载搜索
网站:galaxy.ansible.com
ansible-navigator exec -- ansible-galaxy search haproxy --platforms EL查询haproxy --platforms EL

ansible-navigator exec -- ansible-galaxy role info geerlingguy.haproxy查询具体的role

本地

ansible-galaxy role install -r ./role/requirements.yml -p /home/redhat/role

2.本地下载
主命令:ansible-galaxy role
ansible-galaxy role install -r ./role/requirements.yml -p /home/redhat/project/role 下载
ansible-galaxy 下载名称 list查询下载结果

[redhat@master project]$ cat role/requirements.yml  # 编写playbook剧本
---
- src: file:///home/redhat/ansible-role-redis-1.8.0.tar.gz
  name: redis

- src: file:///home/redhat/ansible-role-haproxy-1.3.1.tar.gz
  name: haproxy
[redhat@master project]$ ansible-galaxy role install -r ./role/requirements.yml  -p /home/redhat/project/role   
# 安装命令 
Starting galaxy role install process
- downloading role from file:///home/redhat/ansible-role-redis-1.8.0.tar.gz
- extracting redis to /home/redhat/project/role/redis
- redis was installed successfully
- downloading role from file:///home/redhat/ansible-role-haproxy-1.3.1.tar.gz
- extracting haproxy to /home/redhat/project/role/haproxy
- haproxy was installed successfully

[redhat@master project]$ ansible-galaxy role list  # 查询命令
# /home/redhat/project/role
- mysql, (unknown version)
- redis, (unknown version)
- haproxy, (unknown version)

下载集合 第三方本地下载

image.png

[redhat@master project]$ ls /home/redhat/  # 本地下载导入
ansible-navigator.log              community-crypto-2.15.1.tar.gz
ansible-role-haproxy-1.3.1.tar.gz  images
ansible-role-redis-1.8.0.tar.gz    project
[redhat@master project]$ vim collections/requirements.yml  #编写playbook
[redhat@master project]$ cat collections/requirements.yml
collections:
 - name: /home/redhat/community-crypto-2.15.1.tar.gz
# 下载安装 -r   指明用哪个文件安装  -p  指明角色安装的位置
[redhat@master project]$ ansible-galaxy collection install -r ./collections/requirements.yml  -p /home/redhat/project/collections/
Starting galaxy collection install process
Process install dependency map
Starting collection install process
Installing 'community.crypto:2.15.1' to '/home/redhat/project/collections/ansible_collections/community/crypto'
community.crypto:2.15.1 was installed successfully
# 查询下载collection
[redhat@master project]$ ansible-galaxy collection list   

# /home/redhat/project/collections/ansible_collections
Collection       Version
---------------- -------
community.crypto 2.15.1 

从普通用户查主机的配置文件:
ansible servera -m shell -a "cat /etc/chrony.conf | grep server"
ansible servera -m shell -a "chronyc sources"

系统角色

以rhel-system-roles.timesync为例

[root@master ~]# cd /usr/share/ansible/roles/
[root@master roles]# cp -a rhel-system-roles.timesync/ /home/redhat/project/role/timesync  # 从主机系统将角色复制到普通用户

# 普通用户:
[redhat@master project]$ tree role/timesync/ # 查看timesync结构
。。。。。。
[redhat@master project]$ vim  role/timesync/README.md  # 查看说明书
[redhat@master project]$ vim  timesync.yml  # 根据说明书进行编写playblook
[redhat@master project]$ cat timesync.yml
- hosts: servera
  vars:
    timesync_ntp_servers:
      - hostname: ntp.aliyun.com
        iburst: yes
  roles:
    - timesync  # 与复制后的文件名字相同

ansible-vault create 1.yml 创建加密playbook的同时设置密码

ansible-navigator run -m stdout 1.yml --vault-id @prompt 输入密码解码运行
ansible-navigator run -m stdout 1.yml --vault-id =./secret密码在文档里

添加磁盘分区

[redhat@master project]$ vim part.yml
[redhat@master project]$ cat part.yml
---
 - hosts: servera
   tasks: 
     - name: create partition1
       community.general.parted:
         device: /dev/sda
         number: 1
         state: present
         part_start: 1MiB
         part_end: 501MiB
     
     - name: create partition2
       community.general.parted:
         device: /dev/sda       
         number: 2       
         state: present         
         part_start: 502MiB        
         part_end: 702MiB
[redhat@master project]$ ansible-navigator run -m stdout part.yml
[redhat@master project]$ ansible servera -m shell -a "lsblk"
192.168.80.129 | CHANGED | rc=0 >>
NAME          MAJ:MIN RM  SIZE RO TYPE MOUNTPOINTS
sda             8:0    0    5G  0 disk 
├─sda1          8:1    0  500M  0 part 
└─sda2          8:2    0  200M  0 part 
sr0            11:0    1    8G  0 rom  /run/media/root/RHEL-9-0-0-BaseOS-x86_64
nvme0n1       259:0    0   20G  0 disk 
├─nvme0n1p1   259:1    0  600M  0 part /boot/efi
├─nvme0n1p2   259:2    0    1G  0 part /boot
└─nvme0n1p3   259:3    0 18.4G  0 part 
  ├─rhel-root 253:0    0 16.4G  0 lvm  /
  └─rhel-swap 253:1    0    2G  0 lvm  [SWAP]

     - name: create partition2
       community.general.parted:
         device: /dev/sda
         number: 2
         state: absent  # 删除
[redhat@master project]$ vim filesystem.yml
[redhat@master project]$ ansible-navigator run -m stdout filesystem.yml 
[redhat@master project]$ cat filesystem.yml
---  
 - hosts: servera
   tasks: 
     - name: create partition1
       community.general.filesystem:
         device: /dev/sda1
         fstype: xfs

[redhat@master project]$ vim mount.yml
[redhat@master project]$ cat mount.yml
---
 - hosts: servera
   tasks:
     - name: create mnt
       ansible.builtin.file:
          path: /mnt/rhel
          state: directory
     - name: mount
       ansible.posix.mount:
          path: /mnt/rhel
          src: /dev/sda1
          state: mounted
          fstype: xfs
[redhat@master project]$ ansible-navigator run -m stdout mount.yml  # 运行
[redhat@master project]$ ansible servera -m shell -a "lsblk"  # 检测
192.168.80.129 | CHANGED | rc=0 >>
NAME          MAJ:MIN RM  SIZE RO TYPE MOUNTPOINTS
sda             8:0    0    5G  0 disk 
└─sda1          8:1    0  500M  0 part /mnt/rhel
sr0            11:0    1    8G  0 rom  /run/media/root/RHEL-9-0-0-BaseOS-x86_64
nvme0n1       259:0    0   20G  0 disk 
├─nvme0n1p1   259:1    0  600M  0 part /boot/efi
├─nvme0n1p2   259:2    0    1G  0 part /boot
└─nvme0n1p3   259:3    0 18.4G  0 part 
  ├─rhel-root 253:0    0 16.4G  0 lvm  /
  └─rhel-swap 253:1    0    2G  0 lvm  [SWAP]

防火墙firewalld

[redhat@master project]$ vim firewalld.yml
[redhat@master project]$ cat firewalld.yml
---
 - hosts: servera
   tasks:
     - name: 
       ansible.posix.firewalld:
         service: http
         state: enabled
         permanent: true
         immediate: true
[redhat@master project]$ ansible-navigator run -m stdout firewalld.yml 
[redhat@master project]$ ansible servera -m shell -a "firewall-cmd --list-all"  # 检查
192.168.80.129 | CHANGED | rc=0 >>
public (active)
  target: default
  icmp-block-inversion: no
  interfaces: ens160
  sources: 
  services: cockpit dhcpv6-client http ssh
  ports: 
  protocols: 
  forward: yes
  masquerade: no
  forward-ports: 
  source-ports: 
  icmp-blocks: 
  rich rules: