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详解(架构,模块)及部署示例_第1张图片

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 [email protected]        # 将公钥复制到第一个被管理的主机
sshpass -p 'abc1234' ssh-copy-id [email protected]        # 将公钥复制到第二个被管理的主机

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

  • 在管理端执行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.txt

chmod +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: John
  age: 30
  • 数组: 使用中括号 [] 表示数组。
fruits: [apple, orange, banana]

示例:

YAML 格式:

languages:
  - Java
  - Golang
  - Python
websites:
  cpu: 2
  memory: 1024M
  swap: 2048M
  disk: 60G

对应的 JSON 格式:

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

简单结构示例

person:
  name: Alice
  age: 25
  address:
    city: Wonderland
    country: Fantasyland
  hobbies:
    - Reading
    - Traveling
    - Coding

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

复杂结构示例:

school: university
  departments:
    - name: computer science
      courses:
        - course_name: algorithms
          professor: Dr. Smith
        - course_name: databases
          professor: Dr. Johnson
    - name: literature
      courses:
        - course_name: poetry
          professor: Dr. Williams
        - course_name: novels
          professor: Dr. Davis
  location:
    campus: west
    city: Example City
    country: Example Country

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

你可能感兴趣的:(自动运维,云,ansible,架构,docker,容器,运维,云原生)