Ansible-自动化运维工具

Ansible-自动化运维工具

一.Ansible介绍

1.Ansible是什么?

Ansible是一款使用Python开发,模块化,依赖于ssh协议实现的自动化统一配置管理工具,自动化主要体现在Ansible集成了丰富模块以及功能组件,可以通过一个命令完成一系列的操作,进而能减少重复性的工作和维护成本,可以提高工作效率。集合了众多老牌运维工具(puppet、chef、func、fabric)的优点,实现了批量系统配置、批量程序部署、批量运行命令等功能。

2.为什么要使用Ansible?

  1. 传统运维效率低,大多工作人为完成。
  2. 传统运维工作繁琐,容易出错。
  3. 传统运维每日重复做相同的事情。
  4. 传统运维没有标准化流程。
  5. 传统运维的脚本繁多,不能方便管理。

3.Ansible的工作原理

基于 SSH 和模块

Ansible 通过 SSH 协议连接到目标主机。这意味着它不需要在目标主机上安装额外的代理软件。它使用一系列的模块来执行具体的任务。这些模块是 Ansible 的核心功能单元,比如 “yum” 模块用于在基于 RPM 的系统(如 CentOS、Red Hat)上安装软件包,“apt” 模块用于 Debian 和 Ubuntu 系统的软件安装,“service” 模块用于管理系统服务等。当 Ansible 执行一个任务时,它会将相应的模块发送到目标主机,然后在目标主机上运行模块来完成任务。

Inventory 文件

Ansible 使用一个名为 “Inventory” 的文件来管理目标主机列表。这个文件可以是简单的文本格式,列出了主机的 IP 地址或主机名,也可以按照组进行分类。例如,你可以将所有的 Web 服务器放在一个名为 “web_servers” 的组中,将数据库服务器放在 “db_servers” 的组中。在 playbook 中,就可以针对不同的组执行不同的任务,比如只在 “web_servers” 组中安装和配置 Web 服务器软件。

4.Ansible的架构

(1).主机清单(Inventory):定义Ansible需要操作主机的范围。

(2).剧本(Playbook):将多个任务定义在剧本中,由 Ansible 自动执行,实现复杂的配置管理和应用部署。

(3).核心模块(Core Modules):连接主机并实现特定的操作,它依赖于具体的模块来做具体的事情。

(4).自定义模块(Custom Modules):当核心模块无法满足特定需求时,可以通过创建自定义模块来扩展 Ansible 的功能。

(5).连接插件(Connection Plugins):提供不同的连接方式,以适应不同环境的需求。

(6).插件(Plugins):丰富了 Ansible 的功能集,使得它可以更好地集成到现有的工作流和技术栈中。

#最重要的一点是:Ansible是模块化的,它所有的操作都依赖于模块。

5.Ansible的功能优势

(1).Ansible通过SSH连接到目标机器执行任务,不需要在这些机器上安装额外的客户端或代理。

(2).基于 YAML 的 Playbook 文件易于编写和理解,简单易用,不需要有编程基础。

(3).提供大量的内置模块,并支持用户自定义模块来扩展功能。

(4).每次运行 Playbook 都会得到相同的结果,不会因为重复执行而破坏系统状态。

(5).Ansible没有守护进程,不需要启动。

(6).日志集中在主控端,方便错误排查。

6.Ansible 的差异

(1).与Puppet的差异

Ansible:采用无代理架构,通过 SSH 协议来与被管理的节点进行通信并执行任务。

Puppet:是基于客户端 / 服务器(C/S)架构,需要在被管理的节点上安装 Puppet 代理软件。

Ansible:使用 YAML 编写 Playbook 来定义任务和配置。

Puppet:使用 DSL(领域特定语言)

Ansible:架构简单,易于部署和维护。

Puppet:需要设置 Master 和 Agent 架构相对复杂。

(2).与SaltStack的差异

Ansible:采用无代理架构,通过 SSH 协议来与被管理的节点进行通信并执行任务。

Saltstack:采用典型的主从架构,需要在被管理节点上安装 Salt Minion,它与 Salt Master 通过消息队列协议(如 ZeroMQ)进行通信。

Ansible:使用 YAML编写 Playbook来定义任务和配置。

Saltstack:的配置文件可以使用多种格式,包括 YAML 和自己独特的格式。

Ansible:架构简单,易于部署和维护。

SaltStack:需要设置 Master 和 Minion 架构相对复杂。

二.Ansible部署

1.Ansible集群节点规划

我们创建四台虚拟机server节点、host1节点、host2节点和host3节点

四个节点根据节点规划来修改主机名

我们在server节点下安装ansible、其余节点不进行配置

节点

Ip地址

Server节点

192.168.77.171

Host1节点

192.168.77.172

Host2节点

192.168.77.173

Host3节点

192.168.77.174

2.安装Ansible

Ansible仓库默认不在yum仓库中,因此需要使用下面的命令启用epel仓库。

# 拉取epel扩展源

[root@server ~]# yum -y install epel-release

安装epel-release源后,安装Ansible,并检查是否安装成功

# 安装Ansible

[root@server ~]# yum -y install ansible

# 查看Ansible版本

[root@server ~]# ansible --version

3.配置免密登入

其实就是配置从管理节点到远程主机之间基于key(无密码的方式)的SSH连接

(1).生成密钥对

在server节点上生成密钥对

[root@server ~]# ssh-keygen

Generating public/private rsa key pair.

Enter file in which to save the key (/root/.ssh/id_rsa):

Created directory '/root/.ssh'.

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:G/Ezen/e8puqFtJPG5jrUeBoQ4iCyUtR52MmYftRm6k root@server

The key's randomart image is:

+---[RSA 2048]----+

| ..+ . .         |

|. = = o =        |

| = + B =.. .     |

|. . * + .oo .    |

| .   E  S+=.o.   |

|        .=.B.o   |

|        o o.= o  |

|         . +.oo..|

|          ooo+o=+|

+----[SHA256]-----+

(2).将公钥发给管制节点

三个受管制的节点依次发送

[root@server ~]# ssh-copy-id 192.168.77.172

/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/root/.ssh/id_rsa.pub"

/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed

/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys

root@192.168.77.172's password:      #这里输入host1节点的密码

Number of key(s) added: 1

Now try logging into the machine, with:   "ssh '192.168.77.172'"

and check to make sure that only the key(s) you wanted were added.

(3).测试免密登入

在server节点上登入三个节点,测试无密钥

[root@server ~]# ssh 192.168.77.172

Last login: Thu Nov 28 08:05:20 2024 from 192.168.77.1

[root@host1 ~]# exit

登出

Connection to 192.168.77.172 closed.

[root@server ~]# ssh 192.168.77.173

Last login: Thu Nov 28 08:05:24 2024 from 192.168.77.1

[root@host2 ~]# exit

登出

Connection to 192.168.77.173 closed.

[root@server ~]# ssh 192.168.77.174

Last login: Thu Nov 28 08:24:25 2024 from 192.168.77.171

[root@host3 ~]# exit

登出

Connection to 192.168.77.174 closed.

4.Ansible主机清单

(1).什么是Host Inventory(主机清单)

Host Inventory定义了你想要管理和操作的远程主机及其相关信息。Inventory 文件告诉 Ansible 要连接哪些主机、如何连接这些主机以及它们之间的分组信息。通过 Inventory,你可以轻松地对单个主机或一组主机执行自动化任务。

(2).Host Inventory配置文件

主机清单文件默认位置是:/etc/ansible/hosts

可以在ansible的配置文件中修改为其他的文件

# 查看ansible的配置文件路径

[root@server ~]# rpm -qc ansible

/etc/ansible/ansible.cfg                 #ansible配置文件路径

/etc/ansible/hosts                         #主机清单位置 默认是/etc/ansible/hosts

ansible.cfg常用配置解析

[defaults]

#inventory      = /etc/ansible/hosts                       #主机列表配置文件

#library        = /usr/share/my_modules/              #库文件存放目录

#remote_tmp     = ~/.ansible/tmp                      #临时py文件存放在远程主机目录

#local_tmp      = ~/.ansible/tmp                            #本机的临时执行目录

#forks          = 5                                                #默认并发数

#sudo_user      = root                                           #默认sudo用户

#ask_sudo_pass = True                                      #每次执行是否询问sudo的ssh密码

#ask_pass      = True                                            #每次执行是否询问ssh密码

#remote_port    = 22                                            #远程主机端口

#host_key_checking = False                                      #跳过检查主机指纹

#log_path = /var/log/ansible.log                               #ansible日志

# 普通用户提权操作

[privilege_escalation]

#become=True

#become_method=sudo

#become_user=root

#become_ask_pass=False

5.Ansible主机清单配置规则

(在/etc/ansible/hosts中配置)

主机配置规则:

  1. 可以使用主机名(域名)或IP地址
  2. 支持主机名通配以及正则表达式
  3. 支持指定主机定义不同的变量,包括密码、端口号、用户等等
  4. 如果配置过无密钥就不需要在文件中指定密码了 没有配置过的需要指定密码

(1).备份主机清单文件

我们先备份一下主机清单文件,然后清空hosts文件

[root@server ~]# cd /etc/ansible/

[root@server ansible]# ls

ansible.cfg  hosts  roles

[root@server ansible]# cp -f hosts hosts.bak

[root@server ansible]# ls

ansible.cfg  hosts  hosts.bak  roles

(2).单主机配置

# IP + 用户密码

[root@server ~]# vi /etc/ansible/hosts

[host01]

192.168.77.172 ansible_ssh_pass='root'

[host02]

192.168.77.173 ansible_ssh_pass='root'

# 测试:ansible 主机名 -m 指定模块

[root@server ~]# ansible host01 -m ping

192.168.77.172 | SUCCESS => {

    "ansible_facts": {

        "discovered_interpreter_python": "/usr/bin/python"

    },

    "changed": false,

    "ping": "pong"

}

[root@server ~]# ansible host02 -m ping

192.168.77.173 | SUCCESS => {

    "ansible_facts": {

        "discovered_interpreter_python": "/usr/bin/python"

    },

    "changed": false,

    "ping": "pong"

}

(3).多主机配置

# IP + 密码

[root@server ~]# vi /etc/ansible/hosts

[host]

192.168.77.172 ansible_ssh_pass=’root’

192.168.77.173 ansible_ssh_pass=’root’

# 测试:ansible 主机名 -m 指定模块

[root@server ~]# ansible host -m ping

192.168.77.172 | SUCCESS => {

    "ansible_facts": {

        "discovered_interpreter_python": "/usr/bin/python"

    },

    "changed": false,

    "ping": "pong"

}

192.168.77.173 | SUCCESS => {

    "ansible_facts": {

        "discovered_interpreter_python": "/usr/bin/python"

    },

    "changed": false,

    "ping": "pong"

}

(4).主机组

对组定义变量 [组名:vars]

# 主机组变量 + 主机 + 密码

[root@server ~]# vi /etc/ansible/hosts

[host_group]

192.168.77.172

192.168.77.173

[host_group:vars]

ansible_ssh_pass='root'

# 测试:ansible 主机名 -m 指定模块、

[root@server ~]# ansible host_group -m ping

192.168.77.172 | SUCCESS => {

    "ansible_facts": {

        "discovered_interpreter_python": "/usr/bin/python"

    },

    "changed": false,

    "ping": "pong"

}

192.168.77.173 | SUCCESS => {

    "ansible_facts": {

        "discovered_interpreter_python": "/usr/bin/python"

    },

    "changed": false,

    "ping": "pong"

}

嵌套 [组名:children]

#定义多组,多组嵌套

# hostservers组包括两个子组[apache,nginx]

#定义总IP

[host_group]

192.168.77.172

192.168.77.173

192.168.77.174

#apache有两台

[apache]

192.168.77.172

192.168.77.173

#nginx有一台

[nginx]

192.168.77.174

#定义密码

[apache:vars]

ansible_ssh_pass='root'

[nginx:vars]

ansible_ssh_pass='root'

[host_group:children]

apache

nginx

# 测试:ansible 主机名 -m 指定模块

[root@server ~]# ansible host_group -m ping

192.168.77.172 | SUCCESS => {

    "ansible_facts": {

        "discovered_interpreter_python": "/usr/bin/python"

    },

    "changed": false,

    "ping": "pong"

}

192.168.77.173 | SUCCESS => {

    "ansible_facts": {

        "discovered_interpreter_python": "/usr/bin/python"

    },

    "changed": false,

    "ping": "pong"

}

192.168.77.174 | SUCCESS => {

    "ansible_facts": {

        "discovered_interpreter_python": "/usr/bin/python"

    },

    "changed": false,

    "ping": "pong"

}

[root@server ~]# ansible apache -m ping

192.168.77.172 | SUCCESS => {

    "ansible_facts": {

        "discovered_interpreter_python": "/usr/bin/python"

    },

    "changed": false,

    "ping": "pong"

}

192.168.77.173 | SUCCESS => {

    "ansible_facts": {

        "discovered_interpreter_python": "/usr/bin/python"

    },

    "changed": false,

    "ping": "pong"

}

[root@server ~]# ansible nginx -m ping

192.168.77.174 | SUCCESS => {

    "ansible_facts": {

        "discovered_interpreter_python": "/usr/bin/python"

    },

    "changed": false,

    "ping": "pong"

}

三. Ansible中的ad-hoc模式

Ansible的ad-hoc模式是一种简单、快速地在一个或多个远程主机上执行单个任务的方式。它不需要像Playbook模式那样编写复杂的YAML脚本,适用于一次性的、简单的操作,例如快速检查远程主机的状态、安装一个软件包或者重启一个服务等。

1.Ansible参数

(1).Ansible参数

ansible 主机名 -m "模块" -a "具体命令"

# 常用参数

-m                                 #指定要使用的模块名称,不指定默认使用command模块

-a                                   #为指定的模块提供参数。不同的模块有不同的参数需求。

--syntax-check               #验证语法

# 不常用参数

--version                        #ansible版本信息

-v                                   #显示详细信息

-i                                    #指定主机清单文件的位置,默认是在/etc/ansible/hosts

-k                                   #提示输入ssh密码,而不使用基于ssh的密钥验证

-C                                  #模拟执行测试,不会真的改变系统状态

-T                                   #设置远程命令执行的最大超时时间,默认值是10秒

-f                                   #控制Ansible同时并行处理多少台主机,默认情况下是5台

(2).Ansible帮助命令

ansible-doc                                  #帮助命令

ansible-doc -l                              #列出所有的模块

ansible-doc 模块名                     #查看模块的详细信息

ansible-doc 模块名 -s                #查看模块的选项使用说明

2.ad-hoc模式执行流程

模块执行的工作流程:

  1. 主控端命令行执行命令
  2. 将模块拷贝到受控端
  3. 按照模块定义的操作在受控端执行
  4. 返回信息,删除受控端模块

Ansible执行命令的返回值颜色

绿色:执行命令成功,只查看了信息,没有修改

黄色:执行命令成功,并且对目标主机做了修改

红色:执行失败,报错

粉色:警告信息

紫色:表示对命令发错的操作有警告信息

3.Ansible中常见的返回值

返回值

返回值含义

changed

几乎所有的Ansible模块都会返回该变量,表示模块是否对远程主机执行了修改操作

Failed

如果模块未能执行完成,将返回failed为true

Msg

模块执行失败的原因,常见的错误如ssh连接失败

Rc

与命令行工具相关的模块会返回rc,表示执行Linux命令的状态码

stdout

与rc类似,返回的是标准输出的结果

stderr

与rc类似,返回的是标准错误的结果

backup_file

所有存在backup选项的模块,用来返回备份文件的路径

results

应用在playbook中存在循环的情况,返回多个结果

4.常用模块

我们先在主机清单中添加几台主机用来测试

[host1]

192.168.77.172

[host2]

192.168.77.173

[host3]

192.168.77.174

[host_group]

192.168.77.172

192.168.77.173

192.168.77.174

(1).ping模块

ping模块:用于检查指定节点机器是否连通,用法很简单

语法:

anshible 主机名 -m ping

案例:

# 查看是否能够ping通host1节点

[root@server ~]# ansible host1 -m ping

(2).command模块

command模块:用于在远程主机上执行命令,不支持管道

语法:

ansible 主机名 -m command -a "具体命令"

ansible 主机名 -a "具体命令"

# ansible默认就是使用command模块。

案例:

# 在受管制主机host1的/opt/目录下创建文件

[root@server ~]# ansible host1 -m command -a 'touch /opt/qzj'

(3).shell模块

shell模块:用于远程执行命令也可以执行受控机上的脚本,支持管道和重定向

语法:

ansible 主机名 -m shell -a "具体命令"

案例:

# 远程执行脚本

# 首先在host1节点上创建一个shell脚本1.sh,内容为echo `date`

# 赋予执行权限

chmod +x 1.sh

# 然后在server节点上执行该脚本

[root@server ~]# ansible host1 -m shell -a '/root/1.sh'

# 查看host_group组远程主机的系统版本

[root@server ~]# ansible host_group -m shell -a 'cat /etc/os-release | grep PRETTY_NAME | cut -d "=" -f2'

(4).raw模块

raw模块:ssh登入,再执行,用于在远程主机上直接执行任意命令

语法:

ansible 主机名 -m raw -a "具体命令"

案例:

# 查看host组的root目录下

[root@server ~]# ansible host_group -m raw -a "ls /root/"

(5).script模块

Script模块用与远程执行本地脚本

语法:

ansible 主机名 -m script -a "脚本文件的本地路径"

案例:

# 在host组上远程执行脚本

# 我们先在server节点上创建一个脚本2.sh,内容为echo "测试"

# 赋予执行权限

[root@server ~]# ansible host_group -m script -a '/root/2.sh'

请注意,script模块会将脚本文件传输到目标主机,然后在目标主机上执行它。因此,确保脚本文件在控制节点上可用,并且具有可执行权限(使用chmod +x命令添加执行权限)。

(6).yum模块

Yum模块:用于远程安装软件

语法:

ansible 主机名 -m yum -a "name=软件包名 state=安装/卸载/更新"

name=软件包名,多个软件包用逗号隔开

state=installed/present安装、removed/absent卸载、lastest更新

yum模块的更多使用可以使用ansible-doc yum来查看

案例:

# 我们在host1节点上安装一个nginx服务和netstat命令

[root@server ~]# ansible host1 -m yum -a 'name=nginx,net-tools state=installed'

我们可以看到nginx服务和netstat命令可以正常使用

(7).copy模块

copy模块:主要是将本地(执行 Ansible 任务的控制节点)的文件或目录复制到远程的host主机(被管理节点)。

语法:

ansible 主机名 -m copy -a "src=源文件路径及文件 dest=目标文件路径"

常用参数:

src=源文件路径

dest=目标文件路径

contest=指定文件内容,只有目标文件;如果文件不存在会创建

owner=指定属主

group=指定属组

mode=指定权限

copy模块的更多使用可以使用ansible-doc copy来查看

案例:

# 将server节点上的2.sh文件复制到host1上

[root@server ~]# ansible host1 -m copy -a 'src=/root/2.sh dest=/root/'

我们可以看到2.sh文件已经复制到host1节点上

(8).file模块

file模块:主要用于设置远程主机上的文件、软链接和文件夹的权限,也可以用来创建和删除他们。

语法:

ansible 主机名 -m file -a "操作内容"

常用参数:

path:指定路径

src:源文件路径

recurse:递归授权

owner:指定属主

group:指定属组

mode:指定权限

state:指定文件的状态

directory:在远端创建目录

touch:在远端创建文件

link:创建软连接

hard:创建硬连接

absent:表示删除文件或目录

案例:

# 在host1上创建一个目录和一个文件

[root@server ~]# ansible host1 -m file -a 'path=/opt/123 state=directory'

[root@server ~]# ansible host1 -m file -a 'path=/opt/1.txt state=touch'

我们在host1节点上可以看到目录和文件已经被创建

(9).service模块

service模块:用于管理系统服务(如启动、停止、重启服务等)。

语法:

ansible 主机名 -m service -a "name=服务名称 state=服务操作 enabled=是否设置开机自启"

name:定义要启动服务的名称

state:指定服务状态

常用参数:

started:启动服务(幂等)

stopped:停止服务(幂等)

restarted:重启服务

reloaded:重载配置

enabled:开机自启

案例:

# 启动host1上的nginx服务并设置开机自启

[root@server ~]# ansible host1 -m service -a 'name=nginx state=started enabled=yes'

# 查看host1节点的nginx状态

[root@server ~]# ansible host1 -m shell -a 'systemctl status nginx'

# 关闭nginx服务

[root@server ~]# ansible host1 -m service -a 'name=nginx state=stopped'

# 查看host1节点的nginx状态

[root@server ~]# ansible host1 -m shell -a 'systemctl status nginx'

(10).cron模块

cron模块:用于设置定时任务

语法:

ansible 主机名 -m cron -a "操作内容"

常用参数:

name:注释说明

minute、hour、day、month、weekday(分、时、日、月、周)

user:指定用户

job:操作的指令

state:进行的操作

present:创建

absent:删除

案例:

# 在host1节点上设置一个定时脚本然后删除掉

# 设置定时执行统计脚本(每一个小时执行一次,使用root用户)

[root@server ~]# ansible host1 -m cron -a "name="每小时执行一次统计脚本" minute=0 hour=*/1 day=* month=* weekday=* user=root job='/bin/bash /root/3.sh' state=present"

# 查看定时任务

[root@server ~]# ansible host1 -m shell -a 'crontab -l'

# 删除指定的定时任务

[root@server ~]# ansible host1 -m cron -a "name="每小时执行一次统计脚本" minute=0 hour=*/1 day=* month=* weekday=* user=root job='/bin/bash /root/3.sh' state=absent"

#查看定时任务

[root@server ~]# ansible host1 -m shell -a 'crontab -l'

(11).mount模块

mount模块:用于管理设备挂载与卸载

语法:

ansible 主机名 -m mount -a "操作内容"

常用参数:

src:指定挂载源

path:指定挂载点 (挂载点不存在会自动创建)

fstype:指定文件系统类型

opts:挂载参数,默认不写为:defaults

dump:是否备份:0表示不进行备份,默认为0

passno:文件系统检测:0表示不进行文件系统检测,默认为0

state:操作

present:写入fstab,但实际没有挂载,需要重启服务器

absent:取消临时挂载,并且删除fstab

mounted:写入fstab,并且直接挂载了(常用)

unmounted:临时取消挂载,但是没有删除fstab,重启服务器之后就会恢复(常用)

案例:

# 临时取消挂载在data的/dev/sdb(常用),不会删除fstab

[root@server ~]# ansible host1 -m mount -a "src=/dev/sdb path=/data/ state=unmounted"

# 取消挂载在data的/dev/sdb,并且直接删除fstab中的单独配置

[root@server ~]# ansible host1 -m mount -a "src=/dev/sdb path=/data/ state=absent"

# 添加一个挂载写入fstab,但实际没有挂载,需要重启服务器,重启完就会自动挂载上

[root@server ~]# ansible host1 -m mount -a "src=/dev/sdb path=/data fstype=xfs opts=defaults dump=0 passno=0 state=present"

# 添加一个挂载写入fstab,并且直接挂载上(常用)

[root@server ~]# ansible host1 -m mount -a "src=/dev/sdb path=/data fstype=xfs state=mounted"

(12).user/group模块

user模块:用于管理远程系统上的用户账户,包括创建、修改和删除用户。

group模块:用于在受控机上添加或删除组。

语法:

ansible 主机名 -m user -a "操作内容"

ansible 主机名 -m group -a "操作内容"

常用参数:

name:指定用户名

system:如果为 yes,则创建用户时设置用户为系统用户,默认为 no

uid:指定用户的用户UID

gid:指定用户的组GID

group:指定用户所属组

groups:指定用户所属的其他组

home:指定用户的家目录

shell:指定用户的登录shell

password:指定用户的密码(已加密的密码)

append:如果为yes,则添加用户到组而不是替换,默认为no

remove:当 state 为 absent 时,是否删除用户的家目录和邮件别名,默认为 no

move_home:如果为yes,则在更改用户的主目录时移动用户的文件,默认为no

create_home:如果为yes,则创建用户的主目录,默认为yes

update_password:如果为always,则始终更新密码,默认为on_create

state:指定用户账户的状态,可以是以下之一:

present:创建用户或组

absent:删除用户或组

locked:锁定用户账户

unlocked:解锁用户账户

password:仅更改用户的密码

案例:

# 创建用户,使用user模块创建一个名为qiuzj的新用户

[root@server ~]# ansible host1 -m user -a "name=qiuzj state=present"

# 查看

[root@server ~]# ansible host1 -m shell -a "tail -1 /etc/passwd"

# 删除用户和home家目录,使用 user 模块删除一个名为qiuzj的用户

[root@server ~]# ansible host1 -m user -a "name=qiuzj remove=yes state=absent"

# 查看

[root@server ~]# ansible host1 -m shell -a "tail -1 /etc/passwd"

# 创建组,使用 group 模块创建一个名为 mygroup 的新组:

[root@server ~]# ansible host1 -m group -a "name=mygroup state=present"

# 查看

[root@server ~]# ansible host1 -m shell -a "tail -1 /etc/group"

# 删除组,使用 group 模块删除一个名为 mygroup 的组:

[root@server ~]# ansible host1 -m group -a "name=mygroup state=absent"

# 查看

[root@server ~]# ansible host1 -m shell -a "tail -1 /etc/group"

# 再将上面的用户和用户组在创建一遍;

[root@server ~]# ansible host1 -m user -a "name=qiuzj state=present"

[root@server ~]# ansible host1 -m group -a "name=mygroup state=present"

# 添加用户到组,使用 user 模块将用户qiuzj添加到组mygroup:

[root@server ~]# ansible host1 -m user -a "name=qiuzj group=mygroup append=yes"

# 查看

[root@server ~]# ansible host1 -m shell -a "groups qiuzj"

(13).unarchive模块

unarchive模块:用于解压归档文件,它支持多种常见的归档格式,如.tar、.tar.gz、.zip等。

unarchive模块,这个模块有两种用法:

1、将ansible主机上的压缩包在本地解压缩后传到远程主机上,这种情况下,copy=yes.本地解压缩,解压缩位置不是默认的目录,没找到或传完删了后传到远程主机

2、将远程主机上的某个压缩包解压缩到指定路径下。这种情况下,需要设置copy=no远程主机上面的操作,不涉及ansible服务端

语法:

ansible 主机名 -m unarchive -a "src=源路径 dest=目标路径 其他参数"

常用参数:

copy:默认为no,当copy=yes,那么拷贝的文件是从ansible主机复制到远程主机上而不是在原地解压缩,如果设置为copy=no,那么会在远程主机上寻找src源文件

src:源路径,可以是ansible主机上的路径,也可以是远程主机上的路径,如果是远程主机上的路径,则需要设置copy=no

dest:指定了解压缩后文件的目标目录

mode:设置解压缩后的文件权限,可以使用数字或符号模式,例如 "0644" 或 "u=rw,go=r"

list_files:默认值为no,如果设置为yes,解压同时,返回压缩包的文件列表

remote_src:如果设置为 yes,则表示 src 参数是远程主机上的路径

extra_opts: 允许您指定解压缩命令的额外选项。这对于一些特定格式的存档文件非常有用

creates: 如果指定了此选项,只有在 creates 中指定的文件或目录不存在时,才会执行解压缩操作

owner: 设置解压缩后文件的所有者

group: 设置解压缩后文件的所属组

案例:

# 将jdk-8u271-linux-x64.tar.gz复制到server节点下的root目录下并解压

[root@server ~]# ansible host1 -m unarchive -a "src=/root/jdk-8u271-linux-x64.tar.gz dest=/root"

# 查看

[root@server ~]# ansible host1 -m shell -a "ls"

(14).get_url模块

get_url模块:用来下载文件

语法:

ansible 主机名 -m get_url -a "url=远程下载的url dest=保存路径 其他参数"

常用参数:

url (必需): 指定要下载文件的URL。这是一个必需参数

dest (必需): 指定文件将保存到本地目标主机上的目标路径。这是一个必需参数

force (可选): 如果设置为 yes,将强制下载文件,即使文件已经存在。默认为 no

checksum (可选): 提供要下载文件的校验和,以确保文件完整性

backup (可选): 如果设置为 yes,将在下载之前备份现有文件。默认为 no

timeout (可选): 设置下载文件的超时时间(秒)

url_username (可选): 如果目标URL需要身份验证,可以提供用户名

url_password (可选): 如果目标URL需要身份验证,可以提供密码

owner (可选): 设置下载后文件的所有者

group (可选): 设置下载后文件的所属组

mode (可选): 设置下载后文件的权限模式

案例:

[root@server ~]# ansible host1 -m get_url -a "url=https://blog.youkuaiyun.com/2402_85534286/article/details/143182911?spm=1001.2014.3001.5501 dest=/home/csdn.txt"

在host1节点上的/home/csdn.txt文件中可以看到网站信息

(15).setup模块

setup 模块:它用于获取目标主机的系统信息和事实(facts),并将这些信息返回到 Ansible Playbook 中,以供后续任务使用。setup 模块通常不需要额外的参数,因为它会自动获取系统信息。

语法:

ansible 主机名 -m setup -a "参数=操作"

常用参数:

filter:用于过滤收集的信息,只收集特定的变量

gather_subset:用于指定要收集的子集。默认情况下,setup 模块会收集所有标准信息

fact_path:指定自定义事实文件的路径

filter常用特定信息:

系统和操作系统相关

  • ansible_os_family:操作系统的家族名称,如 "RedHat", "Debian" 等。
  • ansible_distribution:具体的系统名称,如 "CentOS", "Ubuntu" 等。
  • ansible_distribution_version:系统的版本号。
  • ansible_distribution_major_version:系统的主要版本号。
  • ansible_system:系统类型,通常是 "Linux" 或 "Windows"。
  • ansible_kernel:内核版本。
  • ansible_architecture:系统的架构,如 "x86_64"。
  • ansible_date_time:获取到控制节点的时间
  • ansible_machine:系统的架构
  • ansible_pkg_mgr:系统的包管理工具
  • ansible_python:系统上的python

网络相关

  • ansible_default_ipv4.address:默认 IPv4 地址。
  • ansible_all_ipv4_addresses:所有 IPv4 地址的列表。
  • ansible_all_ipv6_addresses:所有 IPv6 地址的列表。
  • ansible_hostname:系统的主机名。
  • ansible_fqdn:完全限定域名(FQDN)。
  • ansible_domain:域名部分。
  • ansible_nodename:节点名,可能是主机名或 FQDN。
  • ansible_device_links:网络接口链接信息。

硬件相关

  • ansible_processor_vcpus:虚拟 CPU 数量。
  • ansible_memtotal_mb:总内存大小(MB)。
  • ansible_devices:磁盘设备信息。
  • ansible_mounts:挂载点信息。

用户和权限相关

  • ansible_env:环境变量。
  • ansible_user_id:当前用户的 ID。
  • ansible_user_dir:当前用户的主目录。

gather_subset收集的子集:

all(全部)

min(最小集合)

hardware(硬件信息)

network(网络信息)

virtual(虚拟化信息)

ohai(类似Chef Ohai的扩展信息)

facter(使用Facter收集的信息)

案例:

# 查看host1节点的系统时间

[root@server ~]# ansible host1 -m setup -a "filter=ansible_date_time"

# 将查询到的信息保存

[root@server ~]# ansible host1 -m setup -a "filter=ansible_date_time" --tree /home

保存的信息存放在了server控制节点的/home目录下

至此,Ansible的介绍、安装方式和Ansible模块的基本使用就结束了,下一期将会是是playbook模式的详解。下次再见。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值