RHCE8 资料整理
第 九 篇 自动化管理工具ansible的使用
第 28 章 ansible的使用
详细参考系列文章 https://blog.csdn.net/u010230019/article/details/128469092
如果管理的服务器很多,如几十甚至几百台服务器,那么就需要一个自动化管理工具了,ansible就是这样一款自动化管理工具。
ansible通过ssh
连接到被管理的主机,然后执行相关操作。ansible主机通过ssh链接到被管理主机时,需要提前设置密钥登录,使得从ansible主机可以无密码登录到被管理的主机。
28.1 安装ansible
配置信息
机器类型 | 主机名 | ip |
---|---|---|
server | node-137 | 192.168.17.137 |
client | node-138 | 192.168.17.138 |
client | node-140 | 192.168.17.140 |
server
yum方式
yum install epel-release
yum install ansible
pip方式
这里是使用系统自带的python2的环境
如果系统中安装的pip3,可以直接使用pip3安装ansible
yum install epel-release
yum install python2-pip
pip install ansible
查看版本
[root@node-137 yum.repos.d]# ansible --version
ansible 2.9.27
config file = /etc/ansible/ansible.cfg
configured module search path = [u'/root/.ansible/plugins/modules', u'/usr/share/ansible/plugins/modules']
ansible python module location = /usr/lib/python2.7/site-packages/ansible
executable location = /usr/bin/ansible
python version = 2.7.5 (default, Jun 20 2023, 11:36:40) [GCC 4.8.5 20150623 (Red Hat 4.8.5-44)]
配置好非root账号的ssh密钥登录,可以使用yurq登录到node-138,node-140
ssh-keygen -t rsa
ssh-copy-id node-138
ssh-copy-id node-140
client
客户端配置好sudo
权限
[root@server ~]# cat /etc/sudoers.d/yurq
yurq ALL=(root) NOPASSWD: ALL
28.2 编写ansible.cfg和清单文件
执行ansible 或 ansible-playbook 命令时,优先使用当前目录中ansible.cfg的配置,如果当前目录中没有,则使用默认的/etc/ansible.cfg
中的配置
[root@node-137 ansible]# cat ansible.cfg
[defaults]
inventory=./hosts
[privilege_escalation]
become=True
become_method=sudo
become_user=root
这里在[defaults]字段下添加了inventory=./hosts
,表示把当前目录下名称为hosts
的文件当作清单文件
在[privilege_escalation]字段下定义了如何提升权限,因为使用yurq
账号登录到被管理的主机,所以需要提升权限。三条记录含义分别为:
- become=True,登录到被管理主机时要切换到其他用户
- become_method=sudo,以sudo的方式切换
- become_user=root,切换到root用户
组合起来含义:当用ssh登录到被管理主机时,以sudo的方式切换到root,这也是前面在被管理主机上配置好sudo的原因。
所有的被管理机器都要写入清单文件中。
[root@node-137 ansible]# cat hosts
node-138
node-140
[db1]
node-138
[db2]
node-140
[db3:children]
db1
db2
这里一行一台主机,我们使用ansible或ansible-playbook命令时,指定的主机名必须是清单文件中的名称。要确保能解析主机名,可以写成hostname,或者IP
如果管理的主机很多,可以写成
node-1[38:48]
表示主机名为node-138到node-148,共11台主机
如果执行ansible命令时只想在部分主机上执行,那么在清单文件中可以对主机进行分组,组名写在中括号[]
中,在[]
下面写的主机名都属于这个组,直到下一个组的位置为止。
[root@node-137 ansible]# ansible db1 --list-hosts
hosts (1):
node-138
[root@node-137 ansible]# ansible db2 --list-hosts
hosts (1):
node-140
[root@node-137 ansible]# ansible db3 --list-hosts
hosts (2):
node-138
node-140
28.3 ansible的基本用法
ansible的基本用法,
ansible 机器名 -m 模块x -a "模块的参数"
这里的机器名必须出现在清单文件中,整体意思是在指定的机器上执行模块x。例如,
[root@node-137 ansible]# ansible node-138 -m shell -a "hostname"
node-138 | CHANGED | rc=0 >>
node-138
要完成不同的任务就需要调用不同的模块来实现,系统中存在的所有ansible模块可以通过ansible-doc -l
来查看。不同的模块有不同的参数,模块的参数及使用方法可以通过ansible-doc 模块名
来查看。
[root@node-137 ansible]# ansible db3 -m shell -a "ip a|awk 'FS= /inet / {print $2}'"
node-138 | CHANGED | rc=0 >>
inet 127.0.0.1/8 scope host lo
inet 192.168.81.138/24 brd 192.168.81.255 scope global noprefixroute ens33
inet 192.168.17.138/24 brd 192.168.17.255 scope global noprefixroute ens37
node-140 | CHANGED | rc=0 >>
inet 127.0.0.1/8 scope host lo
inet 192.168.81.140/24 brd 192.168.81.255 scope global noprefixroute ens32
inet 192.168.17.140/24 brd 192.168.17.255 scope global noprefixroute ens35
第 29 章 常用模块的使用(一)
详细参考
https://blog.csdn.net/u010230019/article/details/128471706
https://blog.csdn.net/u010230019/article/details/128477679
29.1 shell模块
命令格式,
ansible 主机组 -m shell -a "系统命令"
[root@node-137 ansible]# ansible db3 -m shell -a "cat /etc/issue"
node-138 | CHANGED | rc=0 >>
\S (terminal: \l)
Date: \d \t
Kernel \r on an \m
Welcome!
node-140 | CHANGED | rc=0 >>
\S
Kernel \r on an \m
29.2 文件管理的file模块
file模块用于创建和删除文件/目录,修改文件/目录属性,格式,
ansible 主机组 -m file -a "参数"
参数包括:
参数 | 说明 |
---|---|
path | 用于指定文件/目录的路径,此选项可用name或dest替代 |
state | 指定行为 |
touch | 创建文件 |
directory | 创建目录 |
file | 对已存在的文件进行修改 |
absent | 删除 |
link | 软连接 |
hard | 硬连接 |
owner | 属主 |
group | 属组 |
mode | 权限 |
setype | 指定上下文 |
创建文件,属主属组均为yurq,权限444
[root@node-137 ansible]# ansible db1 -m file -a "path=/opt/hosts owner=yurq group=yurq mode=444 state=touch"
node-138 | CHANGED => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": true,
"dest": "/opt/hosts",
"gid": 1000,
"group": "yurq",
"mode": "0444",
"owner": "yurq",
"secontext": "unconfined_u:object_r:usr_t:s0",
"size": 0,
"state": "file",
"uid": 1000
}
[root@node-137 ansible]# ansible db1 -m shell -a "ls -l /opt/hosts"
node-138 | CHANGED | rc=0 >>
-r--r--r--. 1 yurq yurq 0 Dec 8 23:04 /opt/hosts
创建目录,指定上下文为default_t
[root@node-137 ansible]# ansible db1 -m file -a "name=/opt/xx state=directory setype=default_t"
node-138 | CHANGED => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": true,
"gid": 0,
"group": "root",
"mode": "0755",
"owner": "root",
"path": "/opt/xx",
"secontext": "unconfined_u:object_r:default_t:s0",
"size": 6,
"state": "directory",
"uid": 0
}
[root@node-137 ansible]# ansible db1 -m shell -a "ls -ldZ /opt/xx"
node-138 | CHANGED | rc=0 >>
drwxr-xr-x. root root unconfined_u:object_r:default_t:s0 /opt/xx
修改文件,属主为mary,属组为users,权限000,上下文default_t
[root@node-137 ansible]# ansible db1 -m file -a "path=/opt/hosts owner=mary group=users mode=000 setype=default_t"
node-138 | CHANGED => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": true,
"gid": 100,
"group": "users",
"mode": "0000",
"owner": "mary",
"path": "/opt/hosts",
"secontext": "unconfined_u:object_r:default_t:s0",
"size": 0,
"state": "file",
"uid": 1018
}
[root@node-137 ansible]# ansible db1 -m shell -a "ls -lZ /opt/hosts"
node-138 | CHANGED | rc=0 >>
----------. mary users unconfined_u:object_r:default_t:s0 /opt/hosts
29.3 copy和fetch模式
copy用于把本地文件拷贝到被管理机器,语法,
ansible 主机组 -m copy -a "src=/localpath/file dest=/remotepath2/"
参数包括:
参数 | 说明 |
---|---|
src | 源文件 |
dest | 目的地 |
owner | 属主 |
group | 属组 |
mode | 权限 |
[root@node-137 ansible]# ansible db1 -m copy -a "src=/opt/ansible/hello dest=/home/yurq/ owner=mary group=users mode=444"
node-138 | CHANGED => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": true,
"checksum": "b5241a6904fe01ef08362057c74559b68470ba95",
"dest": "/home/yurq/hello",
"gid": 100,
"group": "users",
"md5sum": "c90a2df850a1dc3f35179528d04967f6",
"mode": "0444",
"owner": "mary",
"secontext": "unconfined_u:object_r:user_home_t:s0",
"size": 15,
"src": "/root/.ansible/tmp/ansible-tmp-1702019787.56-4482-279204745752206/source",
"state": "file",
"uid": 1018
}
[root@node-137 ansible]# ansible db1 -m shell -a "cat /home/yurq/hello;ls -l /home/yurq/hello"
node-138 | CHANGED | rc=0 >>
hello node 138
-r--r--r--. 1 mary users 15 Dec 8 23:15 /home/yurq/hello
fetch用于把文件从被管理机器拷贝到本地当前目录,语法,
ansible 主机组 -m fetch -a "src=/remotepath2/file dest=."
[root@node-137 ansible]# ansible db1 -m fetch -a "src=/home/yurq/hello dest=."
node-138 | CHANGED => {
"changed": true,
"checksum": "b5241a6904fe01ef08362057c74559b68470ba95",
"dest": "/opt/ansible/node-138/home/yurq/hello",
"md5sum": "c90a2df850a1dc3f35179528d04967f6",
"remote_checksum": "b5241a6904fe01ef08362057c74559b68470ba95",
"remote_md5sum": null
}
[root@node-137 ansible]# ll node-138/home/yurq/hello
-rw-r--r-- 1 root root 15 Dec 8 15:20 node-138/home/yurq/hello
[root@node-137 ansible]# cat node-138/home/yurq/hello
hello node 138
当使用fetch拷贝远程目录到本地时,会在本地创建一个和远端主机同名目录,用于存储拷贝文件
29.4 yum_repository模块
利用yum_repository设置yum源,一个标准的repo配置文件如下,
[base-source]
name=CentOS-$releasever - Base Sources
baseurl=http://vault.centos.org/centos/$releasever/os/Source/
gpgcheck=1
enabled=0
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
对于yum_repository模块来说,常见参数如下,
参数 | 说明 |
---|---|
name | 必须参数,指定唯一的仓库ID,state为present或absent时需要设置name参数 |
baseurl | 指定yum仓库repodata目录的URL,可以是多个,如果设置为多个,需要使用"metalink"和"mirrorlist"参数 |
enabled | 使用此yum仓库 |
gpgcheck | 是否对软件包执行gpg签名检查 |
gpgkey | gpg秘钥的URL |
mode | 权限设置,当设置为preserve时,文件将与源文件权限相同 |
file | 用于设置仓库的配置文件名称,即设置”.repo”配置文件的文件名前缀,在不使用此参数的情况下,默认以 name 参数的仓库ID作为”.repo”配置文件的文件名前缀,同一个”.repo” 配置文件中可以存在多个 yum 源 |
state | 状态,默认的present为安装此yum仓库,absent为删除此yum仓库 |
description | 设置仓库的注释信息 |
async | 如果yum仓库支持并行,yum将并行下载软件包和元数据 |
bandwidth | 与throttle参数一起使用,限制yum可用的网络带宽 |
[root@node-137 ansible]# ansible db1 -m yum_repository -a "name=app description='this is appstream' baseurl=ftp//192.168.17.137/dvd/AppStream gpgcheck=yes"
node-138 | CHANGED => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": true,
"repo": "app",
"state": "present"
}
[root@node-137 ansible]# ansible db1 -m shell -a "cat /etc/yum.repos.d/app.repo"
node-138 | CHANGED | rc=0 >>
[app]
baseurl = ftp//192.168.17.137/dvd/AppStream
gpgcheck = 1
name = this is appstream
29.5 使用yum模块管理软件
yum模块常见参数,
参数 | 说明 |
---|---|
name | 指定软件包名称 |
state | 参数值: 1. present或installed,用于安装软件包,如果没有指定state,默认值为installed 2. absent或removed,用于卸载软件包 3. latest,用于更新,如果软件未安装过,则此为安装 |
yum模块可以用package模块替代,用于在ubuntu等其他系统上管理软件包
[root@node-137 ansible]# ansible db1 -m yum -a "name=vsftpd state=removed"
node-138 | CHANGED => {
...
\n================================================================================\n Package Arch Version Repository Size\n================================================================================\nRemoving:\n vsftpd x86_64 3.0.2-29.el7_9 @updates 353 k\n\nTransaction Summary\n================================================================================\nRemove 1 Package\n\nInstalled size: 353 k\nDownloading packages:\nRunning transaction check\nRunning transaction test\nTransaction test succeeded\nRunning transaction\n Erasing : vsftpd-3.0.2-29.el7_9.x86_64 1/1 \nwarning: /etc/vsftpd/vsftpd.conf saved as /etc/vsftpd/vsftpd.conf.rpmsave\n Verifying : vsftpd-3.0.2-29.el7_9.x86_64 1/1 \n\nRemoved:\n vsftpd.x86_64 0:3.0.2-29.el7_9 \n\nComplete!\n
[root@node-137 ansible]# ansible db1 -m yum -a "name=vsftpd state=latest"
node-138 | CHANGED => {
...
Summary\n================================================================================\nInstall 1 Package\n\nTotal download size: 173 k\nInstalled size: 353 k\nDownloading packages:\nRunning transaction check\nRunning transaction test\nTransaction test succeeded\nRunning transaction\n Installing : vsftpd-3.0.2-29.el7_9.x86_64 1/1 \n Verifying : vsftpd-3.0.2-29.el7_9.x86_64 1/1 \n\nInstalled:\n vsftpd.x86_64 0:3.0.2-29.el7_9 \n\nComplete!\n
]
}
[root@node-137 ansible]# ansible db1 -m shell -a "yum list vsftpd"
...
Installed Packages
vsftpd.x86_64 3.0.2-29.el7_9 @updates
29.6 使用 service 模块管理服务
可以通过systemctl对服务进行启动、重启、关闭等操作,在ansible中可以调用service模块来实现对服务的管理,service模块常见的参数包括:
参数 | 说明 |
---|---|
name | 服务名称 |
enabled | 设置服务是否开机启动,值为yes或no,默认值为空 |
state | 用于启动或关闭服务,其值包括started、stopped、restarted等 |
以vsftpd为例演示
[root@node-137 ansible]# ansible db1 -m shell -a "systemctl is-active vsftpd"
node-138 | FAILED | rc=3 >>
unknownnon-zero return code
返回值为3,说明在node-138上vsftpd没有启动
启动vsftpd并设置为开机自启,
[root@node-137 ansible]# ansible db1 -m service -a "name=vsftpd enabled=yes state=started"
node-138 | CHANGED => {
"ansible_facts": {
...
[root@node-137 ansible]# ansible db1 -m shell -a "systemctl is-active vsftpd;systemctl is-enabled vsftpd"
node-138 | CHANGED | rc=0 >>
active
enabled