相关文章 |
---|
ansible自动化运维(二)playbook模式详解-CSDN博客 |
ansible自动化运维(三)jinja2模板&&roles角色管理-CSDN博客 |
ansible自动化运维(四)运维实战-CSDN博客 |
ansible自动化运维工具
1.什么是自动化运维
自动化运维是指将日常运维的、大量的重复性工作自动化,把手工执行的工作,通过梳理分析,进行逻辑分解,借助平台或工具转为自动化操作。自动化是it运维工作的升华,it运维自动化不单纯是一个维护的过程,更是一个管理的提升过程,是运维更高层次,也是未来的发展趋势。
1.1运维自动化解决的问题
- 项目整体工作效率提升;
- 减少人为误操作;
- 方便信息传递,配置类信息聚合,信息链更完整;
- 事务留痕,方便跟踪,追述;
- 运维工作更加轻松、灵动;
- 提升运维工作价值,管理更多资源,更多服务对象;
1.2自动化运维分类工具
- 系统安装:PXE,Cobbert
- 应用程序配置:Puppet,Ansible,Saltstack
- 命令执行与控制:Fabric,Func,Ansible
- 程序发布: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模式;
- ad-hoc:简而言之,就是"临时命令",不会保存;
- 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的架构
- 主机清单inventory定义Ansible需要操作主机的范围
- 剧本playbook Ansible的配置文件,将多个任务定义在剧本中,由ansible自动执行
- 核心模块Core Modules连接主机实现操作,它依赖于具体的模块来做具体的事情
- 自定义模块Custom Modules根据自己的需求编写具体的模块
- 连接插件Connection Plugins 用于连接主机,用来连接被管理端
- 插件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常见的配置文件
- /etc/ansible/ansible.cfg:主配置文件
- /etc/ansible/hosts:主机清单文件
- /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执行期间可以被其他任务使用。
选项及描述
- act_path:用于存放本地Ansible事实(*.fact文件)的路径。此目录下的文件如果可执行,将被执行,其结果会被添加到ansible_local事实中;如果文件不可执行,则会被读取。适用于从2.1版本开始。文件/结果格式可以是JSON或INI格式。默认的fact_path可以在ansible.cfg中为自动调用setup作为gather_facts一部分时指定。Windows环境下有特定选项,请查看注释。
- filter:如果提供,仅返回匹配此shell风格(fnmatch通配符)的变量。这允许筛选出特定的facts进行查看或使用。
- gather_subset:如果提供,限制收集的额外事实子集。可能的值包括:all(全部)、min(最小集合)、hardware(硬件信息)、network(网络信息)、virtual(虚拟化信息)、ohai(类似Chef Ohai的扩展信息)、facter(使用Facter收集的信息)。可以指定值的列表来定义更大的子集。值前可加!来排除特定子集的收集,例如:!hardware,!network,!virtual,!ohai,!facter。如果指定!all,则只收集最小集合。要避免收集最小集合,可以指定!all,!min。要仅收集特定事实,使用!all,!min并指定特定的事实子集。如果只想隐藏某些收集到的事实,使用filter参数。
- 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是一个快速且高效的文件传输工具,支持增量更新,特别适合在远程主机之间同步大量文件或保持文件夹内容一致性。
选项及描述
- archive:镜像rsync的归档标志,启用递归、链接、权限、时间戳、所有者、组标志及-D。默认开启。
- checksum:基于校验和而非修改时间和大小来跳过同步,注意"archive"选项默认仍启用,"checksum"选项不会禁用它。默认关闭。从1.6版本起可用。
- compress:在传输过程中压缩文件数据。大多数情况下应保持启用状态,除非引起问题。默认开启。从1.7版本起可用。
- copy_links:将符号链接作为它们指向的对象(被链接项)复制,而不是复制符号链接本身。默认关闭。
- delete:删除目标路径中不存在于源路径的文件(在传输之后,不是之前)。此选项要求recursive=yes。表现得像rsync的--delete-excluded选项,忽略被排除的文件。默认关闭。
- dest:同步的目的地主机路径,将从源路径同步而来。路径可以是绝对或相对的。此选项是必须的。
- dest_port:目标主机SSH端口。在Ansible 2.0之前,ansible_ssh_port库存变量优先于这个值。此参数默认为ansible_ssh_port或ansible_port的值、remote_port配置设置的值,或如果没有设置前者,则使用SSH客户端配置的值。从1.5版本起可用。
- dirs:仅传输目录而不递归进入。默认关闭。
- existing_only:跳过在接收端创建新文件。默认关闭。从1.5版本起可用。
- group:保留组信息。默认值取决于archive选项。
- link_dest:添加一个硬链接目标,在rsync期间与之关联。默认为无。从2.5版本起可用。
- links:作为符号链接复制符号链接。默认值取决于archive选项。
- mode:指定同步的方向。推模式下,本地主机或代理是源;拉模式下,上下文中的远程主机是源。(可选值:pull, push)默认为push。
- owner:保留所有者(仅超级用户)。默认值取决于archive选项。
- partial:告诉rsync保留部分文件,这应该会使后续传输文件剩余部分快得多。默认关闭。从2.0版本起可用。
- perms:保留权限信息。默认值取决于archive选项。
- private_key:为基于SSH的rsync连接指定私钥(如~/.ssh/id_rsa)。默认为无。从1.6版本起可用。
- recursive:递归进入目录。默认值取决于archive选项。
- rsync_opts:通过传递数组来指定额外的rsync选项。注意,rsync_opts中的空字符串最终会传输当前工作目录。默认为无。从1.6版本起可用。
- rsync_path:指定在远程主机上运行的rsync命令。参见rsync手册页上的--rsync-path。要指定在本地主机上运行的rsync命令,你需要设置任务变量ansible_rsync_path。默认为无。
- rsync_timeout:为rsync命令指定一个超时时间(秒)。默认为0。
- set_remote_user:为远程路径添加user@。如果你有自定义的ssh配置来为与库存用户不匹配的主机定义远程用户,应将此参数设为no。默认为True。
- src:源主机上的路径,将同步到目的地。路径可以是绝对或相对的。此选项是必须的。
- times:保留修改时间。默认值取决于archive选项。
- use_ssh_args:使用ansible.cfg中指定的ssh_args。默认关闭。从2.0版本起可用。
- 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' |
看到这了给个一键三连呗谢谢各位看官,可以一起交流学习。