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 的组。 -
state
和gid
参数不能同时使用。
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
: 指定文件或目录的权限,可以使用八进制或符号表示法,例如0644
或u+rwx,g+rw,o+r
。 -
src
: 用于创建链接文件时指定源文件的路径。 -
follow
: 指定是否跟随符号链接,默认为yes
,即跟随链接。 -
recurse
: 指定是否递归处理目录,默认为no
,即不递归处理。 -
recurse_attributes
: 指定是否递归处理目录的属性,默认为no
。 -
recurse_file_type
: 指定递归处理目录时的文件类型,默认为file
,可以是file
、directory
或link
。 -
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
,其他可用值有installed
、latest
、absent
、removed
。其中,installed
与present
等效,latest
表示安装yum源中最新的版本,absent
和removed
等效,表示删除对应的软件包。例如: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
:指定服务是否在系统启动时自动启动,可以是yes
或no
。 -
pattern
:用于指定服务的模式,可以是正则表达式,用于匹配多个服务。 -
sleep
:在执行状态检查之前等待的时间(以秒为单位)。 -
arguments
:传递给服务的额外参数。
systemd
模块的常用参数:
-
name
:要管理的systemd单元的名称。 -
state
:systemd单元的状态,可以是started
(启动)、stopped
(停止)、restarted
(重启)、reloaded
(重新加载)或status
(状态)。 -
enabled
:指定systemd单元是否在系统启动时自动启动,可以是yes
或no
。 -
masked
:指定systemd单元是否被屏蔽,可以是yes
或no
。 -
daemon_reload
:指定是否在操作之前重新加载systemd守护进程配置,可以是yes
或no
。 -
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
:指定是否启用事实缓存。可以设置为yes
或no
。启用缓存可以提高性能,避免每次都重新收集信息。 -
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
包含了 departments
和 location
两个子项,而 departments
下有两个子项,每个子项包含了部门名称和该部门的课程信息。最后,location
包含了校区、城市和国家的信息。这种结构使得数据的组织和理解变得直观和简洁。