ansible自动化运维(一)简介及清单,模块

相关文章
ansible自动化运维(二)playbook模式详解-CSDN博客
ansible自动化运维(三)jinja2模板&&roles角色管理-CSDN博客
ansible自动化运维(四)运维实战-CSDN博客

ansible自动化运维工具

1.什么是自动化运维

自动化运维是指将日常运维的、大量的重复性工作自动化,把手工执行的工作,通过梳理分析,进行逻辑分解,借助平台或工具转为自动化操作。自动化是it运维工作的升华,it运维自动化不单纯是一个维护的过程,更是一个管理的提升过程,是运维更高层次,也是未来的发展趋势。

1.1运维自动化解决的问题

  • 项目整体工作效率提升;
  • 减少人为误操作;
  • 方便信息传递,配置类信息聚合,信息链更完整;
  • 事务留痕,方便跟踪,追述;
  • 运维工作更加轻松、灵动;
  • 提升运维工作价值,管理更多资源,更多服务对象;

1.2自动化运维分类工具

  1. 系统安装:PXE,Cobbert
  2. 应用程序配置:Puppet,Ansible,Saltstack
  3. 命令执行与控制:Fabric,Func,Ansible
  4. 程序发布:git/svn(版本管理),Jenkins/Gitlab-runner(持续集成)

1.3自动化运维工具对比

此处只对比Puppet,Ansible,Saltstack

|------------|--------------------------------------------|----------------------------------|------------------------------------|
| | Puppet | Saltstack | Ansible |
| 开发语言 | Ruby语言 | Python语言 | Python |
| 是否支持客户端 | 有 | 有(salt-ssh无客户端) | 无 |
| 是否支持二次开发 | 不支持 | 支持 | 支持 |
| 通信加密 | 标准的SSL加密 | AES加密 | OpenSSH |
| 平台支持 | AIX,BSD,HP-UX,Linux,MacOSX,Solaris,Windows | BSD,Linux,MacOSX,Solaris,Windows | AIX,BSD,HP-UX,Linux,MacOSX,Solaris |
| 是否提供web UI | 是 | 是 | 商用提供 |
| 配置文件语法 | Ruby语法格式 | YAMl | YUML |
| 命令行执行 | 不支持(配置实现) | 支持 | 支持 |

2.Ansible介绍

Ansible是一款自动化运维工具,基于Python开发,集合了众多运维工具(puppet、cfengine、chef、func、fabric)的优点,实现了批量系统配置、批量程序部署、批量运行命令等功能。

Ansible是基于模块工作的,本身没有批量部署的能力。真正具有批量部署的是Ansible所运行的模块Ansible只是提供一种框架。

主要包括:

(1) 连接插件connection plugins:负责和被监控端实现通信;

(2) host inventory:指定操作的主机,是一个配置文件里面定义监控的主机;

(3) 各种模块核心模块、command模块、自定义模块;

(4) 借助于插件完成记录日志邮件等功能;

(5) playbook:剧本执行多个任务时,非必需可以让节点一次性运行多个任务。

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)加载配置文件: Ansible 默认查找 /etc/ansible/ansible.cfg 配置文件,这个文件包含了Ansible运行时的行为设定,如连接方式、插件路径等。

(2)解析Inventory: Ansible 使用 Inventory 文件(默认是 /etc/ansible/hosts)来确定需要操作的目标主机或主机组。

(3)编译Playbook或命令: Ansible 准备执行的Playbook或直接执行的Ad-Hoc命令,并解析其中的任务和模块调用。

(4)模块加载与执行策略准备: 对于每个任务,Ansible 加载相应的模块(如 command 模块),并准备执行上下文,包括变量、环境等。

(5)生成并传输临时脚本: Ansible 会根据任务和模块生成一个或多个临时的Python脚本,并通过SSH连接传输到目标主机的临时目录,通常位于目标用户的 ~/.ansible/tmp/ansible-tmp-<UNIQUE_ID>/ 目录下。

(6)赋予执行权限: 在目标主机上,Ansible 会给这个临时Python脚本加上执行权限,以便能够运行。

(7)执行远程脚本: Ansible 通过SSH在目标主机上执行这个临时脚本,并收集执行结果。

结果收集与处理: 执行完毕后,各个主机的执行结果被收集并汇总,Ansible根据这些结果决定是否继续执行后续任务,或是根据Playbook中的错误处理逻辑(如 rescue 和 always 块)进行操作。

(8)清理: 一旦任务执行完成,无论成功还是失败,Ansible 会清理目标主机上的临时文件,包括删除之前上传的Python脚本。

(9)退出与报告: 清理完成后。

5.Ansible模式

Ansible中有两种模式:分别是ad-hoc模式和playbook模式;

  1. ad-hoc:简而言之,就是"临时命令",不会保存;
  2. playbook"翻译过来就是剧本,在文件中保存执行的流程;

Ansible与SaltStack对比:

|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| 相同点: 1. 都是使用python语言开发的 2. 都具有二次开发的特性 3. 执行命令都支持Ad-hoc模式(临时文件,执行完就返回) 4. 都可以通过YAML格式文件批量执行 5. 返回的结果都是JSON数据,便于后续处理 不同点: 1. Ansible部署更简单,没有客户端,而Saltstack有客户端; 2. Saltstack的响应速度要比Ansible更快;Ansible通过SSH协议实现,Saltstack使用了ZeroMQ实现通信; 3. Ansible更加安全,SSH加密传输 4. Saltstack对于Windows支持更友好,Ansible通过Power Shell来管理Windows 5. Ansible维护简单,没有客户端,没有守护进程;saltstack需要有Master和minion,主机要启动一个守护进程。 |

6.Ansible的架构

  1. 主机清单inventory定义Ansible需要操作主机的范围
  2. 剧本playbook Ansible的配置文件,将多个任务定义在剧本中,由ansible自动执行
  3. 核心模块Core Modules连接主机实现操作,它依赖于具体的模块来做具体的事情
  4. 自定义模块Custom Modules根据自己的需求编写具体的模块
  5. 连接插件Connection Plugins 用于连接主机,用来连接被管理端
  6. 插件Plugins完成模块功能的补充

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

Ansible集群搭建

准备:

|----------|----------------|
| Server节点 | 192.168.213.10 |
| Host1节点 | 192.168.213.11 |
| Host2节点 | 192.168.213.12 |
| Host3节点 | 192.168.213.13 |

1.编写hosts文件

个主机根据节点规划更改主机名,并编写映射文件

|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| [root@server ~]# cat /etc/hosts 127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6 192.168.213.10 server 192.168.213.11 host1 192.168.213.12 host2 192.168.213.13 host3 |

2.配置免密登录

主节点生成密钥对

|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| [root@server ~]# ssh-keygen -P "" -t rsa Generating public/private rsa key pair. Enter file in which to save the key (/root/.ssh/id_rsa): Created directory '/root/.ssh'. 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:NYJeAQrXDBOcdJ4Adyy/2nkXn5ONq4xWJlYe6c405kc root@host1 The key's randomart image is: +---[RSA 2048]----+ | o+OB+.. | | ++B+o . | | .o+ o o. | | ... o+. | | ..S+ . | | . o X E | | o o X = = | | . o oo= B . | | o..oo.o | +----[SHA256]-----+ |

-P "":设置空密码

-t rsa:指定生成密钥的类型为RSA

将公钥发给受管制节点(三台机器都要发)

|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| [root@server ~]# ssh-copy-id -i /root/.ssh/id_rsa.pub root@host1 /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@host1's password: Number of key(s) added: 1 Now try logging into the machine, with: "ssh 'root@host1'" and check to make sure that only the key(s) you wanted were added. |

三个受管制的节点一次发送,测试免密登录:

|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| [root@server ~]# ssh host1 Last login: Tue Nov 26 10:22:15 2024 from 192.168.213.1 [root@host1 ~]# exit 登出 Connection to host1 closed. [root@server ~]# ssh host2 The authenticity of host 'host2 (192.168.213.12)' can't be established. ECDSA key fingerprint is SHA256:6Mpa+9K+FMhcZ1UYuKOM9iK/ZBw9BWYC5snJeK12tPI. ECDSA key fingerprint is MD5:68:37:fd:6d:82:a4:ad:d3:ff:4e:70:47:e2:70:01:99. Are you sure you want to continue connecting (yes/no)? y Please type 'yes' or 'no': y Please type 'yes' or 'no': yess Warning: Permanently added 'host2,192.168.213.12' (ECDSA) to the list of known hosts. root@host2's password: Last login: Tue Nov 26 10:22:34 2024 from 192.168.213.1 [root@host2 ~]# exit 登出 Connection to host2 closed. [root@server ~]# ssh host3 The authenticity of host 'host3 (192.168.213.13)' can't be established. ECDSA key fingerprint is SHA256:6Mpa+9K+FMhcZ1UYuKOM9iK/ZBw9BWYC5snJeK12tPI. ECDSA key fingerprint is MD5:68:37:fd:6d:82:a4:ad:d3:ff:4e:70:47:e2:70:01:99. Are you sure you want to continue connecting (yes/no)? yes Warning: Permanently added 'host3,192.168.213.13' (ECDSA) to the list of known hosts. root@host3's password: Last login: Tue Nov 26 10:22:52 2024 from 192.168.213.1 |

3.主节点安装Ansible

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

|--------------------------------------------------------------------------------------------------------------------------------|
| [root@host3 ~]# yum install -y epel-release [root@host3 ~]# yum install -y ansible [root@server ~]# ansible --version |

4.修改主机清单设置分组

ansible常见的配置文件

  1. /etc/ansible/ansible.cfg:主配置文件
  2. /etc/ansible/hosts:主机清单文件
  3. /etc/ansible/roles:角色目录

备份主机求清单文件

|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| [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 |

编写主机清单文件

|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| [root@server ansible]# vi hosts [all-servers] server host1 host2 host3 [node1] host1 [node2] host2 [node3] host3 [mysql_test] #规划节点host1和host2节点为数据库节点 host1 host2 [web_test] #规划节点host2和host3节点为web节点 host2 host3 [manager] server |

Ansible模块基本使用

Ansible常用参数说明

|--------------------|-----------------------------------------|
| 参数 | 说明 |
| -h | 显示帮助信息 |
| -i | 指定inventory文件路径,默认路径为/etc/ansible/hosts |
| -l | 限制palybook或命令的作用范围 |
| -u | 连接远程主机时使用的用户名。 |
| -b | 相当于sudo |
| --become-user=USER | 提上权限后切换到的用户 |
| -m | 指定要使用的模块名 |
| -a | 指定模块的参数 |
| -f | 指定并发进程数,默认为5 |
| -v | 增加输出的详细程度 |
| -e | 指定变量名 |
| -diff | 修改文件时显示修改前后的差异 |

Ansible的执行状态

绿色:执行成功并且不需要做改变的操作

黄色:执行成功并且对目标主机做变更

红色:执行失败

粉色:警告信息

蓝色:显示ansible命令执行的过程

1.shell模块

Shell模块用于在受控机上执行受控机上的脚本,亦可直接在受控机上执行命令。

Shell模块亦支持管道与重定向。

|----------------------------------------------------------------------|
| [root@server ansible]# ansible host1 -m shell -a 'a=10086;echo $a' |

​​​​

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

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

2.ping模块

Ping模块用于检查指定节点机器是否连通,用法很简单,不涉及参数

主机如果在线,则回复pong

|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| [root@server ansible]# ansible -m ping node1 [WARNING]: Invalid characters were found in group names but not replaced, use -vvvv to see details host1 | SUCCESS => { "ansible_facts": { "discovered_interpreter_python": "/usr/bin/python" }, "changed": false, "ping": "pong" } |

以组为单位测试

|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| [root@server ansible]# ansible -m ping all [WARNING]: Invalid characters were found in group names but not replaced, use -vvvv to see details The authenticity of host 'server (192.168.213.10)' can't be established. ECDSA key fingerprint is SHA256:6Mpa+9K+FMhcZ1UYuKOM9iK/ZBw9BWYC5snJeK12tPI. ECDSA key fingerprint is MD5:68:37:fd:6d:82:a4:ad:d3:ff:4e:70:47:e2:70:01:99. Are you sure you want to continue connecting (yes/no)? host3 | SUCCESS => { "ansible_facts": { "discovered_interpreter_python": "/usr/bin/python" }, "changed": false, "ping": "pong" } host2 | SUCCESS => { "ansible_facts": { "discovered_interpreter_python": "/usr/bin/python" }, "changed": false, "ping": "pong" } host1 | SUCCESS => { "ansible_facts": { "discovered_interpreter_python": "/usr/bin/python" }, "changed": false, "ping": "pong" } |

3.command模块

command模块用于在远程主机上执行命令,ansible默认就是使用command模块。

|---------------------------------------------------------------------------|
| root@server ansible]# ansible host1 -m command -a 'ls /etc/yum.repos.d/' |

相当于远程让host1节点执行ls命令

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

|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| [root@server ansible]# ansible host1 -m command -a 'touch /opt/hzy' [WARNING]: Invalid characters were found in group names but not replaced, use -vvvv to see details [WARNING]: Consider using the file module with state=touch rather than running 'touch'. If you need to use command because file is insufficient you can add 'warn: false' to this command task or set 'command_warnings=False' in ansible.cfg to get rid of this message. host1 | CHANGED | rc=0 >> [root@server ansible]# ansible host1 -m command -a 'ls /opt/' [WARNING]: Invalid characters were found in group names but not replaced, use -vvvv to see details host1 | CHANGED | rc=0 >> hzy |

command模块有一个缺陷就是不能使用管道符和重定向功能。

command模块也可以多节点执行

|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| [root@server ansible]# ansible -m command -a 'hostname' all [WARNING]: Invalid characters were found in group names but not replaced, use -vvvv to see details The authenticity of host 'server (192.168.213.10)' can't be established. ECDSA key fingerprint is SHA256:6Mpa+9K+FMhcZ1UYuKOM9iK/ZBw9BWYC5snJeK12tPI. ECDSA key fingerprint is MD5:68:37:fd:6d:82:a4:ad:d3:ff:4e:70:47:e2:70:01:99. Are you sure you want to continue connecting (yes/no)? host2 | CHANGED | rc=0 >> host2 host1 | CHANGED | rc=0 >> host1 host3 | CHANGED | rc=0 >> host3 |

4.user模块

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

它允许你设置用户的密码、shell、主目录、权限等属性

常用参数:

|-----------------|-----------------------------------------|
| system | 创建用户设置用户是系统用户 |
| uid | 指定uid |
| group | 指定用户组 |
| home | 指定家目录 |
| comment | 用户的描述信息 |
| password | 指定的用户密码 |
| state | 设置账号状态,默认为pressent表示新建用户,指定值为absent表示删除 |
| update_password | 更新用户密码 |
| name | 指定用户名 |
| remove | 在使用state=absent时,行为是与userdel -remove一致 |

|--------------------------------------------------------------------------------------------|
| [root@server ~]# ansible host1 -m user -a 'system=yes name=menys uid=776 comment="mys"' |

指在host1节点创建一个名为menys的用户,uid为776,用户描述为mys

检查menys用户是否被正确创建,调用shell模块

|--------------------------------------------------------------------------------------------|
| [root@server ~]# ansible host1 -m user -a 'system=yes name=menys uid=776 comment="mys"' |

删除menys用户

|----------------------------------------------------------------------------------------|
| [root@server ansible]# ansible host1 -m user -a 'name=menys state=absent remove=yes' |

再次调用shell模块检查menys是否被删除

|-------------------------------------------------------------------------------------------------------------------------------|
| [root@server ansible]# ansible host1 -m shell -a 'id hongzy ; grep ^menys: /etc/passwd | awk -F ":" '\''{print $5}'\''' |

5.group模块

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

常用参数

|-----------|-------------------------------|
| gid | 用于设置组GID |
| name | 指定组名称(必选项) |
| non_uniue | 允许组ID为非唯一值,与gid一起使用 |
| state | 指定用户组在远程主机上的状态,present和absent |
| system | 创建的用户组是否是系统组 |

创建组

|----------------------------------------------------------------------------------------|
| [root@server ansible]# ansible host1 -m group -a "name=footabll gid=1001 system=yes" |

使用shell模块检查是否创建成功

|----------------------------------------------------------------------------------|
| [root@server ansible]# ansible host1 -m shell -a "cat /etc/group | grep 1001" |

删除组

|------------------------------------------------------------------------------------------|
| [root@server ansible]# ansible host1 -m group -a "name=football gid=1001 state=absent" |

6.copy模块

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

常用参数

|---------|--------------------------------------------------------|
| src | 被复制文件的本地路径 |
| dest | 复制到管控节点的绝对路径(必选) |
| content | 可以指定文件的值(内容) |
| mode | 设置文件权限 |
| force | 当目标主机含有该文件时,但内容不同时,设为yes表示强制覆盖,设置为no,表示目标主机的目标位置不存在才复制 |
| backup | 在覆盖前,将源文件备份,备份文件包含时间信息 |

创建一个txt文件并写入内容

|--------------------------------------------------------------|
| [root@server ansible]# echo "hello word" > /root/test.txt |

将该文件复制到被管理主机host1节点的/opt/目录下并赋予权限755

|----------------------------------------------------------------------------------------------------|
| [root@server ansible]# ansible host1 -m copy -a 'src=/root/test.txt dest=/opt/copy.txt mode=755' |

7.fetch模块

Ansile的fetch模块用于从远程节点抓取文件并存储到Ansible控制器(执行A的指定目录)

常用参数

|-------------------|-------------------------------------------------|
| src | 要远程拉取的文件(只能时文件) |
| dest | 用来存放文件的目录 |
| flat | 设置为yes时,即使src是目录,也会将所有内容扁平化存储到dest |
| size | 限制抓取文件的大小 |
| force | 即使本地文件已经存在了仍旧抓取,默认yes,设置no只有当远程文件比本地文件新或不同才执行抓取 |
| validate_checksum | 当设置为yes时,在下载完成后校验文件校检和确保文件完整无误 |
| fail_on_missing | 当设置为yes时,如果远程文件不存在,则标记任务失败,否则只是简单地跳过文件 |
| path | 必选项,定义文件/目录的路径 |
| mode | 定义文件/目录的权限 |
| group | 定义文件/目录的属组,后面可以加上mode:定义文件/目录的权限 |
| owner | 定义文件/目录的属主。后面必须跟上path:定义文件/目录的路径 |
| recurse | 递归设置文件的属性,只对目录有效,后面跟上src:被链接的源文件state=link的情况 |

从远程主机抓取文件

|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| #从mysql_test组的主机中抓取aliyun.sh文件到本机的/tmp/data目录下 [root@server ~]# ansible mysql_test -m fetch -a "src=/root/aliyun.sh dest=/tmp/data" #通过检查/tmp/data下的目录结构可知文件以完整获取 [root@server ~]# ansible manager -m shell -a "tree -L 5 /tmp/data" |

限制抓取文件的大小、添加文件存在检测

|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| #从mysql-test组的主机中抓取install.sh文件。限制最大抓取大小20kb,传输中校检文件完整性,添加文件存在检测(不存在任务失败) [root@server ~]# ansible mysql_test -m fetch -a "src=/root/install.sh dest=/tmp/data/ verify_checksum=yes fail_on_missing=yes size=20k" |

|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| 这条命令的作用就是在manager这台机器或一组机器上列出/tmp/data目录的结构,并且只展示到第五级目录。这对于查看特定目录的层次结构非常有用,特别是在需要快速了解目录内容组织情况时。 [root@server ~]# ansible manager -m shell -a "tree -L 5 /tmp/data" 这条命令的作用就是在mysql_test这台机器或一组机器上列出/root目录的内容,并以长格式显示每个条目的详细信息,包括权限、所有者、组、大小、修改日期以及文件名等。 [root@server ~]# ansible mysql_test -m shell -a "ls -l /root" |

8.file模块

file模块主要对于文件的创建、删除、修改、权限、属性

选项及描述

|---------|---------------------------------------------------------------------------------|
| path | 必选项,定义文件/目录的路径 |
| mode | 定义文件/目录的权限 |
| force | 需要在两种情况下创建软连接,一种是源文件不存在,但之后会建立的情况下;另一种是目标软连接已存在,需要先取消之前的软连接,然后创建新的软链接,有两个选项:yes |
| group | 定义文件/目录的属组,后面可以家伙三清宫mode:定义文件/目录的权限 |
| owner | 定义文件/目录的属主。后面必须跟上path:定义文件/目录的路径 |
| recurse | 递归设置文件的属性,只对目录有效,后面跟上src:被链接的源文件路径,只应用于state=link的情况 |
| dest | 被链接到的路径,只应用于state=link的情况 |
| Src | 被链接的源文件路径,只应用于state=link的情况 |
| state | 状态,有以下选项:directory、file、link、hard、touch、absent |

在指定路径下创建目录

|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| #在mysql_test组所有主机在/tmp/路径下创建权限都是只读、属主属组都是root的file1目录 [root@server ~]# ansible mysql_test -m file -a "path=/tmp/file1 mode=444 owner=root group=root state=directory" #查看创建好的目录 [root@server ~]# ansible mysql_test -m shell -a "ls -l /tmp/ | grep file1" |

创建软连接文件

|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| #给mysql_test组的所有主机创建软连接文件test1指向/root/aliyun.sh [root@server ~]# ansible mysql_test -m file -a "path=/tmp/test1 src=/root/aliyun.sh state=link" #要在host1和host2中分别创建aliyun.sh |

创建硬链接文件

|----------------------------------------------------------------------------------------------------------------------------------------------------|
| #给mysql_test组的所有主机创建硬链接文件test1指向/root/aliyun.sh [root@server ~]# ansible mysql_test -m file -a "path=/tmp/test2 src=/root/aliyun.sh state=hard" |

删除文件

|------------------------------------------------------------------------------------------------------------------------------------------|
| #删除mysql-test -m file -a "path=/tmp/test1 state=sbsent" [root@server ~]# ansible mysql_test -m file -a "path=/tmp/test1 state=absent" |

9.corn模块

远程给主机设置定时任务

两种状态:

|-----------|------------------------------------------------------------------------------------|
| present | 表示添加(默认就是添加,可以省略) |
| absent | 表示移除。absent在整个ansible的语法中都表示移除 |
| minute | 分 |
| hour | 时 |
| day | 日 |
| mounth | 月 |
| weekday | 周 |
| job | 任务执行的命令 |
| name | 任务计划的名称 |
| backup | 如果设置,会在修改crontab前创建备份。备份文件的位置通过backup_file变量返回 |
| corn_file | 如果指定,将使用此文件而非用户个人的crontab。如果是相对路径,于/etc/corn.d/绝对路径通常为/etc/crontab。为了使用cron_file参数 |

添加计划任务

|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| #给mysql_test组中的所有主机添加一个以root用户每天三点执行/root/aliyun.sh脚本的计划任务 [root@server ~]# ansible mysql_test -m cron -a "name='Daily Task' minute=0 hour=3 job='/root/aliyun.sh &> /dev/null' user=root" |

删除指定任务

|------------------------------------------------------------------------------------------------------------------------------------|
| #删除名为Daily Task的计划任务 (没有明确的计划任务名称写完整的计划任务也可以删除) [root@server ~]# ansible mysql_test -m cron -a "name='Daily Task' state=absent" |

10.yum模块

主要用于在基于RPM的linux系统上管理软件包。

它允许用户安装、更新、卸载软件包,并可配置额外的选项以控制操作的具体行为。

选项及描述

|-------------------|---------------------------------------------|
| name | 必选项,所安装的包的名称 |
| state | 安装->present; 安装最新版本的->latest;absent->卸载包 |
| update_cache | 强制更新yum的缓存 |
| conf_file | 指定远程yum安装时所依赖的配置文件(安装本地已有的包) |
| disable_pgp_check | 是否禁止GPS checking,只用于presentor latest。 |
| disableerepo | 临时禁止使用yum库。只用于安装或更新时。 |
| enablerepo | 临时使用的yum库。只用于安装或更新时。 |
| skip_borken | 跳过异常软件节点 |
| autoremove | 当设置为yes且状态为absent时,自动移除不在被任何已安装包依赖的包。 |

安装httpd服务

|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| #给web_test组的所有主机安装httpd服务 [root@server ~]# ansible web_test -m yum -a "name=httpd state=present" #远程启动httpd服务 [root@server ~]# ansible web_test -m shell -a "systemctl start httpd" #远程查看httpd服务进程 [root@server ~]# ansible web_test -m shell -a "ps aux | grep httpd" #远程停止httpd服务 [root@server ~]# ansible web_test -m shell -a "systemctl stop httpd" #远程卸载httpd服务 |

启动并查看进程

关闭并卸载httpd服务

更新所有的软件包

|-----------------------------------------------------------------------------------------|
| #给所有主机更新所有的软件包 [root@server ~]# ansible all-servers -m yum -a "name=* state=latest" |

11.service模块

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

这个模块与特定的系统服务管理工具(如systemctl、sysvinit、upstart等)兼容,能够跨不同的Linux发行版和系统管理框架工作。

选项及描述

|-----------|------------------------------------------------------------------------------------------------|
| arguments | 额外的命令行参数,提供给服务管理命令。 |
| enabled | 服务是否应该在系统启动时自动启动。至少需要指定state或enabled中的一个。 |
| name | (必须)服务的名称 |
| pattern | 如果服务不影响状态查询命令,可以指定一个子字符串作为查找依据,该字符串应能在ps命令的输出中找到,作为服务状态的替代判断。如果找到该字符串,服务将被认为已启动。 |
| runlevel | 仅针对OpenRC初始化脚本(如Gentoo)使用。指定该服务属于哪个运行级别。 |
| sleep | 当服务处于restarted状态时,停止与启动命令之间 |
| state | 有四种状态,分别为start--->启动服务,stopped--->停止服务,restart--->重启服务,reloaded--->重载配置 |
| use | 服务模块通常通过自动检测使用系统特定的模块,此设置可以强制使用特定模块。默认情况下,它使用ansible_service_mgr事实的值,并且在找不到匹配项时回退到旧的service模块。 |

远程开启/关闭防火墙

|--------------------------------------------------------------------------------------------------------------------|
| #给web_test组中的所有主机重启firewalld服务 [root@server ~]# ansible web_test -m service -a "name=firewalld state=restarted" |

|------------------------------------------------------------------------------------------------------------------|
| #查看web_test组中所有主机的firewalld服务运行部状态 [root@server ~]# ansible web_test -m shell -a "systemctl status firewalld" |

|-----------------------------------------------------------------------------------------------------------------|
| 给web_test组中的所有主机关闭firewalld服务 [root@server ~]# ansible web_test -m service -a "name=firewalld state=stopped" |

12.script模块

Ansible的script模块允许你在远程主机上执行位于Ansible控制节点上的本地脚本

|------------|---------------------------------------------------------|
| chdir | 在远程节点上执行脚本之前切换到的目录路径。 |
| cmd | 要在远程节点上运行的本地脚本的路径,后面可以跟上可选的参数。注意,这个选项与free_form二选一使用。 |
| creates | 指定远程节点上的一个文件名,如果该文件已存在,则此步骤不执行,可用防止重复执行脚本。 |
| decrypt | 控制是否自动解密使用Vault加密的源文件 |
| executable | 用于调用脚本的可执行文件的名称或路径,例如如果脚本是python脚本,可以设置为/usr/bin/python |
| Free_form | 直接提供本地脚本文件的路径以及可选的参数,与cmd选项作用相似但格式不同,两者选其一使用。 |
| removes | 指定远程节点上的一个文件名,如果该文件不存在,则此步骤将不执行,可以作为执行脚本的另一个条件。 |

编辑并部署脚本

控制节点本地编辑脚本并添加执行权限

通过script模块部署

|------------------------------------------------------------------------------|
| #给web_test组的所有主机执行控制节点上的df.sh脚本文件 ansible web_test -m script -a "/tmp/df.sh" |

13.setup模块

Ansible的setup模块用于收集远程主机的信息,并将这些信息以facts的形式返回给Ansible控制节点。

这些facts可以包括系统变量(如操作系统类型、架构、网络配置、已安装软件包等),并且在Playbook执行期间可以被其他任务使用。

选项及描述

  1. act_path:用于存放本地Ansible事实(*.fact文件)的路径。此目录下的文件如果可执行,将被执行,其结果会被添加到ansible_local事实中;如果文件不可执行,则会被读取。适用于从2.1版本开始。文件/结果格式可以是JSON或INI格式。默认的fact_path可以在ansible.cfg中为自动调用setup作为gather_facts一部分时指定。Windows环境下有特定选项,请查看注释。
  2. filter:如果提供,仅返回匹配此shell风格(fnmatch通配符)的变量。这允许筛选出特定的facts进行查看或使用。
  3. gather_subset:如果提供,限制收集的额外事实子集。可能的值包括:all(全部)、min(最小集合)、hardware(硬件信息)、network(网络信息)、virtual(虚拟化信息)、ohai(类似Chef Ohai的扩展信息)、facter(使用Facter收集的信息)。可以指定值的列表来定义更大的子集。值前可加!来排除特定子集的收集,例如:!hardware,!network,!virtual,!ohai,!facter。如果指定!all,则只收集最小集合。要避免收集最小集合,可以指定!all,!min。要仅收集特定事实,使用!all,!min并指定特定的事实子集。如果只想隐藏某些收集到的事实,使用filter参数。
  4. gather_timeout:设置单个事实收集的默认超时时间(以秒为单位)。这有助于控制事实收集过程,避免因个别慢速收集导致整个任务超时。

查看内存信息

|-----------------------------------------------------------------------------------------------|
| #查看mysql_test组所有主机的内存信息 [root@server ~]# ansible mysql_test -m setup -a "filter='*mem*'" |

通过free -m 命令查看内存大小是否一致

|---------------------------------------------------------------------------------------------|
| #通过free -m命令查看mysql_test组主机的内存信息 root@server ~]# ansible mysql_test -m shell -a "free -m" |

保存信息

|---------------------------------------------------------------------------------------------------------------|
| #将筛选的信息保存到控制节点的/tmp/data目录下 [root@server ~]# ansible node3 -m setup -a 'filter="*mem*"' --tree /tmp/data |

14.synchronize模块

Ansible的synchronize模块提供了使用rsync进行文件和目录同步的功能

rsync是一个快速且高效的文件传输工具,支持增量更新,特别适合在远程主机之间同步大量文件或保持文件夹内容一致性。

选项及描述

  1. archive:镜像rsync的归档标志,启用递归、链接、权限、时间戳、所有者、组标志及-D。默认开启。
  2. checksum:基于校验和而非修改时间和大小来跳过同步,注意"archive"选项默认仍启用,"checksum"选项不会禁用它。默认关闭。从1.6版本起可用。
  3. compress:在传输过程中压缩文件数据。大多数情况下应保持启用状态,除非引起问题。默认开启。从1.7版本起可用。
  4. copy_links:将符号链接作为它们指向的对象(被链接项)复制,而不是复制符号链接本身。默认关闭。
  5. delete:删除目标路径中不存在于源路径的文件(在传输之后,不是之前)。此选项要求recursive=yes。表现得像rsync的--delete-excluded选项,忽略被排除的文件。默认关闭。
  6. dest:同步的目的地主机路径,将从源路径同步而来。路径可以是绝对或相对的。此选项是必须的。
  7. dest_port:目标主机SSH端口。在Ansible 2.0之前,ansible_ssh_port库存变量优先于这个值。此参数默认为ansible_ssh_port或ansible_port的值、remote_port配置设置的值,或如果没有设置前者,则使用SSH客户端配置的值。从1.5版本起可用。
  8. dirs:仅传输目录而不递归进入。默认关闭。
  9. existing_only:跳过在接收端创建新文件。默认关闭。从1.5版本起可用。
  10. group:保留组信息。默认值取决于archive选项。
  11. link_dest:添加一个硬链接目标,在rsync期间与之关联。默认为无。从2.5版本起可用。
  12. links:作为符号链接复制符号链接。默认值取决于archive选项。
  13. mode:指定同步的方向。推模式下,本地主机或代理是源;拉模式下,上下文中的远程主机是源。(可选值:pull, push)默认为push。
  14. owner:保留所有者(仅超级用户)。默认值取决于archive选项。
  15. partial:告诉rsync保留部分文件,这应该会使后续传输文件剩余部分快得多。默认关闭。从2.0版本起可用。
  16. perms:保留权限信息。默认值取决于archive选项。
  17. private_key:为基于SSH的rsync连接指定私钥(如~/.ssh/id_rsa)。默认为无。从1.6版本起可用。
  18. recursive:递归进入目录。默认值取决于archive选项。
  19. rsync_opts:通过传递数组来指定额外的rsync选项。注意,rsync_opts中的空字符串最终会传输当前工作目录。默认为无。从1.6版本起可用。
  20. rsync_path:指定在远程主机上运行的rsync命令。参见rsync手册页上的--rsync-path。要指定在本地主机上运行的rsync命令,你需要设置任务变量ansible_rsync_path。默认为无。
  21. rsync_timeout:为rsync命令指定一个超时时间(秒)。默认为0。
  22. set_remote_user:为远程路径添加user@。如果你有自定义的ssh配置来为与库存用户不匹配的主机定义远程用户,应将此参数设为no。默认为True。
  23. src:源主机上的路径,将同步到目的地。路径可以是绝对或相对的。此选项是必须的。
  24. times:保留修改时间。默认值取决于archive选项。
  25. use_ssh_args:使用ansible.cfg中指定的ssh_args。默认关闭。从2.0版本起可用。
  26. verify_host:验证目标主机密钥。默认关闭。从2.0版本起可用。

将源目录同步至目标目录

|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| #既然是基于rsyno那么所有主机安装rsync [root@server ~]# ansible all-servers -m shell -a "yum install -y rsync" #将本地的/tmp/目录同步到node1组的host1主机上 [root@server ~]# ansible node1 -m synchronize -a "src=/tmp/ dest=/tmp/" #查看node1组的host1主机的/tmp/目录结构 [root@server ~]# tree -L 5 /tmp/ root@server ~]# ansible node1 -m shell -a "tree -L 5 /tmp/" |

所有主机安装rsync

同步本地/tmp/到host1主机上

查看目录结构

15.raw模块

raw模块用于在远程主机上执行命令,其支持管道符与重定向

|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| [root@server ~]# ansible node3 -m raw -a 'echo "hello world" > /tmp/test' [root@server ~]# ansible node3 -a 'cat /tmp/test' [root@server ~]# ansible node3 -m raw -a 'cat /tmp/test | grep -Eo hello' |

看到这了给个一键三连呗谢谢各位看官,可以一起交流学习。

相关推荐
七夜zippoe3 小时前
CANN Runtime任务描述序列化与持久化源码深度解码
大数据·运维·服务器·cann
Fcy6484 小时前
Linux下 进程(一)(冯诺依曼体系、操作系统、进程基本概念与基本操作)
linux·运维·服务器·进程
袁袁袁袁满4 小时前
Linux怎么查看最新下载的文件
linux·运维·服务器
代码游侠5 小时前
学习笔记——设备树基础
linux·运维·开发语言·单片机·算法
Harvey9035 小时前
通过 Helm 部署 Nginx 应用的完整标准化步骤
linux·运维·nginx·k8s
珠海西格电力科技6 小时前
微电网能量平衡理论的实现条件在不同场景下有哪些差异?
运维·服务器·网络·人工智能·云计算·智慧城市
释怀不想释怀6 小时前
Linux环境变量
linux·运维·服务器
zzzsde6 小时前
【Linux】进程(4):进程优先级&&调度队列
linux·运维·服务器
聆风吟º8 小时前
CANN开源项目实战指南:使用oam-tools构建自动化故障诊断与运维可观测性体系
运维·开源·自动化·cann
NPE~8 小时前
自动化工具Drissonpage 保姆级教程(含xpath语法)
运维·后端·爬虫·自动化·网络爬虫·xpath·浏览器自动化