RHCE8 资料整理(九)一

RHCE8 资料整理

  • 第 九 篇 自动化管理工具ansible的使用
    • 第 28 章 ansible的使用
      • 28.1 安装ansible
      • 28.2 编写ansible.cfg和清单文件
      • 28.3 ansible的基本用法
    • 第 29 章 常用模块的使用(一)
      • 29.1 shell模块
      • 29.2 文件管理的file模块
      • 29.3 copy和fetch模式
      • 29.4 yum_repository模块
      • 29.5 使用yum模块管理软件
      • 29.6 使用 service 模块管理服务

第 九 篇 自动化管理工具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

你可能感兴趣的:(#,bash,shell整理,#,Ansible,ansible,linux)