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查询例子,编写剧本:
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"
要cat进入查看,确保没有问题才能正常运行
图中repo是自动生成的(后缀)
安装
1.用到的模块是dnf模块,通过ansible-navigator doc -m stdout dnf 命令进去模块,输入/EXAM查询例子,编写剧本:
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没用引号引起来,则会出现以下报错:
3.字典变量
题目要求:
将上述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
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']}}"
输出形式:
不加"{{}}",直接输出
---
- hosts: server
tasks:
- name: debug sth
ansible.builtin.debug:
msg: ansible_facts['default_ipv4']['address']
输出形式:
综合练习:
---
- 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']}}"
输出形式:
循环(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
运行结果如下:
练习题目要求:
创建用户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
userid=2003时会出现以下报错:
其中UID '2003' already exists表示uid=2003已经存在了,注意是在servera中存在,要在servera中查找。可直接在servera里查找,也可通过master远程访问,下图为远程访问:
以下报错代表意思相同
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']
运行结果如下:
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
剧本拆分
---
- 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的结构
── 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循环
代码:
[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中写执行的命令
[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
调用角色
[redhat@master project]$ cat mysql.yml
---
- hosts: server
roles:
- mysql
验证:
[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)
下载集合 第三方本地下载
[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: