Ansible部署常规应用实践及各模块详解示例

Ansible简介

Ansible是一种基于模块化的自动化工具,通过SSH协议进行远程管理。它的轻量级特性、易用性和可扩展性使其成为许多团队的首选工具,在实际项目中,使用Ansible进行部署可以大大简化重复性任务,提高效率,可以适用于自动化配置管理,应用程序部署,网络设备管理,,等等场景。

标准语法:

ansible <pattern_goes_here> -m <module_name> -a <arguments> -u <username> -s -U <sudo_username> -C -e <extra_vars> -i <inventory> --list-hosts

<pattern_goes_here>:
这里是用于匹配远程主机的模式,可以是主机名、IP地址,也可以是使用通配符的模式,比如web*表示匹配所有以web开头的主机。

-m <module_name>: 使用的模块名称,指定要在远程主机上执行的任务。

-a : 模块的参数,用于传递给指定模块的参数来执行特定任务。

-u : 指定连接到远程主机时要使用的用户名。

-s: 相当于在Linux系统下使用sudo命令,以特权用户的身份执行命令。

-U <sudo_username>: 使用sudo,指定要切换到的特权用户,相当于Linux下的sudo命令。

-C: 只检查不实际执行,用于测试命令的影响范围而不实际执行命令。

-e <extra_vars>: 引用外部参数,用于传递额外的变量给Ansible执行。

-i : 指定主机清单文件的位置,用于指定要管理的远程主机列表。

–list-hosts: 列出执行主机列表,用于显示将受到命令影响的主机列表。

实验环境:

  • Ansible 192.168.1.1
  • node01 192.168.1.2
  • node02 192.168.1.3

实验目的:

需要从Ansible管理主机本身免密SSH到其他所有node节点,并可以通过Ansible统一执行一些批量化的初始操作。

安装部署Ansible

管理机上安装ansible,这个很简单,执行下面的命令就行,node节点需要打开ssh服务,一般默认是开的,如果有问题看一下是不是缺少 sshd,需要安装下openssh-server。

yum install epel-release
yum install -y ansible
ansible --version

编辑配置文件,填写各主机IP
注:由于我这里是所有主机的SSH端口都改成了28882,所以这里配置文件也填了这个端口,如果没有改,还是22端口的话,不用加端口号
编辑命令:

vi /etc/ansible/hosts

配置参考: k8s是组名,可以自定义

[root@Ansible ~]# cat /etc/ansible/hosts 
# This is the default ansible 'hosts' file.
#
# It should live in /etc/ansible/hosts
#
#   - Comments begin with the '#' character
#   - Blank lines are ignored
#   - Groups of hosts are delimited by [header] elements
#   - You can enter hostnames or ip addresses
#   - A hostname/ip can be a member of multiple groups

# Ex 1: Ungrouped hosts, specify before any group headers.

## green.example.com
## blue.example.com
## 192.168.100.1
## 192.168.100.10
[k8s]
192.168.1.1 :28882
192.168.1.2 :28882
192.168.1.3 :28882

设置SSH无密码登录

ssh-keygen用于生成、管理和转换认证密钥,包括 RSA 和 DSA 两种密钥
密钥类型可以用 -t 选项指定。如果没有指定则默认生成用于SSH-2的RSA密钥
本次实验直接执行下面的命令默认就行,全程回车,有需要可以自行调整。

cd  /root/.ssh/
ssh-keygen

执行记录,供参考:

[root@Ansible .ssh]# ssh-keygen 
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa): 
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:SmUiKz+B2zfpSyGV1KGU1zZiivmmeWcfeFqJW1VyaFA root@Ansible
The key's randomart image is:
+---[RSA 2048]----+
|        oo.o .oEo|
|       o.o= + . o|
|    . .o*+ o . + |
|   . +o=..    .  |
|  o + +.S  o o   |
|   + o ==oo *    |
|    o .=oo B     |
|     .o...+      |
|       ..        |
+----[SHA256]-----+

生成的文件参考信息:

[root@Ansible ~]# cd /root/.ssh/
[root@Ansible .ssh]# ll
total 16
-rw-------. 1 root root  801 Jun  7 16:50 authorized_keys
-rw-------  1 root root 1675 Jun  7 16:44 id_rsa
-rw-r-----  1 root root  401 Jun  7 16:44 id_rsa.pub
-rw-r--r--  1 root root  549 Jun  7 16:53 known_hosts

SSH公钥文件分发

将Ansible 192.168.1.1 生成的 /root/.ssh/id_rsa.pub 这个文件复制到其他node节点的 /root/.ssh/ 下,然后附加写入到authorized_keys文件。我这里是通过 rz 和 sz 命令手动复制的
附加写入命令:cat id_rsa.pub >> authorized_keys
参考信息:

[root@node02 ~]# cd /root/.ssh/
[root@node02 ~]# cat id_rsa.pub >> authorized_keys
[root@node02 .ssh]# ll
total 8
-rw------- 1 root root 801 Jun  7 16:47 authorized_keys
-rw-r--r-- 1 root root 401 Jun  7 16:44 id_rsa.pub
[root@node01 ~]# cd /root/.ssh/
[root@node01 ~]# cat id_rsa.pub >> authorized_keys
[root@node01 .ssh]# ll
total 8
-rw------- 1 root root 801 Jun  7 16:77 authorized_keys
-rw-r--r-- 1 root root 401 Jun  7 16:56 id_rsa.pub

在Ansible主机执行ping检测

[root@Ansible ~]# ansible k8s -m ping
192.168.1.1 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    }, 
    "changed": false, 
    "ping": "pong"
}
192.168.1.2 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    }, 
    "changed": false, 
    "ping": "pong"
}
192.168.1.3 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    }, 
    "changed": false, 
    "ping": "pong"
}

测试正常

远程执行命令
在Ansible主机批量执行date,查看各主机时间

[root@Ansible ~]# ansible k8s -m command -a 'date'
192.168.1.1 | CHANGED | rc=0 >>
Wed Jun 12 11:36:35 CST 2024
192.168.1.2 | CHANGED | rc=0 >>
Wed Jun 12 11:36:35 CST 2024
192.168.1.3 | CHANGED | rc=0 >>
Wed Jun 12 11:36:35 CST 2024

查看磁盘空间并将内容传输到/tmp/df.txt中

[root@ansible ~]# ansible k8s -m shell -a 'df -h > /tmp/df.txt'
192.168.1.1 | CHANGED | rc=0 >>

192.168.1.2| CHANGED | rc=0 >>

192.168.1.3 | CHANGED | rc=0 >>

这里,可以会注意到 -m 的参数不同,shell模块,这意味着在远程主机上执行的命令将在一个交互式的shell环境中运行,这意味着可以使用重定向和管道等shell特性。command模块,这意味着在远程主机上执行的命令将在非交互式的环境中运行,不会启动一个完整的shell。这种方式适用于不需要交互式shell环境的简单命令。
shell模块更适合需要使用shell特性的复杂命令,而command模块更适合简单的命令。

当然,还有其他模块,这里就不逐一实践,具体的模块介绍参考下面:

Ansible常用模块详解

ansible [-m module_name] [-a args] [options] #ansible命令格式

指定主机组或ip地址 指定调用模块 传递给模块的参数

ansible-doc -l 查看所有模块

ansible-doc command 查看command模块详细信息

ansible-doc -s command 查看command模块详细用法

============================

Command模块
命令模块接受命令名称,后面是空格分隔的列表参数。给定的命令将在所有选定的节点上执行。它不会通过shell进行处理,比如$HOME和操作如”小于”<“,”>”, “|”, “;”,”&”‘ 工作(需要使用(shell)模块实现这些功能)。

action: command

chdir # 在执行命令之前,先切换到该目录

creates # 一个文件名,当这个文件存在,则该命令不执行,可以用来做判断

executable # 切换shell来执行命令,需要使用命令的绝对路径

free_form # 要执行的Linux指令,一般使用Ansible的-a参数代替。

removes # 一个文件名,这个文件不存在,则该命令不执行,与creates相反的判断

命令示例:
查看路径
ansible k8s -m command -a 'pwd'

============================

shell模块
执行的命令中有管道或者变量,就需要使用shell

action: shell

chdir # 执行之前,先cd到指定目录在执行命令

creates # 一个文件名,当这个文件存在,则该命令不执行

executable # 切换shell来执行命令,需要使用命令的绝对路径

free_form # 执行的命令

removes # 一个文件名,这个文件不存在,则该命令不执行

命令示例:
对/tmp/df.txt进行查看
ansible k8s -m shell -a 'cat /tmp/df.txt'

============================

copy模块
复制模块,将文件复制到被管理主机

action: copy

backup # 创建一个备份文件包括时间戳信息,如果以某种方式重创错了,还可以拿回原始文件

content # 取代src=,表示直接用此处指定的信息生成为目标文件内容

dest # 远程节点存放文件的路径,必须是绝对路径

directory_mode # 递归复制设置目录权限,默认为系统默认权限

force # 如果目标主机包含该文件,但内容不同,如果设置为yes,则强制覆盖,如果设置为no,则只有当目标主机的目标位置不存在该文件时,才复制。默认为yes

group # 复制到远程主机后,指定文件或目录的属组

mode # 复制到远程主机后,指定文件或目录权限,类似与chmod指明如 0644

owner # 复制到远程主机后,指定文件或目录属主

src # 要复制到远程主机的文件在本地的地址,可以是绝对路径,也可以是相对路径。如果路径是一个目录,它将递归复制。在这种情况下,如果路径使用”/”来结尾,则只复制目录里的内容,如果没有使用”/”来结尾,则包含目录在内的整个内容全部复制,类似于rsync。

命令示例:
将本地的/etc/fatab文件复制到目标主机的/tmp/ansible.log,属主为roo,属组为locy,权限为640,并备份
ansible k8s -m copy -a 'src=/etc/fstab dest=/tmp/ansible.log owner=root group=locy mode=640 backup=yes'

============================

cron模块
定时任务模块,设置管理节点生成定时任务

action: cron

backup # 如果设置,创建一个crontab备份

cron_file # 如果指定, 使用这个文件cron.d,而不是单个用户crontab

day # 日应该运行的工作( 1-31, *, */2, etc )

hour # 小时( 0-23, *, */2, etc )

job # 指明运行的命令是什么

minute # 分钟( 0-59, *, */2, etc )

month # 月( 1-12, *, */2, etc )

name # 定时任务描述

reboot # 任务在重启时运行,不建议使用,建议使用special_time

special_time # 特殊的时间范围,参数:reboot(重启时),annually(每年),monthly(每月),weekly(每周),daily(每天),hourly(每小时)

state # 指定状态,prsent表示添加定时任务,也是默认设置,absent表示删除定时任务

user # 以哪个用户的身份执行

weekday # 周( 0-6 for Sunday-Saturday, *, etc )

命令示例:
每天凌晨三点、四点、五点、六点将磁盘使用情况保存在/tmp/df.log
ansible k8s -m cron -a 'name="harddrive check" minute="15" hour="3,4,5,6" job="df -lh >> /tmp/df.log"'

============================

fetch模块
远程文件复制到本地

dest #保存文件的目录

fail_on_missing #当设置为yes时,如果源文件丢失,任务将会失败

flat #允许覆盖将主机名/路径/文件/文件附加到目的地的默认行为

src #获取远程系统上的文件。这必须是一个文件,而不是一个文件目录

validate_checksum #在获取文件之后验证源和目标校验和

命令示例:
将远程文件/tmp/df.txt复制到本地/root/下
ansible k8s -m fetch -a 'src=/tmp/df.txt dest=/root/'

============================

file
文件操作模块,设置文件属性

action: file

force # 需要在两种情况下强制创建软连接,一种是源文件不存在但之后会建立的情况下;另一种是目标连接已存在,需要先取消之前的软连接,有两个选项:yes|no

group # 设置文件或目录的属组

mode # 设置文件或目录的权限

owner # 设置文件或目录的属主

path # 必选项,定义文件或目录的路径

recurse # 递归设置文件的属性,只对目录有效

src # 要被链接到的路径,只应用与state=link的情况

state # directory:如果目录不存在,创建目录

命令示例:
将k8s组下的所有主机的/tmp/df.txt权限改为600属主属组为locy
ansible k8s -m file -a 'path=/tmp/df.txt state=touch mode="600" owner=locy group=locy'

============================

yum模块
基于yum源安装程序

action: yum

conf_file # yum的配置文件

disable_gpg_check # 关闭gpg_check

disablerepo # 不启用某个源

enablerepo # 启用某个源

name= # 指定要安装的包,如果有多个版本需要指定版本,否则安装最新的包

state # 安装(present),安装最新版(latest),卸载程序包(absent)

命令示例:
为k8s组所有主机安装nginx 且为最新版本
ansible k8s -m yum -a 'name=nginx state=latest'

============================

service
服务管理模块

action: service

arguments # 向服务传递的命令行参数

enabled # 设置服务开机自动启动,参数为yes|no

name # 控制服务的名称

pattern # 定义一个模式,如果通过status指令来查看服务的状态时,没有响应,就会通过ps指令在进程中根据该模式进行查找,如果匹配到,则认为该服务依然在运行

runlevel # 设置服务自启动级别

sleep # 如果执行了restarted,则在stop和start之间沉睡几秒钟

state # 启动started 关闭stopped 重新启动restarted 重载reloaded

命令示例:
k8s组所有主机重载nginx配置文件
ansible k8s -m service -a 'name=nginx state=reloaded'

============================

group
用户组模块,添加或删除组

action: group

gid # 设置组的GID号

name= # 管理组的名称

state # 指定组状态,默认为创建,设置值为absent为删除

system # 设置值为yes,表示为创建系统组

命令示例:
创建名为tom的组
ansible k8s -m group -a 'name=tom state=present'

============================

user
用户模块,管理用户帐号

action: user

comment # 用户的描述信息

createhome # 是否创建家目录

force # 在使用state=absent是, 行为与userdel –force一致.

group # 指定基本组

groups # 指定附加组,如果指定为(groups=)表示删除所有组

home # 指定用户家目录

login_class # 可以设置用户的登录类 FreeBSD, OpenBSD and NetBSD系统.

move_home # 如果设置为home=时, 试图将用户主目录移动到指定的目录

name # 指定用户名

non_unique # 该选项允许改变非唯一的用户ID值

password # 指定用户密码

remove # 在使用state=absent时, 行为是与userdel –remove一致

shell # 指定默认shell

state # 设置帐号状态,不指定为创建,指定值为absent表示删除

system # 当创建一个用户,设置这个用户是系统用户。这个设置不能更改现有用户

uid # 指定用户的uid

命令示例:
创建用户tom,用户信息为tom is tom,uid为1066,基本组为tom,附加组为wheel,shell类型为zshell,用户家目录为/home/tomhome
ansible k8s -m user -a 'name=tom comment="tom is tom" uid=1066 group=tom groups=wheel shell=/bin/zshell home=/home/tomhome'

============================

script
在指定节点运行服务端的脚本

命令示例:
在k8s组中所有主机执行/root/test.sh脚本
ansible k8s -m script -a '/root/test.sh'

============================

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值