接下来介绍一些后面章节中会用到的模块 , 也是很常用的模块。 @ 调试和测试类的模块。 。 ping: ping 一下你的远程主机 , 如果可以通过 Ansible 连接成功,那么返回 pong 。 © debug : 用于调试的模块,只是简单打 印 些消息 , 有点像 Linux 的 echo 命令。 @ 文件类的模块。 © copy :从本地复制文件到远程节点。 。 template: 从本地复制文件到远程节点 , 并进行变量的替换。 © file :设置文件属性。 C) Linux 上的常用操作。 © user :管理用户账户。 。 yum : RedHat 系 Linux 上的包管理。 © service :管理服务。 © firewalld : 管理防火墙中的服务和端口。 @ 执行 shell 命令。 。 shell: 在节点上执行 shell 命令,支持$HOME 、~\ “ 〉 ”、“| ” 、 “ ;”和 “&” 。 。 command :在远程节点上面执行命令 , 不支持$HOME 、 “ < ”、 “>'|',';','&'.

  1. ping 模块 这个是测试远程节点的 SSH 连接是否就绪的常用模块。但它并不像 Linux 命令那样简单地 ping 一下远程节点 , 而是先检查能否通过 SSH 登录远程节点 , 再检查其 Python 版本能否满足要求 , 如果都满足则会返回 ping, 表示成功.ping 无须任何参数。因为 ping 是测试节点连接的可用性,所以通常在命令行中使用得较为频繁。下面是 ping 在命令行中的用法。 ansible all -m ping

  2. debug 模块 打印输出信息,类似 Linux 上的 echo 命令。 。 通过参数 msg 定义打印的字符串。 msg 中可以嵌入变量 ,下面的例子中注入了系统变量, Ansible 在执行 Playbook 之前会收集 一些比较常用的系统变量 ,这样在 Playbook 中不需要定义直接使用就可以。 [root@server3 test]# cat debug.yml

---
- hosts: nginx
  remote_user: root
  tasks:
  - debug: 
     msg: "systemc {{ inventory_hostname }} has gateway {{ ansible_default_ipv4.gateway }}"
  - name: display all variables/facts known for a host
    debug:
     var: hostvars[inventory_hostname]["ansible_default_ipv4"]["gateway"]
  - shell: /usr/bin/uptime
    register: result
  - debug:
     var: result
  1. copy 模块 从当前的机器上复制静态文件到远程节点上,并且设置合理的文件权限。注意, copy 模 块在复制文件的时候,会先比较一下文件的 checksum ,如果相同则不会复制,返回状态为 OK; 如果不同才会复制,返回状态为 changed 。 。设置文件权限。 利用 mode 设置权限可以是数字,当然也可以是符号的形式u=rw,g=r,o=r'’和”u+rw, g-wx, o-rwx @ 备份节点上原来的文件。 backup 参数为 yes 的时候,如果发生了复制( copy ) 操作 , 那么会先复制目标节点上的源 文件。当两个文件相同时,不再进行复制操作。 [root@server3 test]# cat copy.yml
---
- hosts: nginx
  remote_user: root

  tasks:
  - copy:
     src: /tmp/test
     dest: /tmp/test
     owner: root
     group: root
     mode: 0644
     backup: yes
  1. template 模块 如果复制的只是静态文件 , 那么用 copy 模块就足够了。但如果在复制的同时需要根据实际 情况修改部分内容,那么就需要用到 template 模块。 比如安装 Apache 后,你需要给节点复制一个测试页面 index .html。 index . html 里面需要显 示当前节点的主机名和 ip ,这时候就需要用到 template 。 在 index. html让 中,需要指定想替换的是哪个部分 , 那么这个部分就用变量来表示。 template使用的是 Python 的 Jinja2 模板引擎。只需要知道变量 的表示法是{{}}就可以了。 。 template 文件语法。 index.html 具体应该怎么写呢?既然是 template 文件,那么我们就加一个后缀 来提高可读 性, index.html.j2 。 下 面文件中使用了两个变量, ansible _ hostname 和 ansible_default二ipv4.address。

<html>
<title>Demo</title>
<body>
<div class =” block ” style =” height : 99 %;” 〉
<div class =” centered ” >
<h1>#46 Demo</hl>
<p>Served by { { ansible_hostname }} ({{} ansible_default_Ipv4.address }). </p>
</div>
</div>
</body>
</html>

使用 Facts 变量(远程主机的系统变量)的 template 。index .html.j2 使用的两个变量 ansible _ hostname 和 ansible _ default_ipv4.address 都是远程主机的系统变量, Ans ible 会替我们搜索,可以直接在 Playbook 中使用, 当然也可以直接在 template中使用。所以我们在写 template 语旬时无须传入参数。 [root@server3 test]# cat templates cat: templates: 是一个目录 [root@server3 test]# cat templates.yml

---
- hosts: nginx
  vars:
    http_port: 8080
    remote_user: root
  tasks:
  - name: display all variables/facts known for a host
    template: src=templates/index.html.j2 dest=/var/www/html/index.html 
  1. file 模块 file 模块可以用来设置远程主机上的文件、软链接( symlinks )和文件夹的权限,也可以 用 来创建和删除它们。 @ 改变文件的权限。 mode 参数既可以直接赋值数字权限(必须以 0 开头),还可以用来增加和删除权限。具体 的写法见下面的代码。

@ 创建文件的软链接。 注意,这里面的 src 和 dest 参数的含义和 copy 模块中的不一样, file 模块里面所操作的文 件都是远程节点上的文件。

@ 创建一个新文件。 像 touch 命令一样创建个新文件。

#create a directory if it doesn ’ t exist
- file :
path : /etc/some_directory
state: directory
mode: 0755
  1. user 模块 user 模块可以增、删、改 Linux 远程节点的用户账户,并为其设置账户的属性。 @ 增加账户。

创建账户 james , 并将其添加到两个 group 中。

- user:
    name: james
    shell : /bin/bash
    groups:
   admins , developers
   append : yes

@ 删除账户。 删除账户 johnd 。

- user:
    name: johnd
    state : absent
    remove: yes

@ 修改账户的属性。 为账户 jsmith 创建一个 2048 位的 SSH 密钥 , 放在气jsmith/.ssh/id_rsa 中 。

- user:
		name : jsmith
		generate_ssh_key: yes
		ssh_key_bits: 2048
		ssh_key_file:

为用户添加过期时间。

- user :
    name: james18
    shell : /bin/zsh
    groups: developers
    expires: 1422403387
  1. yum 模块 yum 源上安装和删除包。 安装最新版本的包,如果已经安装了老版本 , 那么会更新到最新的版本。
- name : install the latest version of Apache
   yum :
    name : httpd
    state: latest

安装指定版本的包。

- name : install one specific version of Apache
   yum :
    name : httpd-2 . 2 . 2 9-1. 4.amznl
    state : present

删除 httpd 包。

- name : remove the Apache package
   yum :
    name : httpd
    state : absent

@ 从本地文件中安装包。

- name : install nginx rpm from a loca l fi l e
   yum :
     name :
     /usr/local/src/nginx-release-centos-6-0.el6.ngx.noarch.rpm
    state : present

。 从 URL 中安装包。

- name : install the nginx rpm from a remote repo
   yum :
    name:
    http://nginx. org/packages/centos/6/noarch/RPMS/nginx-release-centos-6-0.el6.ngx.noarch.rpm
    state : present
  1. service 服务管理模块 该模块用来管理远程节点上的服务,比如 httpd , sshd 、 nfs 、 crond 等。 。 开、关、重启、重载服务。 开启服务。
  • service : name : httpd state: started 关服务。
  • service : name: httpd state: stopped 重启服务。
  • service : name : http state : restarted 重载服务。
  • service: name: httpd state: reloaded @ 设置开机启动的服务。
  • service: name: httpd enable

@ 启动网络服务下的接口 eth0

  • service: name: network state: restarted args: eth0
  1. shell 模块 在远程节点上通过/bin/sh 执行命令。如果一个操作可以通过模块 yum 、 copy 实现 ,那么建 议不要使用 s hell 或者 command 这样通用的命令模块。因为通用的命令模块不会根据具体操 作的特点进行状态( status )判断,所以当没有必要再重新执行的时候,它还是会重新执行 一遍。 支持$home 。
- name: test $home

  shell : echo ” test” >~/ test/file

支持“ && ”。

- shell : systemctl start httpd && systemctl enable httpd

支持“>>”。

- shell : echo foo > / tmp/testfoo

指定用 bash 运行命令。

  • shell: cat < /tmp/*txt args : executable: /bin/bash 11 . command 模块 在远程节点上执行命令。和 shell 模块类似,但不支持$HOME “ 〈’\“>”、“|”、“;”和“&” 等操作。 @ 与 shell 模块相同之处。 都可以调用单条命令。
  • command :/sbin/shutdown -t now

都可以在执行命令前改变目录,并仅在某个文件(例如 database )不存在时再执行。

  • command : /usr/bin/make database . sh argl arg2 args: chdir: somedir/ creates: /path/to/database @ 和 she ll 模块不同之处。

command 模块多了一个传参方式。

  • command : /usr/bin/make_database . sh argl arg2 creates=/path/to/ database command 模块不支持“ && ”和“>>”。 下面的写法是无法创建/tmp/test3 和/tmp/test4 的。
  • name : test $home command : echo ” test3 ” >~/ tmp/test3 && echo ” test4 ” >~/ tmp/test4