文章目录
- 一、ad-hoc介绍
- 如何使用 Ansible Ad-Hoc 命令
- 1. 基本语法
- 2. 示例
- 应用场景
- 注意事项
- 二、Ansible模块
- Ansible模块的参数
- 1. `name`:
- 2. `state`:
- 3. `src`:
- 4. `dest`:
- 5. `user`:
- 6. `group`:
- 7. `mode`:
- 为什么是“0755”而不是“755” :
- 8. `delegate_to`:
- 9. `args`:
- 10. `with_items`:
- 11. `register`:
- 12. `when`:
- To-Do 下面模块的说明测试验证???????????
- shell模块
- command模块
- script模块
- file模块
- 有什么用:
- 动作选项:
- 如何同时创建多个目录?
- copy模块
- yum模块
- 有什么用:
- 动作选项:
- yum-repository模块
- 有什么用:
- 动作选项:
- service模块
- 有什么用:
- 动作选项:
- systemd模块
- user模块
- group模块
- mount模块
- unarchive模块
- mysql_db
- 什么用
- 动作选项
- 确保目标主机有能够操控MySQL数据库的模块MySQL-python
- 测试
- mysql_user
- 有什么用
- 动作选项
- 测试:
一、ad-hoc介绍
“Ad-hoc"这个词组的全称就是"ad hoc”,它本身就是一个完整的拉丁语短语,意思是“为了这个目的”或“特别为此”。在英语中,它通常用来描述临时的、特别的或即兴的解决方案或决策。在技术领域,尤其是在Ansible这样的自动化工具中,"ad-hoc"命令指的是那些不需要预先编写完整剧本(playbook)就能执行的一次性任务。因此,"ad-hoc"并没有一个更长的全称,它本身就是一个完整的术语。
“Ad-hoc"这个词组的全称就是"ad
hoc”,它本身就是一个完整的拉丁语短语,意思是“为了这个目的”或“特别为此”。在英语中,它通常用来描述临时的、特别的或即兴的解决方案或决策。在技术领域,尤其是在Ansible这样的自动化工具中,"ad-hoc"命令指的是那些不需要预先编写完整剧本(playbook)就能执行的一次性任务。因此,"ad-hoc"并没有一个更长的全称,它本身就是一个完整的术语。
"ad-hoc"这个词的发音是 [ˌæd ˈhɒk](英式发音)或 [ˌæd ˈhɑːk](美式发音)。其中 “ad” 读作
“æd”,“hoc” 读作 “hɒk”(英式)或 “hɑːk”(美式)。这个词组通常作为一个整体来读,不分开。 Ansible 的
ad-hoc 命令是一个强大的功能,允许你在没有编写 Ansible playbook
的情况下,直接在目标主机上执行命令。它提供了一种快速且灵活的方式来执行各种任务,比如配置更改、系统检查和软件安装。
Ansible 的 ad-hoc 命令是一种即时执行单次任务的方式,无需创建和维护 playbook。它通过命令行直接指定要执行的模块和参数,并将这些指令应用于目标主机或主机组。
如何使用 Ansible Ad-Hoc 命令
1. 基本语法
ansible <主机组> -m <模块> -a "<模块参数>"
<主机组>
: 目标主机或主机组的名称,在 Ansible 的 inventory 文件中定义。<模块>
: 要使用的 Ansible 模块,比如ping
、command
、shell
、yum
等。<模块参数>
: 传递给模块的参数,通常是以键值对的形式。
2. 示例
-
测试主机连通性
ansible all -m ping
这个命令会使用
ping
模块来测试所有主机的连通性。如果主机正常响应,它会返回pong
。 -
执行远程命令
ansible webservers -m shell -a "uptime"
这个命令会在所有
webservers
主机组中的主机上执行uptime
命令,显示系统的运行时间和负载信息。 -
安装软件包
ansible dbservers -m yum -a "name=httpd state=present"
这个命令会在
dbservers
主机组中的所有主机上使用yum
模块安装httpd
软件包。 -
复制文件
ansible all -m copy -a "src=/local/path/to/file dest=/remote/path/to/file"
这个命令会将本地路径
/local/path/to/file
复制到远程主机的路径/remote/path/to/file
。
应用场景
-
快速测试和调试: Ad-hoc 命令非常适合用来快速测试某些功能或调试问题,而不需要编写完整的 playbook。
-
一次性操作: 对于一些一次性的配置更改或操作,比如安装一个软件包或重启服务,ad-hoc 命令是一个高效的选择。
-
批量管理: 使用 ad-hoc 命令可以同时对多个主机执行相同的操作,比如更新系统或执行安全检查。
注意事项
- 权限: 确保你有权限在目标主机上执行所需的操作,有些操作可能需要 root 权限。
- 安全: 使用 ad-hoc 命令时要小心,以避免对生产环境造成不必要的影响。
- 性能: 对于大规模的操作或复杂的任务,建议使用 playbook,以便更好地管理和维护配置。
通过 ad-hoc 命令,你可以快速、灵活地管理和配置你的服务器,帮助你在日常工作中提高效率。
二、Ansible模块
Ansible 是一个开源的自动化工具,用于配置管理、应用程序部署和任务自动化。Ansible 的模块是执行任务的基本单元,每个模块都是一个 Python 脚本或插件,用于与目标系统交互。模块的通用组成包括以下几个部分:
-
模块的入口点:
- 模块通常由一个名为
main
的函数或类的实例化来定义,这是模块的执行入口。
- 模块通常由一个名为
-
参数定义:
- 模块接收参数,这些参数通过 Ansible 的任务定义传递。参数可以在模块的
argument_spec
中定义。它们描述了模块可以接受的选项、数据类型、是否必需等。
- 模块接收参数,这些参数通过 Ansible 的任务定义传递。参数可以在模块的
-
逻辑处理:
- 模块包含实现特定功能的核心逻辑。例如,创建文件、安装软件包、修改配置等。这部分的代码处理传递给模块的参数,执行必要的操作,并产生相应的结果。
-
返回结果:
- 模块需要以特定格式返回结果,通常是 JSON 格式。结果包含任务的成功状态、返回的消息、可能的变更等信息。Ansible 根据这些信息来报告任务的状态给用户。
-
错误处理:
- 模块应具备处理和报告错误的能力。如果模块在执行过程中遇到问题,它应能以清晰的方式报告错误,并返回相应的错误信息。
-
文档字符串:
- 模块通常包含一个文档字符串,描述模块的功能、参数及用法。这有助于用户理解如何使用该模块。
-
依赖管理:
- 某些模块可能需要依赖其他 Python 库或系统工具。在模块中,可以通过导入相关库或检查系统环境来管理这些依赖。
-
测试和调试:
- 模块应包含测试和调试功能,以确保其在不同环境下的正确性和可靠性。这可以包括内置测试用例或调试输出。
以下是一个简单的 Ansible 模块示例(用 Python 编写):
#!/usr/bin/pythonfrom ansible.module_utils.basic import AnsibleModuledef run_module():module_args = dict(name=dict(type='str', required=True),state=dict(type='str', required=True, choices=['present', 'absent']))result = dict(changed=False,original_message='',message='')module = AnsibleModule(argument_spec=module_args, supports_check_mode=True)name = module.params['name']state = module.params['state']# Implement module logic hereif state == 'present':result['changed'] = Trueresult['message'] = 'Item {} is present'.format(name)elif state == 'absent':result['changed'] = Trueresult['message'] = 'Item {} is absent'.format(name)module.exit_json(**result)def main():run_module()if __name__ == '__main__':main()
这个示例模块接受两个参数 name
和 state
,然后根据 state
的值生成响应的消息。根据具体实现的复杂性,模块的组成和功能可能会有所不同,但这些基本组成部分是大多数 Ansible 模块所共有的。
Ansible模块的参数
Ansible 的模块可以用于自动化系统配置和管理,模块通常有一些通用的参数,虽然具体的参数取决于模块的类型和功能。以下是一些常用的 Ansible 模块的通用参数及其说明:
1. name
:
- 描述: 指定资源的名称或目标。
- 示例: 在
package
模块中,name
用于指定要安装或删除的软件包的名称。
2. state
:
- 描述: 定义资源的目标状态。
- 选项:
present
或installed
:资源应存在(如安装包、文件等)。absent
或removed
:资源应不存在。started
:服务应启动。stopped
:服务应停止。restarted
:服务应重新启动。latest
:例如软件包应更新到最新版本。
- 示例: 在
service
模块中,state
可以设置为started
或stopped
。
3. src
:
- 描述: 指定源文件或目录路径。
- 示例: 在
copy
模块中,src
用于指定本地文件路径,准备复制到目标主机。
4. dest
:
- 描述: 指定目标路径。
- 示例: 在
copy
模块中,dest
用于指定文件应该复制到的路径。
5. user
:
- 描述: 指定执行操作的用户。
- 示例: 在
file
模块中,user
用于设置文件或目录的所有者。
6. group
:
- 描述: 指定文件或目录所属的组。
- 示例: 在
file
模块中,group
用于设置文件或目录的组。
7. mode
:
- 描述: 设置文件或目录的权限模式。
- 示例: 在
file
模块中,mode
用于设置权限,例如0755
。
为什么是“0755”而不是“755” :
在这种情况下,mode
参数通常用于指定文件的访问权限。数字0755
是一个八进制数,用于Unix和类Unix系统中设置文件权限。这里的0755
表示:
0
:表示这是一个八进制数。7
:代表文件所有者(owner)具有读(4)、写(2)和执行(1)权限,总和为7。- 第二个
5
:代表与文件所有者同组的用户(group)具有读(4)和执行(1)权限,总和为5。 - 第三个
5
:代表其他用户(others)也具有读(4)和执行(1)权限,总和为5。
因此,0755
意味着文件所有者可以完全控制文件,而同组用户和其他用户可以读取和执行文件,但不能写入。
在Unix和类Unix系统中,权限数字通常以八进制形式表示,所以0755
中的前导0
是必要的,它告诉系统这是一个八进制数。如果你只写755
,系统会将其解释为十进制数,这将导致不同的权限设置。
十进制数755
转换为八进制是0b111 101 101
,这在八进制中表示为0755
。但是,如果你在设置权限时使用755
而不是0755
,系统会将其解释为十进制数755
,这在八进制中实际上是0b544
,这会导致不同的权限设置,通常不是你想要的。
因此,为了确保权限正确设置为所有者全部权限,组和其他用户读/执行权限,你应该使用0755
。
在编程中,特别是在Python语言中,0b
是一个二进制数的前缀。当你在数字前面加上0b
,它告诉解释器这个数字是一个二进制数。例如,0b1011
是一个二进制数,它等价于十进制数11
。
然而,在你提到的上下文中,0755
是一个八进制数,不是二进制数。在Unix和类Unix系统中,文件权限通常以八进制数的形式表示。八进制数的前缀是0
,而不是0b
。所以,0755
是一个八进制数,它表示文件的权限设置。
总结一下:
0b
前缀用于表示二进制数。0
前缀用于表示八进制数。- 没有前缀的数字默认是十进制数。
8. delegate_to
:
- 描述: 指定将任务委托到其他主机执行。
- 示例: 用于在 Ansible Playbook 中将特定任务委托到不同的主机。
9. args
:
- 描述: 用于传递其他参数,模块通常会接受以字典形式提供的额外参数。
- 示例: 在一些模块中,如
command
,args
可以用于指定额外的命令行参数。
10. with_items
:
- 描述: 用于循环处理列表中的每一项。
- 示例: 在
yum
模块中,可以使用with_items
来逐个安装列表中的软件包。
11. register
:
- 描述: 将任务的结果存储在变量中,以便后续使用。
- 示例: 在 Playbook 中,可以用
register
将任务结果保存为变量以便进一步操作。
12. when
:
- 描述: 根据条件判断是否执行任务。
- 示例: 在 Playbook 中使用
when
来控制任务的执行条件。
这些参数通常可以与具体的 Ansible 模块结合使用,以实现复杂的自动化任务。模块的文档会提供详细的参数说明和示例,可以查阅 Ansible 官方文档 来获取更多具体的模块信息。
Ansible 是一个强大的自动化工具,它使用模块来执行各种任务。每个模块都有自己特定的参数,但有一些通用的参数可以在多个模块中使用。以下是
Ansible 模块常见的通用参数及其说明:
become
:
- 说明:用于提升权限。设置为
yes
时,模块会使用提权工具(如sudo
)来执行任务。- 示例:
become: yes
become_user
:
- 说明:指定提权后的用户身份。
become
参数为yes
时,这个参数会指定使用哪个用户来执行任务。- 示例:
become_user: www-data
become_method
:
- 说明:指定提权的方法。常用的值包括
sudo
,su
,pbrun
,pfexec
,doas
等。- 示例:
become_method: sudo
delegate_to
:
- 说明:指定将任务委派给其他主机来执行,而不是当前主机。
- 示例:
delegate_to: dbserver.example.com
ignore_errors
:
- 说明:设置为
yes
时,即使任务失败也会继续执行其他任务。用于容忍某些任务失败。- 示例:
ignore_errors: yes
register
:
- 说明:将任务的输出结果保存到变量中,以便后续任务使用。
- 示例:
register: result
until
:
- 说明:指定一个条件,任务将反复执行直到条件成立或者达到最大重试次数。
- 示例:
until: result.rc == 0
retries
:
- 说明:与
until
配合使用,指定任务最大重试次数。- 示例:
retries: 5
delay
:
- 说明:与
until
和retries
配合使用,指定每次重试之间的等待时间(以秒为单位)。- 示例:
delay: 10
timeout
:
- 说明:设置任务的超时时间(以秒为单位),超出时间后任务将被中断。
- 示例:
timeout: 60
这些通用参数帮助你在编写 Ansible
剧本时更好地控制任务的执行方式和处理结果。具体模块可能会有自己的专用参数,但了解这些通用参数可以让你更加灵活地管理和优化自动化任务。
To-Do 下面模块的说明测试验证???????????
shell模块
ansible web_group -m shell -a 'df -h'
ansible web_group -m shell -a 'ps -ef | grep nginx'
command模块
不能全部识别shell中的特殊符号,如:command无法使用管道符“|”
验证:
ansible web_group -m command -a 'ps -ef | grep nginx'
script模块
管理机脚本推送到其他机器中
ansible web_group -m script -a '/root/test_script_module.sh'
file模块
有什么用:
动作选项:
如何同时创建多个目录?
可以通过使用 with_items
循环来实现。下面是一个示例任务:
- name: Create multiple directoriesfile:path: "{{ item }}"state: directorywith_items:- /path/to/dir1- /path/to/dir2- /path/to/dir3
将需要创建的目录路径替换为你自己的路径即可。
copy模块
yum模块
有什么用:
动作选项:
- 1
- 2
- 3
ansible db01 -m yum -a "name=mariadb-server state=present"
yum-repository模块
有什么用:
动作选项:
根据仓库文件的内容的选项:
-
name
表示仓库的名字 -
description
对仓库的描述信息 -
baseurl
-
file
-
owner
-
group
-
gpgcheck
- =yes
- =no
-
enabled
- =yes
- =no
-
state=present
创建 -
state=absent
删除
#删除仓库:
ansible web01 -m yum_repository -a 'name=nginx-stable-repos state=absent'
service模块
有什么用:
动作选项:
-
name
服务名 -
state=
- started
? - stopped
? - restarted
? - reloaded
?
- started
systemd模块
user模块
group模块
mount模块
unarchive模块
mysql_db
什么用
用于创建、删除和管理 MySQL 数据库。你可以通过该模块指定数据库的名称、字符集、排序规则等属性。
动作选项
确保目标主机有能够操控MySQL数据库的模块MySQL-python
否则,会有以下报错:下面的mysql_user模块也是一样的
测试
---
- name: The playbook to create database test_dbhosts: db01become: notasks:- name: to ensure the MySQL-python is installed in database serveryum:name: MySQL-pythonstate: present- name: to ensure the mariadb-server service is activedservice:name: mariadbstate: started- name: to create the database test_dbmysql_db:login_user: rootlogin_password: 4439name: test_db2state: present
mysql_user
有什么用
用于创建、修改和删除 MySQL 用户。你可以设置用户的权限、主机限制、密码等属性。
动作选项
1、name
mysql里的数据库的用户
2、host
数据库访问的主机域
3、password
指定数据库访问的用户对应的密码
4、priv
指定权限(privileges),如:wp_db.*:ALL
5、login_user
启动mysql服务的登录用户(如果已设置了的话)
6、login_password
启动mysql服务的登录用户对应的密码
7、state
- present
- absent
测试:
管理机远程连接数据库服务器的数据库服务并设置库的登录用户
---
- name: the playbook to creat user of a databasehosts: db01become: notasks:- name: 确保安装Ansible需要连接数据库的Python服务yum:name: MySQL-pythonstate: present- name: 确保已启动mariadb服务service:name: mariadbstate: started - name: 设置test_db数据库的用户mysql_user:login_user: rootlogin_password: 4439name: test_db_user1host: '172.16.1.%'password: 4439priv: 'test_db.*:ALL' # <==># mysql -u root -p4439# create user 'test_db_user1'@'172.16.1.%' identified by '4439'; # grant all privileges on test_db.* to 'test_db_user1'@'172.16.1.%' with grant option;