Skip to main content

4.Ad-hoc与命令执行模块

Ad-Hoc

Ansible提供两种方式去完成任务:

  • ad-hoc命令
  • ansible playbook

Ansible Ad-Hoc 是一种使用 Ansible 提供的命令行工具执行即时任务的方法。Ad-Hoc 是指 "即兴的" 或 "临时的",这种方式允许你在不编写 Playbooks 的情况下,直接在命令行中执行简单的任务。对于复杂的命令会使用playbook。

Ad-hoc的执行依赖于模块,ansible官方提供了大量的模块。 如:command、raw、shell、file、cron等,具体可以通过ansible-doc -l 进行查看 。可以使用ansible-doc -s module来查看某个模块的参数,也可以使用ansible-doc help module来查看该模块更详细的信息。

格式

ansible [pattern] -i inventory [options] -m module -a "arguments"

ansible 匹配主机或组 -m 模块名 -a '模块参数' ansible参数
  • pattern:用于指定目标主机或主机组的模式,可以是主机名、主机组名、通配符等。
  • -i inventory:可选,指定 Ansible 清单文件的路径。使用脚本从外部应用里获取的主机;
  • -m module:要执行的 Ansible 模块,表示执行什么样的任务。可以通过ansible-doc -l 查看目前安装的模块,默认不指定时,使用的是command模块,具体可以查看/etc/ansible/ansible.cfg 的“#module_name = command ” 部分,默认模块可以在该配置文件中进行修改;
  • -a arguments:传递给模块的参数,用于配置任务的行为。可以通过 “ansible-doc -s 模块名” 查看具体的用法及后面的参数。

示例

Ping 所有主机

ansible all -i inventory.ini -m ping

复制文件到目标主机

ansible web_servers -i inventory.ini -m copy -a "src=/local/path/file.txt dest=/remote/path/"

执行 Shell 命令

ansible db_servers -i inventory.ini -m shell -a "uptime"

用户说明

ansible在执行ad-hoc的时候,需要使用远程管理机上的一个用户身份,默认这个用户是root,而在实际生产环境中, 不建议直接使用root,而推荐使用一个普通用户,需要配置该普通用户可通过sudo提权。

配置示例

  1. 在被管理机上创建一个普通用户ansible,并配置sudo提权:

    # 创建ansible用户
    useradd ansible

    # 设置ansible用户可免密提权
    vim /etc/sudoers.d/ansible
    ansible ALL=(ALL) NOPASSWD:ALL

    chmod 400 /etc/sudoers.d/ansible
    mkdir /home/ansible/.ssh
    chown ansible.ansible /home/ansible/.ssh
    chmod 700 /home/ansible/.ssh
  2. 在管理端修改ansible.cfg配置文件如下:

    [default]
    remote_user = ansible
    ask_pass = False
    [privilege_escalation]
    become=True
    become_method=sudo
    become_user=root
    become_ask_pass=False
  3. 将管理端用户的 id_rsa.pub 复制到被管理端的 /home/ansible/.ssh//home/ansible/.ssh/authorized_keys 文件中,并设置该文件的权限为400

    # 管理端执行:
    ssh-copy-id -i .ssh/id_rsa.pub [email protected]

模块

模块类型

  • 核心模块(core modules)
    • 由Ansible官方团队提供
  • 附加模块(extra module)
    • 由各个社区提供,如opentack社区,docker社区
  • 自定义模块(consume module)
    • 用户自己编写

核心模块和附加模块默认安装,总计大概1000+

ansible-doc -l			#列出所有核心和附加模块

ansible-doc modulename #列出某个模块用法,类似man命令
ansible-doc -s modulename #列出某模块简要信息

命令执行模块

命令执行模块包含如下 四个模块:

  • command模块:该模块通过-a跟上要执行的命令可以直接执行,不过命令里如果有带有如下字符部分则执行不成功 “ "<", ">", "|", "&" ;
  • shell 模块:用法基本和command一样,不过其是通过/bin/sh进行执行,所以shell 模块可以执行任何命令,就像在本机执行一样;
  • raw模块:用法和shell模块一样,也可以执行任意命令,就像在本机执行一样;和command、shell模块不同的是其没有chdir、creates、removes参数
  • script模块:将管理端的shell 在被管理主机上执行,其原理是先将shell 复制到远程主机,再在远程主机上执行,原理类似于raw模块。

shell模块

shell模块包含如下选项:

  • creates:一个文件名,当该文件存在,则该命令不执行
  • free_form:要执行的linux指令
  • chdir:在执行指令之前,先切换到该指定的目录
  • removes:一个文件名,当该文件不存在,则该选项不执行

chdir示例:

# 三个命令都会返回执行成功的状态。不过实际上只有前两个文件会被创建成功。
ansible localhost -m command -a 'chdir=/tmp/ touch test.file'
ansible localhost -m shell -a 'chdir=/tmp/ touch test2.file'
ansible localhost -m raw -a 'chdir=/tmp/ touch test3.file'

creates与removes示例

ansible localhost -a 'creates=/tmp/server.txt uptime' 	#当/tmp/server.txt文件存在时,则不执行
ansible localhost -a 'removes=/tmp/server.txt uptime' #当/tmp/server.txt文件不存在时,则不执行

示例:

#文件存在时
ansible localhost -a 'creates=/tmp/server.txt uptime'
localhost | SUCCESS | rc=0 >>
skipped, since /tmp/server.txt existsDid not run command since '/tmp/server.txt' exists

ansible localhost -a 'removes=/tmp/server.txt uptime'
localhost | CHANGED | rc=0 >>
23:50:59 up 19 days, 7:22, 1 user, load average: 0.00, 0.01, 0.00

script模块

示例:

#要执行的脚本文件script.sh内容如下:
#/bin/bash
ifconfig
df -hT

# 执行ansible指令:
ansible 10.212.52.252 -m script -a 'script.sh'

其他常见模块

简要列举一些常见模块

核心模块(Core Modules)

这是 Ansible 的基本模块,提供了许多基础操作,包括文件操作、软件包管理、服务管理等。

  • command:在目标主机上执行命令。
  • copy:复制文件或目录到目标主机。
  • file:管理文件和目录的属性。
  • aptyum:在基于 Debian 或基于 Red Hat 的系统上管理软件包。
  • service:管理系统服务的状态。

系统模块(System Modules)

这些模块用于执行与操作系统相关的任务,如用户管理、组管理等。

  • user:管理系统用户。
  • group:管理系统组。
  • shell:在目标主机上执行 shell 命令。
  • cron:管理定时任务。

云模块(Cloud Modules)

这些模块用于与云服务提供商进行交互,管理云资源。

  • ec2:在 AWS 上管理 EC2 实例。
  • gcp:在 Google Cloud Platform 上管理资源。
  • azure_rm:在 Azure 上管理资源。

网络模块(Networking Modules)

用于配置和管理网络设备。

  • ios_command:在 Cisco IOS 设备上执行命令。
  • nxos_command:在 Cisco Nexus 设备上执行命令。
  • junos_command:在 Juniper Junos 设备上执行命令。

数据库模块(Database Modules)

用于与数据库交互。

  • mysql_db:管理 MySQL 数据库。
  • postgresql_db:管理 PostgreSQL 数据库。

文件模块(File Modules)

用于文件操作的模块。

  • find:在文件系统中查找文件。
  • assemble:将分散的文件组装成一个文件。

通信模块(Messaging Modules)

用于与消息队列、通知系统进行交互。

  • rabbitmq_user:在 RabbitMQ 中管理用户。
  • slack:向 Slack 发送消息。

Windows 模块(Windows Modules)

用于在 Windows 主机上执行任务。

  • win_service:管理 Windows 服务。
  • win_user:管理 Windows 用户。

其他模块(Other Modules)

其他类型的模块,用于执行特定的任务。

  • assert:用于断言条件是否为真。
  • wait_for:等待条件成立。