Ansible系列(三)

前面我们安装并大体了解了 Ansible 的使用,接下来在我们开始学习 Playbook 以及其他好玩的内容之前,先来瞧瞧 ad-hoc 这个命令。

什么是 ad-hoc

ad-hoc 命令和 Python 的 shell 命令差不多,用来快速执行验证一些命令。后面编写的 Playbook 就好像是 Python 的 .py 文件,通过 ad-hoc 就像使用 iPython 一样能帮助我们更好地学习 Playbook。

之前我们用到的 ansible all -m ping 就是一个 ad-hoc 命令。

分身数

在上一篇讲到可以在“清单”文件中定义主机组,一个组里面可能有几个主机,也可能有十几个、几十个。我们执行 ad-hoc 命令的时候 Ansible 能在同一时间同时操作几台主机,在 Ansible 的配置文件中默认定义为 5 个,我们也可以在执行 ad-hoc 命令的时候通过 -f 参数手动指定:

1
ansible all -m ping -f 10

模块

就如 Python 拥有许多内置包一样,Ansible 也有许多内置模块。

前面我们一直使用的 ping 就是其中的一个模块,下面再介绍几个常用的模块。

使用 ansible-doc -l 可以查看到 Ansible 有哪些内置的模块,以及这些模块的简介。

我们在想要实现一个功能的时候可以通过 ansible-doc -l | grep "功能关键字" 来快速搜索。

找到对应的模块名字之后,我们可以使用 ansible-doc -s ping 来查看详细关于模块的使用方法(示例为查看 ping 模块的具体使用方法)。

shell

1
$ ansible all -m shell -a 'echo $PWD'

上面调用 shell 模块,并通过 -a 参数传入执行 shell 命令时候的参数。

在传入参数的时候需要注意单引号和双引号的区别:上面使用的单引号里面的 $PWD 是远程主机的环境变量,如果换成双引号则 $PWD 使用的是当前执行 Ansible 命令的主机的环境变量。

还记得我们之前说的,Ansible 具有“幂等性”的特征吗。到目前为止,我们一直在使用简单的命令。但是大多数的 Ansible 模块并不是简单的执行命令,它们能在执行命令前计算出最终的状态,然后判断到底需不需要执行我们传进来的命令。

文件传输

copy

我们先通过 ansible-doc -s copy 看看有哪些常用操作:

  • src:本地需要复制到远程主机的文件或目录,可以是绝对路径,也可以是相对路径。
    • 指定的路径是文件:没话说,直接复制该文件
    • 指定的路径是文件夹:如果不是以“/”结尾,那就是把该文件夹整个复制,如果是以“/”结尾,则是把文件夹里面的内容复制到远程主机。
  • dest:复制到远程主机的哪个路径。
    • 如果“src”是一个文件夹,“dest”也必须是个文件夹。
    • 如果指定的“src”路径不存在并且“dest”以“/”结尾或者“src”是个文件夹,“dest”会以 mkdir -p 的形式创建。
    • 如果“src”和“dest”都是文件,那么“dest”路径不存在则会执行失败。
  • force:默认“yes”。当文件名一样,但是内容不一样时,是否强制替换。
  • backup:当强制替换文件的时候,是否需要备份原文件。
  • mode:修改文件或文件夹的权限。对于习惯使用 chmod 的人来说,如果指定数字,则必须使用八进制(如 0644 或 01777 这样的),如果指定字符串,则使用引号(如 ‘644’ 或 ‘1777’ 这样的)。Ansible 1.8版本之后可以使用符号模式(如 u+rwx 或 u=rw,g=r,o=r 这样的)。

直接把文件复制到远程主机:

1
$ ansible all -m copy -a "src=/etc/hosts dest=/tmp/hosts"
file
  • path:需要管理的文件对象
  • state:
    • directory:类似 mkdir -p
    • file:创建文件
    • link:创建软链接
    • hard:创建硬链接
    • absent:删除文件或文件夹,解除软硬链接
    • touch:如果 path 不存在,则创建一个空文件。如果 path 存在,则更新该文件的权限或者修改时间
  • src:当 state=link/hard 的时候我们需要指定链接的源文件
    • 绝对路径
    • 相对路径:相对要被创建链接的文件的路径
    • 空路径
  • force:作用于创建链接的时候
    • 源文件不存在(之后会有)
    • 目标链接已存在(则会先解除原来的链接,再创建当前新的链接)
  • mode:和 copy 模块的 mode 一致
  • recurse:当操作的目标为文件夹的时候,recurse=yes,可以递归地修改文件夹中文件的属性

修改权限

1
$ ansible all -m file -a "dest=/srv/foo/a.txt mode=600 owner=haha group=haha"

创建文件夹

1
$ ansible all -m file -a "dest=/path/to/new/dir mode=755 owner=haha group=haha state=directory"

删除文件

1
$ ansible all -m file -a "dest=/path/to/new/dir state=absent"

git

当我们部署 webapp 的时候如果是从 git 拉取代码的话,可以使用 git 模块:

  • repo:git 仓库地址(必填)
  • accept_hostkey:设为 yes,能帮我们自动把 git 服务器添加到 known_hosts 中。
  • clone:如果目标路径不存在,则不会 clone 远程仓库(默认 yes)
  • dest:把远程仓库 clone 到哪里(除非上面 clone=no,不然必填)
  • force:如果设为 yes,会丢掉本地仓库的任何变动
  • version:checkout 到哪个分支(也可以是 HEAD,分支名,tag 名,SHA-1 值)
1
$ ansible all -m git -a "repo=https://foo.example/org/repo.git dest=/srv/myapp version=develop accept_hostkey=yes force=yes"

Ansible 拥有众多模块,暂且不展开讲述了,等用到的时候查下基本就知道怎么用了,多实践才能熟练。

P.S. 关注我的公众号,第一时间接收更新提醒。


公众号二维码