Ansible详解(架构,模块)及部署示例

Ansible概述

  • Ansible是一个基于Python开发的配置管理和应用部署工具,也在自动化管理领域大放异彩。它融合了众多老牌运维工具的优点,几乎可以实现Puppet和Saltstack能实现的功能。

  • Ansible是一款开源的IT自动化工具,它能够自动执行配置管理、应用部署、编排和其他许多手动的IT流程。它是一个简单、强大且无代理的自动化语言。使用Ansible,可以通过编写简洁的任务描述文件(Playbook),来定义和管理IT基础设施的状态。Ansible使用SSH协议进行通信,无需在被管理的主机上安装任何代理程序,因此非常方便和易于使用。它支持多种操作系统和云平台,可以帮助实现自动化部署、配置和管理大规模的IT环境。

  • Ansible其中一个比较鲜明的特性是Agentless,即无Agent的存在,它就像普通命令一样,并非C/S软件,也只需在某个作为控制节点的主机上安装一次Ansible即可,通常它基于ssh连接来控制远程主机,远程主机上不需要安装Ansible或其它额外的服务。

Ansible作用

Ansible具有广泛的功能,可以用于以下方面:

  • 配置管理:Ansible可以自动化配置和管理服务器、网络设备和各种应用程序。可以使用Ansible来定义和维护服务器的状态,确保它们按照预期的配置运行。

  • 应用部署:使用Ansible,可以自动化应用程序的部署过程。可以帮助在多台服务器上同时部署应用程序,并确保它们在各个环境中的一致性。

  • 批量执行远程命令:Ansible可以同时在多台主机上执行命令,无需手动登录每台主机。这对于批量操作和快速执行任务非常有用。

  • 编排高级的IT任务:Ansible提供了强大的编排功能,可以使用YAML语言编写一套完整的Playbook,用于部署和维护整个基础架构。可以定义任务的顺序、依赖关系和条件,以实现复杂的IT任务。

  • 云管理:Ansible支持各种云平台,包括AWS、Azure、Google Cloud等。可以使用Ansible来自动化云资源的创建、配置和管理,以便快速搭建和扩展云基础设施。

  • 安全合规性:Ansible提供了一些功能来帮助确保系统的安全性和合规性。可以使用Ansible来自动执行安全检查、配置审计和漏洞修复等任务。

总之,Ansible是一个功能强大的自动化工具,可以帮助简化和加速各种IT操作和任务,提高效率并确保一致性。

Ansible特点

  • 简单易用:Ansible采用人类可读的YAML语法,使得编写和理解Playbooks变得简单直观。无需编写复杂的脚本或代码,即可完成配置和部署任务。

  • 部署简单的Agentless架构:Ansible使用SSH协议与远程主机通信,无需在被管理的主机上安装任何代理程序。这简化了部署和管理过程,减少了额外的配置和维护工作。

  • 幂等性:大多数Ansible模块具备幂等性,即多次执行相同的任务不会产生副作用。这意味着可以放心地重复执行任务,而不必担心系统状态的不一致性。

  • 模块化:Ansible提供了丰富的模块库,涵盖了各种常见的操作和任务。这些模块可以被组合和重用,使得配置和部署过程更加灵活和高效。

  • 多平台支持:Ansible可以管理各种操作系统和云平台,包括Linux、Windows、VMware、AWS、Azure等。这使得它成为跨多个环境和平台统一管理的理想工具。

  • 可扩展性:Ansible支持自定义模块和插件,可以根据特定需求进行扩展和定制。这使得它适用于各种复杂的自动化场景和特定的业务需求。支持API及自定义模块,可以通过Pyhton轻松扩展

Ansible架构

Ansible的架构包括以下几个核心组件:

  • 控制节点(Control Node):控制节点是Ansible的中心管理服务器,负责执行和管理Ansible的任务。在控制节点上安装Ansible软件,并使用Ansible命令行工具或其他管理工具与被管理的主机进行通信。

  • 被管理的主机(Managed Hosts):被管理的主机是需要通过Ansible进行配置和管理的目标主机。可以是物理服务器、虚拟机、云实例或网络设备等。被管理的主机上无需安装额外的Agent,只需具备SSH连接能力即可。

  • 模块(Modules):模块是Ansible的核心组件,用于执行具体的任务。Ansible提供了丰富的模块库,涵盖了各种常见的操作和任务,如文件操作、软件包管理、服务管理等。可以通过调用模块来完成特定的配置和管理操作。

  • 插件(Plugins):插件是Ansible的扩展组件,用于增强和定制Ansible的功能。插件可以用于扩展模块、实现新的功能、自定义任务执行流程等。Ansible提供了多种类型的插件,如连接插件、变量插件、回调插件等。

  • 剧本(Playbooks):剧本是Ansible的任务描述文件,用于定义和组织一系列任务的执行流程。剧本使用YAML语法编写,可以包含多个任务、变量、条件判断和循环等。通过执行剧本,可以实现复杂的配置和部署操作。

  • 主机清单(Inventory):主机清单是一个文本文件,用于定义被管理的主机和主机组的信息。主机清单指定了Ansible可以管理的主机列表和它们的连接信息,如IP地址、用户名、密码等。可以根据需要将主机分组,以便在剧本中针对不同的主机组执行任务。

  • 连接插件(Connection Plugins):连接插件用于与被管理的主机建立连接。Ansible支持多种连接方式,如SSH、WinRM等。连接插件负责建立连接、认证身份、传输数据等操作,以便在被管理的主机上执行任务。

这些组件共同构成了Ansible的架构,通过控制节点与被管理的主机进行通信,使用模块执行任务,通过剧本组织任务流程,实现对主机的配置和管理。Ansible的架构简单而灵活,使得配置管理和应用部署变得高效和可靠。

工作流程

Ansible的工作流程可以概括为以下几个步骤:

  • 编写剧本(Playbooks):首先,需要编写一个或多个剧本,使用YAML语法描述任务的执行流程和配置要求。剧本可以包含多个任务、变量、条件判断和循环等。

  • 配置主机清单(Inventory):在主机清单文件中,定义被管理的主机和主机组的信息。指定主机的连接信息,如IP地址、用户名、密码等。可以根据需要将主机分组,以便在剧本中针对不同的主机组执行任务。

  • 执行剧本:使用Ansible命令行工具,在控制节点上执行剧本。命令行工具会读取剧本文件和主机清单文件,并根据剧本中定义的任务流程,逐个执行任务。

  • 连接被管理的主机:Ansible会使用连接插件与被管理的主机建立连接。连接插件负责建立连接、认证身份、传输数据等操作,以便在被管理的主机上执行任务。

  • 执行任务:Ansible会按照剧本中定义的任务顺序,逐个在被管理的主机上执行任务。每个任务对应一个模块(Module),模块负责执行具体的操作,如文件操作、软件包管理、服务管理等。

  • 收集结果:执行任务后,Ansible会收集任务执行的结果,并将结果返回给控制节点。您可以查看执行结果,以便了解任务的执行情况和可能的错误。


ansible 环境安装部署

环境准备

管理端: 192.168.41.31        ansible                    
被管理端: 192.168.41.32                                
被管理端: 192.168.41.33      

安装Ansible服务

  • 安装Ansible: 首先,安装epel源,然后使用yum命令安装Ansible。
yum install -y epel-release
yum install -y ansible

Ansible目录结构: Ansible的配置文件和主机清单存储在/etc/ansible/目录下。以下是目录结构:

/etc/ansible/
├── ansible.cfg        # Ansible的配置文件,一般无需修改
├── hosts            # Ansible的主机清单,用于存储需要管理的远程主机的相关信息
└── roles/            # 公共角色目录
  • 配置主机清单: 使用vim编辑器打开主机清单文件/etc/ansible/hosts,并配置主机组和主机信息。
cd /etc/ansible
vim hosts
[webservers]        
192.168.10.17        [dbservers]
192.168.10.18
  • [webservers]: 这是一个组名,用于标识一组被管理的主机。在这个例子中,组名为webservers

  • 192.168.41.32: 这是一个被管理的主机的IP地址或主机名。在webservers组中,包含了一个主机,其IP地址为192.168.41.32。如果你使用主机名而不是IP地址,你需要先在/etc/hosts文件中进行相应的配置。

  • [dbservers]: 这是另一个组名,用于标识另一组被管理的主机。

  • 192.168.41.33: 这是另一个被管理的主机的IP地址或主机名。在dbservers组中,包含了一个主机,其IP地址为192.168.41.33

  • 配置密钥对验证: 生成SSH密钥对,并将公钥复制到被管理的主机上,以实现免密登录。

ssh-keygen -t rsa        # 一路回车,使用默认配置生成密钥对
sshpass -p 'abc1234' ssh-copy-id root@192.168.41.32        # 将公钥复制到第一个被管理的主机
sshpass -p 'abc1234' ssh-copy-id root@192.168.41.33        # 将公钥复制到第二个被管理的主机

完成上述步骤后,可以进行以下测试:

  • 在管理端执行Ansible命令,例如:
ansible webservers -m ping

这将向名为webservers的组中的所有主机发送ping模块命令,以检查与这些主机的连接是否正常。

  • 如果连接正常,可以尝试执行其他Ansible命令,例如:
ansible webservers -m command -a "uptime"

这将在webservers组中的所有主机上执行uptime命令,并返回结果。

通过执行这些测试,可以验证Ansible的配置是否成功,并且可以与被管理的主机进行通信和执行命令。

Ansible 命令行模块

Ansible是一种自动化工具,可以通过命令行模块在目标主机上执行命令。命令行模块允许你在远程主机上执行命令,而无需手动登录到每个主机。

  • 要列出所有已安装的Ansible模块并退出
ansible-doc -l | less

这将显示所有已安装的模块列表,并使用less命令进行分页浏览。可以使用上下箭头键浏览列表,按下q键退出。

  • 要使用Ansible的命令行模块,可以使用以下命令格式:
ansible <主机组> -m command -a "<命令>"

其中:

  • <主机组>:指定要在哪些主机上执行命令。可以是单个主机名、主机组名或使用模式匹配选择多个主机。

  • -m command:指定要使用的模块为"command",即命令行模块。

  • -a "<命令>":指定要在目标主机上执行的命令。

例如,如果要在名为"webserver"的主机组上执行"ls"命令,可以使用以下命令:

ansible webserver -m command -a "ls"

这将在"webserver"主机组的所有主机上执行"ls"命令,并将结果返回给你。

模块详解

ansible-doc

ansible-doc 是 Ansible 提供的一个命令行工具,用于查看 Ansible 模块的文档。它可以帮助用户了解各个模块的功能、参数和示例等信息,方便用户在编写 Ansible Playbooks 时进行参考和使用。

使用 ansible-doc 命令时,可以提供模块名称作为参数,以查看特定模块的文档。例如,ansible-doc user 将显示 user 模块的文档。

ansible-doc 命令提供了以下几个常用的选项:

  • -s:显示模块的摘要信息,包括功能、参数和示例等。

  • -l:列出所有可用的模块名称。

  • -M:指定额外的模块路径,用于查找自定义的模块。

  • -v:显示更详细的模块文档,包括参数的详细说明和示例。

使用 ansible-doc 命令可以方便地查阅 Ansible 模块的文档,帮助用户了解模块的使用方法和功能,从而更好地编写 Ansible Playbooks。

command模块

  • command 模块用于在远程主机上执行命令,但不支持管道、重定向等 shell 特性。可以使用 ansible-doc -s command 命令来查看 command 模块的描述信息和操作动作。
ansible-doc -s command
#-s 列出指定模块的描述信息和操作动作

command模块常用参数

  • free_form:要在远程主机上执行的命令。可以是一个字符串或一个列表。

  • chdir:在执行命令之前切换到的目录。

  • creates:如果指定的文件或目录已经存在,则命令不会执行。

  • removes:如果指定的文件或目录不存在,则命令不会执行。

  • executable:指定要使用的可执行程序。

  • warn:是否在命令执行失败时发出警告,默认为yes

  • stdin:将标准输入传递给命令的内容。

  • stdin_add_newline:在传递标准输入时是否添加换行符,默认为yes

  • strip_empty_ends:是否去除输出结果中的空行,默认为yes

  • cmd_timeout:命令执行的超时时间,以秒为单位。

  • argv:要传递给命令的参数列表。

使用 command 模块的示例:

  • 指定 IP 执行 date 命令:
ansible 192.168.41.32 -m command -a 'date'
  • 指定主机组执行 date 命令:
ansible webservers -m command -a 'date'
ansible dbservers -m command -a 'date' 
  • 指定所有主机执行 date 命令:
ansible all -m command -a 'date'
  • 指定目录并执行命令:
ansible all -m command -a "chdir=/home ls ./"
#在所有主机上执行 ls ./ 命令,并在执行之前切换到 /home 目录。
  • 在上述示例中,ansible 命令用于执行 Ansible 操作。通过 -m command 参数指定要使用的模块为 command。使用 -a 参数后面跟随要执行的命令。如省略 -m 模块,则默认运行 command 模块

此外,command 模块还支持其他常用参数,例如:

  • chdir:在远程主机上运行命令之前切换到指定目录。

  • creates:判断指定文件是否存在,如果存在,则不执行后续操作。

  • removes:判断指定文件是否存在,如果存在,则执行后续操作。

shell模块

  • 用于在远程主机上执行 shell 命令。与 command 模块不同,shell 模块支持管道、重定向等 shell 特性。

  • 可以使用 ansible-doc -s shell 命令查看 shell 模块的描述信息和操作动作。

ansible-doc -s shell 

shell模块常用参数

  • cmd:要在远程主机上执行的Shell命令或脚本。

  • stdin:将标准输入传递给Shell命令或脚本。

  • executable:指定要使用的Shell解释器,默认为/bin/sh。

  • chdir:在执行命令或脚本之前切换到指定的工作目录。

  • creates:如果指定的文件或目录已存在,则不执行命令。

  • removes:如果指定的文件或目录不存在,则不执行命令。

  • warn:控制是否在命令执行失败时发出警告,默认为true。

  • timeout:指定命令执行的超时时间,单位为秒。

  • stdinaddnewline:在传递标准输入时,是否自动添加换行符,默认为true。

  • warn:控制是否在命令执行失败时发出警告,默认为true。

使用 shell 模块的示例:

  • 在远程主机上设置密码:
ansible dbservers -m shell -a 'echo 123456 | passwd --stdin test'

        命令的作用是将密码 123456 通过管道传递给 passwd 命令的 --stdin 选项,并将密码设置给用户名为 test 的用户。

  • 获取网络接口的 IP 地址:
ansible dbservers -m shell -a 'echo $(ifconfig ens33 | awk "NR==2 {print $2}") | cut -d " " -f2'

        命令的作用是通过 ifconfig 命令获取网络接口 ens33 的信息,然后使用 awk 命令提取第二行的第二个字段(IP 地址),再通过管道传递给 cut 命令,使用空格作为分隔符提取第二个字段(即 IP 地址)。

  • 获取网络接口的 IP 地址(使用转义符号):
ansible dbservers -m shell -a 'echo $(ifconfig ens33 | awk "NR==2 {print \$2}")'

        这个命令与前一个命令类似,只是在 awk 命令中使用了转义符号 \ 来转义 $2,以防止在 Ansible 命令中被解析为变量。

  • 在上述示例中,ansible 命令用于执行 Ansible 操作。通过 -m shell 参数指定要使用的模块为 shell。使用 -a 参数后面跟随要执行的命令。

请注意,在使用 shell 模块时,要谨慎考虑安全性和潜在的风险。

cron 模块

  • Ansible没有内置的 cron 模块。但是,可以使用 command 模块或 shell 模块来执行与 cron 相关的任务。cron 模块用于在远程主机上定义任务计划(cron jobs)。

  • 可以使用 ansible-doc -s cron 命令查看 cron 模块的描述信息和操作动作。

ansible-doc -s cron                #按 q 退出

cron模块的常用参数

  • name:任务计划的名称,用于标识任务计划的唯一性。

  • minute:指定任务计划执行的分钟数。

  • hour:指定任务计划执行的小时数。

  • day:指定任务计划执行的日期。

  • month:指定任务计划执行的月份。

  • weekday:指定任务计划执行的星期几。

  • job:指定任务计划要执行的命令。

  • state:指定任务计划的状态,可以是present(添加任务计划)或absent(移除任务计划)。

使用 core 模块的示例:

ansible webservers -m cron -a 'minute="*/1" job="/bin/echo helloworld" name="test crontab"'
  • 这个命令使用Ansible的cron模块在名为webservers的主机上创建一个计划任务。计划任务的执行时间是每分钟一次,执行的命令是/bin/echo helloworld,并且给这个计划任务取名为test crontab
ansible webservers -a 'crontab -l'
  • 这个命令使用Ansible在名为webservers的主机上执行crontab -l命令,以查看当前的计划任务列表。
ansible webservers -m cron -a 'name="test crontab" state=absent'
  • 这个命令使用Ansible的cron模块在名为webservers的主机上移除一个名为test crontab的计划任务。state=absent参数表示移除该计划任务。

user模块

  • 用于在远程主机上管理用户。它可以用于创建、修改和删除用户,以及设置用户的属性

  • 使用 ansible-doc -s user 命令可以查看 user 模块的摘要信息

ansible-doc -s user

user模块的常用参数

  • name:必需参数,指定要操作的用户名称。

  • state:可选参数,默认为 present,用于指定用户的状态。可以设置为 present(存在)、absent(不存在)、locked(锁定)等。

  • group:可选参数,指定用户所属的基本组。

  • groups:可选参数,指定用户所属的附加组。如果用户已经存在并且已经有多个附加组,如果要继续添加新的附加组,需要结合 append 参数使用,否则默认情况下,再次使用 groups 参数设置附加组时,用户原来的附加组会被覆盖。

  • append:可选参数,用于在已存在的用户的附加组中追加新的附加组。

  • password:可选参数,用于设置用户的密码。可以使用明文密码或者加密后的密码。

  • shell:可选参数,指定用户的登录 shell。

  • home:可选参数,指定用户的主目录。

  • createhome:可选参数,默认为 yes,用于指定是否创建用户的主目录。

  • remove:可选参数,默认为 no,用于指定是否删除用户的主目录。

  • update_password:可选参数,默认为 always,用于指定何时更新用户的密码。可以设置为 always(始终更新)、on_create(仅在创建用户时更新)或 never(永不更新)。

使用user模块的示例

ansible dbservers -m user -a 'name="test01"'
  • 这个命令使用 Ansible 的 user 模块在 dbservers 主机组上创建了一个名为 test01 的用户。-m user 指定了要使用 user 模块,-a 'name="test01"' 指定了要创建的用户名称为 test01
ansible dbservers -m command -a 'tail /etc/passwd'
  • 这个命令使用 Ansible 的 command 模块在 dbservers 主机组上执行了一个命令 tail /etc/passwd-m command 指定了要使用 command 模块,-a 'tail /etc/passwd' 指定了要执行的命令为 tail /etc/passwd
ansible dbservers -m user -a 'name="test01" state=absent'
  • 这个命令使用 Ansible 的 user 模块在 dbservers 主机组上删除了名为 test01 的用户。-m user 指定了要使用 user 模块,-a 'name="test01" state=absent' 指定了要删除的用户名称为 test01,并设置了 state 参数为 absent,表示删除用户。

group模块

  • 用于管理远程主机上的组。通过该模块,可以添加、删除和修改组。

  • 查看 group 模块

ansible-doc -s group

group模块常用参数

  • name(必需):指定要操作的组名称。

  • state:指定组的状态,可选值为 present(存在)和 absent(不存在),默认为 present。如果设置为 absent,表示删除该组。

  • gid:指定组的 GID(组标识符)。

  • system:指定创建的组是否为系统组,默认为 false。如果设置为 true,表示创建的组为系统组。

  • append:在用户已经存在于其他组的情况下,将用户添加到指定组中,默认为 false。如果设置为 true,表示将用户添加到指定组中。

  • local:在本地主机上执行操作,而不是远程主机,默认为 false。如果设置为 true,表示在本地主机上执行操作。

  • non_unique:允许创建具有非唯一 GID 的组,默认为 false。如果设置为 true,表示允许创建非唯一 GID 的组。

  • stategid 参数不能同时使用。

group模块示例

ansible dbservers -m group -a 'name=mysql gid=360 system=yes'
  • 这个命令使用 group 模块在 "dbservers" 主机组上创建了一个名为 "mysql" 的用户组。name 参数指定了组名为 "mysql",gid 参数指定了组标识符为 360,system 参数指定了该组为系统组。
ansible dbservers -a 'tail /etc/group'
  • 这个命令使用 tail 命令查看了 "dbservers" 主机组上的 "/etc/group" 文件的内容,以验证 "mysql" 组是否成功创建。
ansible dbservers -m user -a 'name=test01 uid=306 system=yes group=mysql'
  • 这个命令使用 user 模块在 "dbservers" 主机组上创建了一个名为 "test01" 的用户,并将其添加到 "mysql" 组中。name 参数指定了用户名为 "test01",uid 参数指定了用户标识符为 306,system 参数指定了该用户为系统用户,group 参数指定了用户所属的组为 "mysql"。
ansible dbservers -a 'tail /etc/passwd'
  • 这个命令使用 tail 命令查看了 "dbservers" 主机组上的 "/etc/passwd" 文件的内容,以验证 "test01" 用户是否成功创建。
ansible dbservers -a 'id test01'
  • 这个命令使用 id 命令查看了 "dbservers" 主机组上的 "test01" 用户的详细信息,包括用户的 UID、所属组等。

copy 模块

  • 用于拷贝文件的模块。它可以将 Ansible 管理主机上的文件复制到远程主机上。

  • 查看copy模块

ansible-doc -s copy

copy模块常用参数:

  • src:指定源文件或源目录的路径。可以是本地文件系统上的路径,也可以是 Ansible 管理主机上的路径。

  • dest:指定目标文件或目标目录的路径。可以是远程主机上的路径。

  • backup:是否备份目标文件。默认为 no。如果设置为 yes,在复制目标文件之前会先备份目标文件。

  • force:是否强制复制文件,即使目标文件已存在。默认为 no。如果设置为 yes,会覆盖目标文件。

  • owner:设置目标文件的所有者。可以使用用户名或用户ID。

  • group:设置目标文件的所属组。可以使用组名或组ID。

  • mode:设置目标文件的权限模式。可以使用数字形式(例如 0644)或字符串形式(例如 "u+rwx,g+rw,o+r")。

  • remote_src:指定源文件是否位于远程主机上。默认为 no,表示源文件位于本地主机上。如果设置为 yes,表示源文件位于远程主机上。

  • validate:指定一个命令或脚本,用于验证复制的文件。如果验证失败,则复制操作会失败。

copy模块示例

ansible dbservers -m copy -a 'src=/etc/fstab dest=/opt/fstab.bak owner=root mode=640'
  • 这个命令使用 copy 模块将 "/etc/fstab" 文件复制到 "dbservers" 主机组中的 "/opt/fstab.bak" 文件中。src 参数指定了源文件路径为 "/etc/fstab",dest 参数指定了目标文件路径为 "/opt/fstab.bak",owner 参数指定了目标文件的所有者为 "root",mode 参数指定了目标文件的权限模式为 640。
ansible dbservers -a 'ls -l /opt'
  • 这个命令使用 ls -l 命令查看了 "dbservers" 主机组中 "/opt" 目录的内容,以验证 "/opt/fstab.bak" 文件是否成功创建。
ansible dbservers -a 'cat /opt/fstab.bak'
  • 这个命令使用 cat 命令显示了 "dbservers" 主机组中 "/opt/fstab.bak" 文件的内容。
ansible dbservers -m copy -a 'content="helloworld" dest=/opt/hello.txt'
  • 这个命令使用 copy 模块将字符串 "helloworld" 写入到 "dbservers" 主机组中的 "/opt/hello.txt" 文件中。content 参数指定了要写入的内容,dest 参数指定了目标文件路径为 "/opt/hello.txt"。
ansible dbservers -a 'cat /opt/hello.txt'
  • 这个命令使用 cat 命令显示了 "dbservers" 主机组中 "/opt/hello.txt" 文件的内容。

file 模块

  • 用于在目标主机上进行文件和目录操作的模块。它提供了一系列任务,可以用来创建、删除、修改文件和目录的权限、所有权和时间戳等。

  • 查看file模块

ansible-doc -s file

file模块常用参数

  • path: 指定文件或目录的路径。

  • state: 指定文件或目录的状态,可以是absent(不存在)、directory(目录)、file(文件)、hard(硬链接)、link(符号链接)、touch(创建文件)等。

  • owner: 指定文件或目录的所有者。

  • group: 指定文件或目录的所属组。

  • mode: 指定文件或目录的权限,可以使用八进制或符号表示法,例如0644u+rwx,g+rw,o+r

  • src: 用于创建链接文件时指定源文件的路径。

  • follow: 指定是否跟随符号链接,默认为yes,即跟随链接。

  • recurse: 指定是否递归处理目录,默认为no,即不递归处理。

  • recurse_attributes: 指定是否递归处理目录的属性,默认为no

  • recurse_file_type: 指定递归处理目录时的文件类型,默认为file,可以是filedirectorylink

  • recurse_mode: 指定递归处理目录时的权限,默认为preserve,即保持原有权限。

  • recurse_user: 指定递归处理目录时的所有者。

  • recurse_group: 指定递归处理目录时的所属组。

file模块示例

  • 修改文件的属主、属组和权限:
ansible dbservers -m file -a 'owner=test01 group=mysql mode=644 path=/opt/fstab.bak'

        这个命令将目标主机上的/opt/fstab.bak文件的属主设置为test01,属组设置为mysql,权限设置为644

  • 创建一个链接文件:
ansible dbservers -m file -a 'path=/opt/fstab.link src=/opt/fstab.bak state=link'

        这个命令将在目标主机上创建一个名为/opt/fstab.link的链接文件,它将链接到/opt/fstab.bak文件。

  • 创建一个空文件:
ansible dbservers -m file -a "path=/opt/abc.txt state=touch"

        这个命令将在目标主机上创建一个名为/opt/abc.txt的空文件。

  • 删除一个文件:
ansible dbservers -m file -a "path=/opt/abc.txt state=absent"

        这个命令将删除目标主机上的/opt/abc.txt文件。

hostname 模块

  • 用于管理主机名的模块。它可以用来设置主机的名称。

hostname模块参数

  • name: 指定要设置的主机名。

  • temporary: 设置为yes时,临时修改主机名,重启后会恢复为原来的主机名。

  • state: 指定操作的状态。可选值为present(默认值,设置主机名)、absent(删除主机名)和query(查询主机名)。

hostname模块示例

ansible dbservers -m hostname -a "name=mysql01"

        执行该命令后,Ansible将连接到dbservers主机组中的主机,并使用hostname模块将它们的主机名设置为mysql01

ping 模块

  • 用于测试与远程主机的连接。它发送一个简单的ping请求到远程主机,并等待响应。

ping模块常用参数

  • data: 指定要发送的ping数据包的内容。

  • count: 指定要发送的ping数据包的数量。

  • timeout: 指定等待ping响应的超时时间。

  • dest: 指定要ping的目标主机。

  • source: 指定发送ping请求的源IP地址。

  • pattern: 指定要发送的ping数据包的模式。

  • size: 指定要发送的ping数据包的大小。

  • validate_certs: 指定是否验证远程主机的SSL证书。

ping模块示例

  • 检测远程主机的连通性:
ansible all -m ping

        在上述命令中,ansible是用于执行Ansible命令的工具,all表示要操作的目标主机组,-m ping表示使用ping模块进行操作。

        执行上述命令后,Ansible将尝试与所有目标主机建立连接,并发送ping请求。如果远程主机能够正常响应,你将看到类似以下的输出:

your_host | SUCCESS => {"changed": false,"ping": "pong"
}

其中,your_host是远程主机的名称或IP地址。

如果远程主机无法连接或没有响应,你将看到类似以下的输出:

your_host | UNREACHABLE! => {"changed": false,"msg": "Failed to connect to the host via ssh: ssh: connect to host your_host port 22: Connection refused","unreachable": true
}

在上述输出中,your_host是远程主机的名称或IP地址,msg字段将提供连接失败的详细信息。

yum 模块

  • 用于在远程主机上执行yum软件包管理任务的模块

yum 模块常用参数

  • name:必需参数,用于指定需要管理的软件包的名称。例如:name: nginx

  • state:用于指定软件包的状态。默认值为present,表示确保软件包已经安装。除了present,其他可用值有installedlatestabsentremoved。其中,installedpresent等效,latest表示安装yum源中最新的版本,absentremoved等效,表示删除对应的软件包。例如:state: present

  • disablegpgcheck:用于指定是否禁用GPG检查,默认值为no。如果设置为yes,则会禁用GPG检查。例如:disable_gpg_check: yes

  • enablerepo:用于指定启用的yum仓库。可以指定多个仓库,以逗号分隔。例如:enablerepo: epel,extras

  • disablerepo:用于指定禁用的yum仓库。可以指定多个仓库,以逗号分隔。例如:disablerepo: base,updates

  • update_cache:用于指定是否更新yum缓存,默认值为yes。如果设置为no,则不会更新yum缓存。例如:update_cache: no

  • installroot:用于指定安装软件包的根目录。例如:installroot: /mnt/root

  • exclude:用于指定需要排除的软件包。可以指定多个软件包,以逗号分隔。例如:exclude: kernel*,httpd

yum模块示例

  • 安装服务:
ansible webservers -m yum -a 'name=httpd'

这个命令使用yum模块在名为"webservers"的主机上安装"httpd"服务。-m yum指定了使用yum模块,-a 'name=httpd'指定了安装的软件包名称为"httpd"。默认情况下,state参数的值为"present",表示确保软件包已经安装。

  • 卸载服务:
ansible webservers -m yum -a 'name=httpd state=absent'

这个命令使用yum模块在名为"webservers"的主机上卸载"httpd"服务。state=absent参数指定了软件包的状态为"absent",表示卸载对应的软件包。

  • 在这两个命令中,"webservers"是一个主机组的名称,可以根据实际情况替换为你的主机组名称。这些命令将在远程主机上执行相应的操作,安装或卸载指定的软件包。

service/systemd 模块

用于管理服务和systemd单元:service模块和systemd模块。

  • service模块:这个模块用于管理服务,可以在不同的操作系统上使用。它使用不同的命令来启动、停止、重启和检查服务的状态,具体取决于操作系统

  • systemd模块:这个模块用于管理systemd单元,它是一种现代的初始化系统,广泛用于许多Linux发行版中。

service/systemd 模块常用参数

service模块的常用参数:

  • name:要管理的服务的名称。

  • state:服务的状态,可以是started(启动)、stopped(停止)、restarted(重启)、reloaded(重新加载)或status(状态)。

  • enabled:指定服务是否在系统启动时自动启动,可以是yesno

  • pattern:用于指定服务的模式,可以是正则表达式,用于匹配多个服务。

  • sleep:在执行状态检查之前等待的时间(以秒为单位)。

  • arguments:传递给服务的额外参数。

systemd模块的常用参数:

  • name:要管理的systemd单元的名称。

  • state:systemd单元的状态,可以是started(启动)、stopped(停止)、restarted(重启)、reloaded(重新加载)或status(状态)。

  • enabled:指定systemd单元是否在系统启动时自动启动,可以是yesno

  • masked:指定systemd单元是否被屏蔽,可以是yesno

  • daemon_reload:指定是否在操作之前重新加载systemd守护进程配置,可以是yesno

  • sleep:在执行状态检查之前等待的时间(以秒为单位)。

  • arguments:传递给systemd单元的额外参数。

service/systemd 模块示例

ansible webservers -a 'systemctl status httpd'
  • 这个命令使用ansible命令行工具来执行一个Ad-hoc命令。webservers是一个目标主机的组名,你可以在Ansible的主机清单文件中定义这个组。-a参数后面跟着的是要在目标主机上执行的命令,即systemctl status httpd,它会在目标主机上运行systemctl status httpd命令来查看httpd服务的运行状态。
ansible webservers -m service -a 'enabled=true name=httpd state=started'
  • 这个命令使用ansible命令行工具来执行一个模块命令。webservers是目标主机的组名,-m参数指定要使用的模块,这里是service模块。-a参数后面是模块的参数,即enabled=true name=httpd state=started。这个命令的作用是在目标主机上使用service模块启动httpd服务,并将其设置为在系统启动时自动启动。

script 模块

  • 用于在远程主机上执行Ansible管理主机上的脚本的模块。在Ansible管理主机上编写和保存脚本,然后通过Ansible在远程主机上执行这些脚本,而无需手动拷贝脚本到远程主机。

script模块常用参数

  • free_form:必需参数,指定需要执行的脚本的路径。可以是绝对路径或相对路径。例如:script: /path/to/script.sh

  • chdir:可选参数,指定在执行脚本之前要进入的远程主机上的目录。这可以用于确保脚本在正确的工作目录中执行。例如:chdir: /path/to/directory

  • creates:可选参数,指定一个文件路径。如果该文件存在,则不执行脚本。这可以用于避免重复执行脚本。例如:creates: /path/to/file

  • executable:可选参数,指定要用于执行脚本的可执行程序。如果未指定,Ansible将使用默认的可执行程序。例如:executable: /bin/bash

  • removes:可选参数,指定一个文件路径。如果该文件存在,则在执行脚本之后删除它。这可以用于清理脚本执行过程中生成的临时文件。例如:removes: /path/to/file

  • warn:可选参数,指定是否在脚本执行失败时发出警告。默认情况下,如果脚本执行失败,Ansible会中止任务。如果将warn设置为true,则即使脚本执行失败,Ansible也会继续执行后续任务。例如:warn: true

script模块示例

使用Ansible的script模块执行一个简单的Shell脚本,并在远程主机上创建一个文件。

  • 首先,创建了一个名为test.sh的Shell脚本文件,并将一条消息写入/opt/script.txt文件中。
vim test.sh#!/bin/bash
echo "hello ansible from script" > /opt/script.txt
  • test.sh脚本文件添加了可执行权限,以便可以在远程主机上执行它。使用chmod +x test.sh命令为脚本添加可执行权限。

  • 然后,使用Ansible的script模块在名为webservers的主机组上执行test.sh脚本。使用ansible webservers -m script -a 'test.sh'命令执行脚本。

  • 最后,使用Ansible的命令模块(-a参数)在远程主机上查看/opt/script.txt文件的内容。使用ansible webservers -a 'cat /opt/script.txt'命令查看文件内容。

chmod +x test.sh
ansible webservers -m script -a 'test.sh'
ansible webservers -a 'cat /opt/script.txt'

为确保已经在Ansible的主机清单文件中定义了名为webservers的主机组,并且这些主机可以通过SSH连接进行访问。


执行上述步骤后,应该能够在远程主机上看到/opt/script.txt文件,并且文件中包含了hello ansible from script的消息。

setup 模块

用于收集有关远程主机的信息。

setup模块常用参数

  • gather_subset:指定要收集的子集信息。默认情况下,它会收集所有可用的信息。可以使用逗号分隔的值,如all,hardware,network,或者使用通配符*来匹配特定的子集。

  • gather_timeout:指定信息收集的超时时间。默认情况下,它是10秒。可以使用整数或浮点数来指定超时时间,单位是秒。

  • filter:指定一个过滤器,用于仅返回满足条件的信息。可以使用Jinja2模板语法来定义过滤器条件。

  • fact_path:指定一个目录路径,用于存储收集到的主机信息。默认情况下,信息存储在ansible_facts变量中,但可以将其保存到指定的目录中,以便后续使用。

  • fact_caching:指定是否启用事实缓存。可以设置为yesno。启用缓存可以提高性能,避免每次都重新收集信息。

  • fact_caching_connection:指定缓存连接的详细信息,如缓存服务器的主机和端口。具体的配置取决于所使用的缓存插件。

setup模块示例

vim test.sh#!/bin/bash
echo "hello ansible from script" > /opt/script.txtchmod +x test.sh
ansible webservers -m script -a 'test.sh'
ansible webservers -a 'cat /opt/script.txt'
  • #!/bin/bash:这是脚本文件的第一行,指定了脚本使用的解释器为Bash。

  • echo "hello ansible from script" > /opt/script.txt:将字符串"hello ansible from script"写入到/opt/script.txt文件中。

  • chmod +x test.sh:这是改变脚本文件权限的命令,将其设置为可执行。

  • ansible webservers -m script -a 'test.sh':使用script模块在webservers主机组上执行test.sh脚本。-m参数指定要使用的模块,-a参数指定要传递给模块的参数。

  • ansible webservers -a 'cat /opt/script.txt':使用command模块在webservers主机组上执行cat /opt/script.txt命令,以查看/opt/script.txt文件的内容。

  • ansible-doc -s setup:用于查看setup模块的帮助文档。-s参数表示显示模块的简要摘要。

  • ansible webservers -m setup:使用setup模块在webservers主机组上收集主机的信息。

  • ansible dbservers -m setup -a 'filter=*ipv4':使用setup模块在dbservers主机组上收集主机的信息,并使用filter=*ipv4参数筛选出包含ipv4信息的结果。

YAML文件格式

  • YAML(YAML Ain't Markup Language 或 YAML 是一种人类友好的数据序列化标准。

  • YAML 文件是一种以人类可读的方式表示数据的格式,通常被用于配置文件和数据交换格式。它的语法简洁,使用空格来表示层次结构,避免了像 XML 和 JSON 这样的标记语言中使用的繁琐的符号。YAML 主要强调数据的可读性,使得编辑和理解文件变得更加容易。

  • YAML 文件可以包含键值对、数组、标量等数据形式。在容器编排工具中,比如 Docker Compose 中的配置文件就经常采用 YAML 格式。在 YAML 文件中,缩进和空格的使用很重要,它们用来表示数据的层次结构关系。

  • 与 XML 相比,YAML 语法更简单。YAML 数据结构通过缩进表示,连续的项目通过减号表示,键值对用冒号分隔,数组用中括号 [] 括起来,哈希用花括号 {} 括起来。

以下是一个简单的 YAML 文件示例:

name: John Doe
age: 30
city: New York
hobbies:- Reading- Traveling

在这个例子中,我们定义了一个人物的信息,包括姓名、年龄、城市和爱好。这种人类可读性高的格式使得 YAML 在配置文件和数据交换方面被广泛应用。

编写注意事项:

  • 大小写敏感: YAML 是大小写敏感的。

  • 缩进表示层级关系: 使用缩进表示数据的层次结构。

  • 不支持制表符: 只能使用空格进行缩进,不支持制表符(tab 键)。

  • 缩进的空格数目不重要: 只要相同层级左对齐即可,通常开头缩进2个空格。

  • 注释: 使用 # 号表示注释。

  • 符号字符后缩进1个空格: 冒号 : 、逗号 , 、横杠 - 等符号后通常缩进1个空格。

  • 引号的使用: 单引号''引起来的字符串会被处理为普通字符串,双引号""内的特殊字符会被解析为其本身的意思。

name: "Hi,\lihua"

数据结构:

  • 键值对: 键值对的字典。YAML 使用冒号 : 分隔键和值,形成键值对
animal: pets
  • 列表: 一组按次序排列的列表。使用连字符 - 表示列表中的每个项
- Cat
- Dog
- Bird

对应 JSON:["Cat", "Dog", "Bird"]

  • 布尔值:
debug: true
debug: false
  • 哈希映射: 使用花括号 {} 表示哈希映射,即键值对的字典。
person:name: Johnage: 30
  • 数组: 使用中括号 [] 表示数组。
fruits: [apple, orange, banana]

示例:

YAML 格式:

languages:- Java- Golang- Python
websites:cpu: 2memory: 1024Mswap: 2048Mdisk: 60G

对应的 JSON 格式:

{"languages": ["Java","Golang","Python"    ],"websites": {"cpu": "2","memory": "1024M","swap": "2048M","disk": "60G"}
}

简单结构示例

person:name: Aliceage: 25address:city: Wonderlandcountry: Fantasylandhobbies:- Reading- Traveling- Coding

在这个示例中,person 包含了姓名、年龄、地址和爱好的信息。address 是一个哈希映射,而 hobbies 是一个列表。

复杂结构示例:

school: universitydepartments:- name: computer sciencecourses:- course_name: algorithmsprofessor: Dr. Smith- course_name: databasesprofessor: Dr. Johnson- name: literaturecourses:- course_name: poetryprofessor: Dr. Williams- course_name: novelsprofessor: Dr. Davislocation:campus: westcity: Example Citycountry: Example Country

这个示例展示了一个包含学校信息、部门、课程和位置的复杂 YAML 结构。通过缩进和冒号的使用,清晰地表示了数据的层级关系。school 包含了 departmentslocation 两个子项,而 departments 下有两个子项,每个子项包含了部门名称和该部门的课程信息。最后,location 包含了校区、城市和国家的信息。这种结构使得数据的组织和理解变得直观和简洁。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/635383.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何免费从 SD 卡恢复已删除的文件?(照片、视频、MP3)

今天我们将告诉您如何免费从格式化的 SD 卡或闪存卡恢复文件。 特别是如果您是一名摄影师、博主或任何处理内容的人&#xff0c;您的 SD 卡上有一些内容&#xff0c;但您不小心删除或格式化了&#xff0c;现在您要向自己道歉。 无需担心&#xff0c;因为今天我们将告诉您如何…

vue写了debugger谷歌浏览器打开控制台没进断点

vue代码中打了断点&#xff0c;谷歌打开f12进不了断点解决方案如下 1、打开谷歌浏览器控制台&#xff0c;点击设置 2、在 Ignore List 中将“Enable Ignore Listing”勾选去掉&#xff0c;然后就可以正常使用debugger了

为了最大限度利用带宽,传输通道容量如何计算

一、结论&#xff1a; 传送通道容量 带宽 ✖️ 往返时延 二、过程&#xff1a; 1、传播时延和发送时延&#xff08;带宽&#xff09;通常决定一个报文的发送时间。 传输介质确定的时候&#xff0c;传播时延固定&#xff0c;发送时延根据数据报文的大小而不同。 ①传播时延…

GPT应用开发:编写插件获取实时天气信息

欢迎阅读本系列文章&#xff01;我将带你一起探索如何利用OpenAI API开发GPT应用。无论你是编程新手还是资深开发者&#xff0c;都能在这里获得灵感和收获。 本文&#xff0c;我们将继续展示聊天API中插件的使用方法&#xff0c;让你能够轻松驾驭这个强大的工具。 插件运行效…

elasticsearch6.6.0设置访问密码

elasticsearch6.6.0设置访问密码 第一步 x-pack-core-6.6.0.jar第二步 elasticsearch.yml第三步 设置密码 第一步 x-pack-core-6.6.0.jar 首先破解 x-pack-core-6.6.0.jar 破解的方式大家可以参考 https://codeantenna.com/a/YDks83ZHjd 中<5.破解x-pack> 这部分 , 也可…

SQL Server Management Studio创建数据表

文章目录 一、建表注意事项1.1 数据类型1.2 建立数据表的基本SQL语法 二、实例说明2.1 创建数据表2.2 实例2 三、标识列和主键示例&#xff1a; 一、建表注意事项 1.1 数据类型 可以看这个去了解数据类型&#xff1a; 1.2 建立数据表的基本SQL语法 建立数据表的基本 SQL 语…

【正点原子STM32连载】 第四十四章 外部SRAM实验 摘自【正点原子】APM32E103最小系统板使用指南

1&#xff09;实验平台&#xff1a;正点原子APM32E103最小系统板 2&#xff09;平台购买地址&#xff1a;https://detail.tmall.com/item.htm?id609294757420 3&#xff09;全套实验源码手册视频下载地址&#xff1a; http://www.openedv.com/docs/boards/xiaoxitongban 第四…

【备战蓝桥杯】快来学吧~ 图论巩固,Delia的生物考试

蓝桥杯备赛 | 洛谷做题打卡day12 文章目录 蓝桥杯备赛 | 洛谷做题打卡day12最大食物链计数题目背景题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1 提示题解代码总的思路&#xff1a;拓扑排序 我的一些话 最大食物链计数 题目背景 你知道食物链吗&#xff1f;Delia 生…

SSM汽车维修管理系统

工具使用情况&#xff1a; eclipsetomcatmysqljdk 技术架构&#xff1a; 后台&#xff1a;springspring mvcmybatis 前台&#xff1a;easyui 功能介绍&#xff1a; 汽车维修管理、车辆接待、维修项目登记、维修领料、质检完工、消费结算 配件管理、财务管理、基础数据管理…

二进制表示(14)

题目 public class Main {public static String con01(int x,int n) {StringBuffer s new StringBuffer();while(x!0) {s.append(x%n);x/n;}return s.reverse().toString();}public static int con02(int x,int n) {StringBuffer s new StringBuffer();int sum 0;while(x!0…

二、VS2019编译的VTK9.0.0 + Qt 5.14.2 环境测试

1. 使用CMake VS2019 编译vtk 9.0.0 时,需要启用支持Qt开关、如下图 如果不会编译的可以参见我的这篇文章: 一、VTK 9.0.0 编译安装步骤 VS2019 CMake3.26.0-CSDN博客 打开Qt5.14.2 ,创建Qt Widget 项目: 构建设置选择 MSVC2017 64bit pro 项目文件加入两行配置: …

鸿蒙开发系列教程(四)--ArkTS语言:基础知识

1、ArkTS语言介绍 ArkTS是HarmonyOS应用开发语言。它在保持TypeScript&#xff08;简称TS&#xff09;基本语法风格的基础上&#xff0c;对TS的动态类型特性施加更严格的约束&#xff0c;引入静态类型。同时&#xff0c;提供了声明式UI、状态管理等相应的能力&#xff0c;让开…

GetShell的姿势

0x00 什么是WebShell 渗透测试工作的一个阶段性目标就是获取目标服务器的操作控制权限&#xff0c;于是WebShell便应运而生。Webshell中的WEB就是web服务&#xff0c;shell就是管理攻击者与操作系统之间的交互。Webshell被称为攻击者通过Web服务器端口对Web服务器有一定的操作权…

javaWebssh运动会管理系统myeclipse开发mysql数据库MVC模式java编程计算机网页设计

一、源码特点 java ssh运动会管理系统是一套完善的web设计系统&#xff08;系统采用ssh框架进行设计开发&#xff09;&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为TOMCAT7.0,M…

Beyond Compare ubuntu 安装

文章目录 参考 具体方法请参考【1】、【2】&#xff0c;亲测有效。 参考 【1】deepin深度系统 BeyondCompare 4.3.4破解教程 【2】Beyond-Compare 4 -linux 破解

Java医药WMS进销存系统

技术架构&#xff1a; jdk8 IntelliJ IDEA maven Mysql5.7 有需要的可以私信我。 系统功能与介绍&#xff1a; 医药进销存系统&#xff0c;主要分两种角色&#xff1a;员工、客户。本系统具有进销存系统的通用性&#xff0c;可以修改为其它进销存系统&#xff0c;如家电进…

JUC并发编程-线程和进程、Synchronized 和 Lock、生产者和消费者问题

1、什么是JUC 源码 官方文档 面试高频问&#xff01; java.util 工具包、包、分类 业务&#xff1a;普通的线程代码 Thread Runnable Runnable 没有返回值、效率相比入 Callable 相对较低&#xff01; 2、线程和进程 线程、进程&#xff0c;如果不能使用一句话说出来的技术…

创建SERVLET

创建SERVLET 要创建servlet,需要执行以下任务: 编写servlet。编译并封装servlet。将servlet部署为Java EE应用程序。通过浏览器访问servlet。编写servlet 要编写servlet,需要扩展HttpServlet接口的类。编写servlet是,需要合并读取客户机请求和返回响应的功能。 读取和处…

Qt 状态机框架:The State Machine Framework (二)

传送门: Qt 状态机框架:The State Machine Framework (一) Qt 状态机框架:The State Machine Framework (二) 1、利用并行态避免态的组合爆炸 假设您想在单个状态机中对汽车的一组互斥属性进行建模。假设我们感兴趣的属性是干净与肮脏,以及移动与不移动。需要四个相互排斥的…

去掉element-ui的el-table的所有边框+表头+背景颜色

实例: 1.去掉table表头(加上:show-header"false") <el-table:data"tableData":show-header"false"style"width: 100%"> </el-table> 2.去掉table所有边框 ::v-deep .el-table--border th.el-table__cell, ::v-deep .el…