您的位置:首页 > 财经 > 金融 > ??Ansible——ad-hoc

??Ansible——ad-hoc

2024/12/23 21:26:23 来源:https://blog.csdn.net/qq_47030101/article/details/142130362  浏览:    关键词:??Ansible——ad-hoc

文章目录

    • 一、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 模块,比如 pingcommandshellyum 等。
  • <模块参数>: 传递给模块的参数,通常是以键值对的形式。
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

应用场景

  1. 快速测试和调试: Ad-hoc 命令非常适合用来快速测试某些功能或调试问题,而不需要编写完整的 playbook。

  2. 一次性操作: 对于一些一次性的配置更改或操作,比如安装一个软件包或重启服务,ad-hoc 命令是一个高效的选择。

  3. 批量管理: 使用 ad-hoc 命令可以同时对多个主机执行相同的操作,比如更新系统或执行安全检查。

注意事项

  • 权限: 确保你有权限在目标主机上执行所需的操作,有些操作可能需要 root 权限。
  • 安全: 使用 ad-hoc 命令时要小心,以避免对生产环境造成不必要的影响。
  • 性能: 对于大规模的操作或复杂的任务,建议使用 playbook,以便更好地管理和维护配置。

通过 ad-hoc 命令,你可以快速、灵活地管理和配置你的服务器,帮助你在日常工作中提高效率。

二、Ansible模块

Ansible 是一个开源的自动化工具,用于配置管理、应用程序部署和任务自动化。Ansible 的模块是执行任务的基本单元,每个模块都是一个 Python 脚本或插件,用于与目标系统交互。模块的通用组成包括以下几个部分:

  1. 模块的入口点

    • 模块通常由一个名为 main 的函数或类的实例化来定义,这是模块的执行入口。
  2. 参数定义

    • 模块接收参数,这些参数通过 Ansible 的任务定义传递。参数可以在模块的 argument_spec 中定义。它们描述了模块可以接受的选项、数据类型、是否必需等。
  3. 逻辑处理

    • 模块包含实现特定功能的核心逻辑。例如,创建文件、安装软件包、修改配置等。这部分的代码处理传递给模块的参数,执行必要的操作,并产生相应的结果。
  4. 返回结果

    • 模块需要以特定格式返回结果,通常是 JSON 格式。结果包含任务的成功状态、返回的消息、可能的变更等信息。Ansible 根据这些信息来报告任务的状态给用户。
  5. 错误处理

    • 模块应具备处理和报告错误的能力。如果模块在执行过程中遇到问题,它应能以清晰的方式报告错误,并返回相应的错误信息。
  6. 文档字符串

    • 模块通常包含一个文档字符串,描述模块的功能、参数及用法。这有助于用户理解如何使用该模块。
  7. 依赖管理

    • 某些模块可能需要依赖其他 Python 库或系统工具。在模块中,可以通过导入相关库或检查系统环境来管理这些依赖。
  8. 测试和调试

    • 模块应包含测试和调试功能,以确保其在不同环境下的正确性和可靠性。这可以包括内置测试用例或调试输出。

以下是一个简单的 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()

这个示例模块接受两个参数 namestate,然后根据 state 的值生成响应的消息。根据具体实现的复杂性,模块的组成和功能可能会有所不同,但这些基本组成部分是大多数 Ansible 模块所共有的。
在这里插入图片描述

Ansible模块的参数

Ansible 的模块可以用于自动化系统配置和管理,模块通常有一些通用的参数,虽然具体的参数取决于模块的类型和功能。以下是一些常用的 Ansible 模块的通用参数及其说明:

1. name:
  • 描述: 指定资源的名称或目标。
  • 示例: 在 package 模块中,name 用于指定要安装或删除的软件包的名称。
2. state:
  • 描述: 定义资源的目标状态。
  • 选项:
    • presentinstalled:资源应存在(如安装包、文件等)。
    • absentremoved:资源应不存在。
    • started:服务应启动。
    • stopped:服务应停止。
    • restarted:服务应重新启动。
    • latest:例如软件包应更新到最新版本。
  • 示例: 在 service 模块中,state 可以设置为 startedstopped
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:
  • 描述: 用于传递其他参数,模块通常会接受以字典形式提供的额外参数。
  • 示例: 在一些模块中,如 commandargs 可以用于指定额外的命令行参数。
10. with_items:
  • 描述: 用于循环处理列表中的每一项。
  • 示例: 在 yum 模块中,可以使用 with_items 来逐个安装列表中的软件包。
11. register:
  • 描述: 将任务的结果存储在变量中,以便后续使用。
  • 示例: 在 Playbook 中,可以用 register 将任务结果保存为变量以便进一步操作。
12. when:
  • 描述: 根据条件判断是否执行任务。
  • 示例: 在 Playbook 中使用 when 来控制任务的执行条件。

这些参数通常可以与具体的 Ansible 模块结合使用,以实现复杂的自动化任务。模块的文档会提供详细的参数说明和示例,可以查阅 Ansible 官方文档 来获取更多具体的模块信息。

Ansible 是一个强大的自动化工具,它使用模块来执行各种任务。每个模块都有自己特定的参数,但有一些通用的参数可以在多个模块中使用。以下是
Ansible 模块常见的通用参数及其说明:

  1. become

    • 说明:用于提升权限。设置为 yes 时,模块会使用提权工具(如 sudo)来执行任务。
    • 示例become: yes
  2. become_user

    • 说明:指定提权后的用户身份。become 参数为 yes 时,这个参数会指定使用哪个用户来执行任务。
    • 示例become_user: www-data
  3. become_method

    • 说明:指定提权的方法。常用的值包括 sudo, su, pbrun, pfexec, doas 等。
    • 示例become_method: sudo
  4. delegate_to

    • 说明:指定将任务委派给其他主机来执行,而不是当前主机。
    • 示例delegate_to: dbserver.example.com
  5. ignore_errors

    • 说明:设置为 yes 时,即使任务失败也会继续执行其他任务。用于容忍某些任务失败。
    • 示例ignore_errors: yes
  6. register

    • 说明:将任务的输出结果保存到变量中,以便后续任务使用。
    • 示例register: result
  7. until

    • 说明:指定一个条件,任务将反复执行直到条件成立或者达到最大重试次数。
    • 示例until: result.rc == 0
  8. retries

    • 说明:与 until 配合使用,指定任务最大重试次数。
    • 示例retries: 5
  9. delay

    • 说明:与 untilretries 配合使用,指定每次重试之间的等待时间(以秒为单位)。
    • 示例delay: 10
  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

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;

在这里插入图片描述

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com