📜  Ansible Shell

📅  最后修改于: 2020-12-26 12:27:06             🧑  作者: Mango

Ansible壳

Ansible Shell模块旨在针对基于目标UNIX的主机执行Shell命令。 Ansible可以运行,但任何带有管道,重定向的高级命令除外。您还可以使用Ansible shell模块执行shell脚本。

Ansible shell的主要优点是,从安全角度来看,任何带有管道和分号的高复杂度命令可能都是不利的,因为单个错误可能会花费很多并破坏系统完整性。

  • Ansible shell模块仅设计用于基于LINUX的计算机,不适用于Windows。对于Windows,您应该使用win_shell
  • Ansible Shell模块可用于执行Shell脚本。 Ansible有一个名为script的专用模块,该模块用于将Shell脚本从控制计算机复制到远程服务器。

让我们看看如何在剧本和Adhoc中使用Ansible shell模块的语法:

剧本中Ansible shell模块的语法

剧本的美在于它的外观和书写方式。剧本使用YAML编写,因此很容易理解。

下图演示了如何将Adhoc命令转换为Ansible剧本的剧本。

Adhoc中Ansible shell模块的语法

下图以Adhoc方式显示了Ansible shell模块的快速语法。

使用命令行管理程序或命令模块在单个任务中执行单个命令。假设您要获取远程服务器的日期。远程服务器位于名为testservers的主机组下。

步骤1:登录Ansible服务器。

步骤2:下面是一个示例,该示例使用远程主机中的Shell模块执行单个命令。

---
-name: Shell command example 
Hosts: testservers
tasks:
-name: check date with the shell command
shell:
"date"
register: datecmd
tags: datecmd
-debug: msg= "{{datecmd.stdout}}"

在上面的示例中,我们针对名为testservers的主机组运行剧本,并执行一个简单的date命令,并将该命令的输出保存到一个名为datecmd的Register变量中。

在最后一行,我们检索注册的变量并仅打印存储在datecmd的stdout属性中的date命令输出。

示例2:在一个shell中执行多个命令:

外壳程序可以在一个外壳程序中一起接受各种命令。另外,您可以使用Ansible shell模块编写shell脚本。

在下面的示例中,我们对一些shell命令进行了分组,以执行受控且干净的tomcat重新启动。

该剧本旨在按顺序执行以下步骤,例如:

  • 停止tomcatServer
  • 清除缓存
  • 截断日志文件
  • 启动实例
---
  - name: Shell Examples
    hosts: testservers
    tasks:
    - name: Clear Cache and Restart tomcat
      become: yes
      delay: 10
      async: 10
      poll: 50
      shell: |
        echo -e "\n Change directory to the Tomcat"
        cd tomcat8/
        echo -e "\n Present working directory is" `pwd`
        
        echo -e "\n Stopping the tomcat instance"
        bin/shutdown.sh
        echo -e "\n Clearning the tmp and work directory of tomcat"
        rm -rfv tmp/*
        rm -rfv work/*
        echo -e "\nTruncate the log file"
        > logs/catalina.out
        echo -e "\nDirectory listing"
        ls -lrtd logs/catalina.out
        echo -e "\nStarting the instance"
        bin/startup.sh    
      args:
        chdir: "/apps/tomcat/"
      register: fileout
      tags: fileout 
    - debug: msg="{{ fileout.stdout_lines }}"