Ad-Hoc 介绍

一、什么是ad-hoc 命令?

ad-hoc 命令是一种可以快速输入的命令,而且不需要保存起来的命令。就相当于bash中的一句话shell。这也是一个好的地方,在学习ansible playbooks时可以先了解另外一种ansible基本的快速用法,不一定非要写一个palybook文件。

一般来说,ansible的强大之处在于它的playbook 剧本。但为什么我们还要使用这种临时的命令呢?

临时命令适用于下面类似的场景,如果你想在圣诞节到来之时,关掉实验室的电脑,只需要ansible 的一行命令即可,而不必编写一个playbook文件来完成这个工作。

不过,对于配置管理和应用部署这种工作,还是需要使用“/usr/bin/ansible-playbook”命令。

1、并行和Shell 命令

接上文,ansible 服务器已经配置好使用密钥进行认证,管理主机,如果不想使用密钥的话,那么可以使用--ask-pass (-k) 来用密码管理。但是最好还是用密钥的方式。

如下:使用以下命令来查看webserver 组内主机的端口开放状况:

  1. [root@docker ~]# ansible webserver -a 'netstat -ulntp'
  2. 172.17.0.3 | SUCCESS | rc= >>
  3. Active Internet connections (only servers)
  4. Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
  5. tcp 0.0.0.0: 0.0.0.0:* LISTEN -
  6. tcp6 ::: :::* LISTEN -
  7.  
  8. web1 | SUCCESS | rc= >>
  9. Active Internet connections (only servers)
  10. Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
  11. tcp 0.0.0.0: 0.0.0.0:* LISTEN -
  12. tcp6 ::: :::* LISTEN -

命令的最后也可以加 -f number ,表示使用的并发进程数目,默认是5个,如下:

  1. ansible webserver -a 'netstat -ulntp' -f

/usr/bin/ansible 默认使用当前ansible 服务器登陆的用户来进行管理,如果你不喜欢这样,也可以使用 -u username 的方式来指定用户,如下:

注:(zhangsan 这个用户必须是被管理主机上真实存在的)

  1. [root@docker ~]# ansible webserver -a "w" -u zhangsan -k

如果你不想使用当前的用户来管理运行命令,也可以使用 --become -K 命令提升权限.

以上是关于ansible 的基础,ansible 有许多的模块,以上的栗子中,没有指定模块,因为 默认的模块是 command ,如果要想使用其它模块,可以用-m 模块名 来指定。

注:command 模块不支持扩展的shell语法,如使用管道和重定向。当然如果需要特殊的shell 语法,可以使用shell模块来完成任务。像下面这样:

  1. [root@docker ~]# ansible webserver -m shell -a 'echo $TERM'
  2. web1 | SUCCESS | rc= >>
  3. xterm-256color
  4.  
  5. 172.17.0.3 | SUCCESS | rc= >>
  6. xterm-256color

2、文件传输管理

这里是/usr/bin/ansible 命令行的另外一个用例,Ansible 可以将多个文件并发的拷贝到多台机器上。使用 copy 模块,将文件直接传输到多个服务器上,如下:

  1. [root@docker ~]# ansible webserver -m copy -a "src=/etc/hosts dest=/tmp/hosts"
  2. 172.17.0.3 | SUCCESS => {
  3. "changed": true,
  4. "checksum": "ba0ed35ca3f16342b883784ec7928491d359b8ab",
  5. "dest": "/tmp/hosts",
  6. "gid": ,
  7. "group": "root",
  8. "md5sum": "9e979f3a6509f8d829209613343f90b9",
  9. "mode": "",
  10. "owner": "root",
  11. "size": ,
  12. "src": "/root/.ansible/tmp/ansible-tmp-1487773694.97-103709947729677/source",
  13. "state": "file",
  14. "uid":
  15. }
  16. web1 | SUCCESS => {
  17. "changed": true,
  18. "checksum": "ba0ed35ca3f16342b883784ec7928491d359b8ab",
  19. "dest": "/tmp/hosts",
  20. "gid": ,
  21. "group": "root",
  22. "md5sum": "9e979f3a6509f8d829209613343f90b9",
  23. "mode": "",
  24. "owner": "root",
  25. "size": ,
  26. "src": "/root/.ansible/tmp/ansible-tmp-1487773694.94-149872215856203/source",
  27. "state": "file",
  28. "uid":
  29. }

检查一下:

  1. [root@docker ~]# ansible webserver -a 'stat /tmp/hosts'
  2. web1 | SUCCESS | rc= >>
  3. File: '/tmp/hosts'
  4. Size: Blocks: IO Block: regular file
  5. Device: fc03h/64515d Inode: Links:
  6. Access: (/-rw-r--r--) Uid: ( / root) Gid: ( / root)
  7. Access: -- ::58.946882890 +
  8. Modify: -- ::15.001562188 +
  9. Change: -- ::15.355564788 +
  10. Birth: -
  11.  
  12. 172.17.0.3 | SUCCESS | rc= >>
  13. File: '/tmp/hosts'
  14. Size: Blocks: IO Block: regular file
  15. Device: fc02h/64514d Inode: Links:
  16. Access: (/-rw-r--r--) Uid: ( / root) Gid: ( / root)
  17. Access: -- ::58.949882912 +
  18. Modify: -- ::15.041562482 +
  19. Change: -- ::15.349564744 +
  20. Birth: -

说下另外一个模块 file ,它允许更改文件的宿主以及权限,这些相同的选项同样适用 copy 模块,如下:

  1. [root@docker ~]# ansible webserver -m file -a "dest=/tmp/hosts mode=600"
  2. web1 | SUCCESS => {
  3. "changed": true,
  4. "gid": ,
  5. "group": "root",
  6. "mode": "",
  7. "owner": "root",
  8. "path": "/tmp/hosts",
  9. "size": ,
  10. "state": "file",
  11. "uid":
  12. }
  13. 172.17.0.3 | SUCCESS => {
  14. "changed": true,
  15. "gid": ,
  16. "group": "root",
  17. "mode": "",
  18. "owner": "root",
  19. "path": "/tmp/hosts",
  20. "size": ,
  21. "state": "file",
  22. "uid":
  23. }

更改文件的宿主以及属组:

  1. [root@docker ~]# ansible webserver -m file -a "dest=/tmp/hosts mode=600 owner=zhangsan group=zhangsan"
  2. web1 | SUCCESS => {
  3. "changed": true,
  4. "gid": ,
  5. "group": "zhangsan",
  6. "mode": "",
  7. "owner": "zhangsan",
  8. "path": "/tmp/hosts",
  9. "size": ,
  10. "state": "file",
  11. "uid":
  12. }
  13. 172.17.0.3 | SUCCESS => {
  14. "changed": true,
  15. "gid": ,
  16. "group": "zhangsan",
  17. "mode": "",
  18. "owner": "zhangsan",
  19. "path": "/tmp/hosts",
  20. "size": ,
  21. "state": "file",
  22. "uid":
  23. }

本文属于作者原创,转载请注明出处:飞走不可 :http://www.cnblogs.com/hanyifeng/p/6431450.html

使用file 模块来创建目录,类似于 mkdir -p,如下:

  1. [root@docker ~]# ansible webserver -m file -a "dest=/tmp/zhangsan/pp/1 mode=755 owner=zhangsan group=zhangsan state=directory"
  2. web1 | SUCCESS => {
  3. "changed": true,
  4. "gid": ,
  5. "group": "zhangsan",
  6. "mode": "",
  7. "owner": "zhangsan",
  8. "path": "/tmp/zhangsan/pp/1",
  9. "size": ,
  10. "state": "directory",
  11. "uid":
  12. }
  13. 172.17.0.3 | SUCCESS => {
  14. "changed": true,
  15. "gid": ,
  16. "group": "zhangsan",
  17. "mode": "",
  18. "owner": "zhangsan",
  19. "path": "/tmp/zhangsan/pp/1",
  20. "size": ,
  21. "state": "directory",
  22. "uid":
  23. }

以及删除目录(递归)和删除文件,如下:

  1. [root@docker ~]# ansible webserver -m file -a "dest=/tmp/zhangsan/pp/1 state=absent"
  2. 172.17.0.3 | SUCCESS => {
  3. "changed": true,
  4. "path": "/tmp/zhangsan/pp/1",
  5. "state": "absent"
  6. }
  7. web1 | SUCCESS => {
  8. "changed": true,
  9. "path": "/tmp/zhangsan/pp/1",
  10. "state": "absent"
  11. }

3.软件包管理

包括yum 和 apt,以下是一些yum 的示例。

确保该软件包已经安装,但不要更新它,相当于检查改软件是否安装:

  1. [root@docker ~]# ansible webserver -m yum -a "name=vim state=present"
  2. 172.17.0.3 | SUCCESS => {
  3. "changed": false,
  4. "msg": "",
  5. "rc": ,
  6. "results": [
  7. "vim-enhanced-2:7.4.160-1.el7_3.1.x86_64 providing vim is already installed"
  8. ]
  9. }
  10. web1 | SUCCESS => {
  11. "changed": false,
  12. "msg": "",
  13. "rc": ,
  14. "results": [
  15. "vim-enhanced-2:7.4.160-1.el7_3.1.x86_64 providing vim is already installed"
  16. ]
  17. }

确保软件安装的是最新的版本,如下:

  1. [root@docker ~]# ansible webserver -m yum -a "name=vim state=latest"
  2. 172.17.0.3 | SUCCESS => {
  3. "changed": false,
  4. "msg": "",
  5. "rc": ,
  6. "results": [
  7. "All packages providing vim are up to date",
  8. ""
  9. ]
  10. }
  11. web1 | SUCCESS => {
  12. "changed": false,
  13. "msg": "",
  14. "rc": ,
  15. "results": [
  16. "All packages providing vim are up to date",
  17. ""
  18. ]
  19. }

确保软件没有被安装:

  1. [root@docker ~]# ansible webserver -m yum -a "name=vim state=absent"

4.用户和组管理

"user" 模块允许轻松的创建和管理现有的用户账号,以及删除可能存在的用户账号,如下:

创建一个用户,并设置密码(这里的密码必须是加密后的。这里有坑,如果你写成了明文的密码如如:123456,那么系统的root密码就是未知(/etc/shadow文件中,该用户的密码位置那就变成123456了,即误搞成加密后的密码是123456了!)

  1. [root@docker ~]# ansible webserver -m user -a "name=xiaoming password=securitytext"
  2. web1 | SUCCESS => {
  3. "changed": true,
  4. "comment": "",
  5. "createhome": true,
  6. "group": ,
  7. "home": "/home/xiaoming",
  8. "name": "xiaoming",
  9. "password": "NOT_LOGGING_PASSWORD",
  10. "shell": "/bin/bash",
  11. "state": "present",
  12. "system": false,
  13. "uid":
  14. }
  15. 172.17.0.3 | SUCCESS => {
  16. "changed": true,
  17. "comment": "",
  18. "createhome": true,
  19. "group": ,
  20. "home": "/home/xiaoming",
  21. "name": "xiaoming",
  22. "password": "NOT_LOGGING_PASSWORD",
  23. "shell": "/bin/bash",
  24. "state": "present",
  25. "system": false,
  26. "uid":
  27. }

本文属于作者原创,转载请注明出处:飞走不可 :http://www.cnblogs.com/hanyifeng/p/6431450.html

创建用户时使用加密后的密码来设置,其它方法可参考这里

先用python 的 crypt模块来对密码 进行加密,如:

  1. [root@docker ~]# python -c 'import crypt; print crypt.crypt("123456", "hello")'
  2. heepn6ZumUmSE

使用上述密码,创建用户:

  1. [root@docker ~]# ansible webserver -m user -a "name=huahua shell=/bin/bash password=heepn6ZumUmSE update_password=always"
  2. 172.17.0.3 | SUCCESS => {
  3. "changed": true,
  4. "comment": "",
  5. "createhome": true,
  6. "group": ,
  7. "home": "/home/huahua",
  8. "name": "huahua",
  9. "password": "NOT_LOGGING_PASSWORD",
  10. "shell": "/bin/bash",
  11. "state": "present",
  12. "system": false,
  13. "uid":
  14. }
  15. web1 | SUCCESS => {
  16. "changed": true,
  17. "comment": "",
  18. "createhome": true,
  19. "group": ,
  20. "home": "/home/huahua",
  21. "name": "huahua",
  22. "password": "NOT_LOGGING_PASSWORD",
  23. "shell": "/bin/bash",
  24. "state": "present",
  25. "system": false,
  26. "uid":
  27. }

删除用户并移除用户家目录(remove 要和 state 参数一起使用,相当于userdel -r):

  1. [root@docker ~]# ansible webserver -m user -a "name=xiaoming state=absent remove=yes"
  2. 172.17.0.3 | SUCCESS => {
  3. "changed": true,
  4. "force": false,
  5. "name": "xiaoming",
  6. "remove": true,
  7. "state": "absent"
  8. }
  9. web1 | SUCCESS => {
  10. "changed": true,
  11. "force": false,
  12. "name": "xiaoming",
  13. "remove": true,
  14. "state": "absent"
  15. }

 5.从版本控制中部署程序

直接从git 上部署web 应用

使用 git模块,要先保证远程主机上有git软件,如下所示,检查git 已被安装:

  1. [root@docker ~]# ansible webserver -m yum -a "name=git state=present"
  2. 172.17.0.3 | SUCCESS => {
  3. "changed": false,
  4. "msg": "",
  5. "rc": ,
  6. "results": [
  7. "git-1.8.3.1-6.el7_2.1.x86_64 providing git is already installed"
  8. ]
  9. }
  10. web1 | SUCCESS => {
  11. "changed": false,
  12. "msg": "",
  13. "rc": ,
  14. "results": [
  15. "git-1.8.3.1-6.el7_2.1.x86_64 providing git is already installed"
  16. ]
  17. }

确保已经安装之后,再来从git上拉取源码,如下:

  1. [root@docker ~]# ansible webserver -m git -a "repo=git://github.com/aliasmee/hello.git dest=/usr/myapp version=HEAD"
  2. web1 | SUCCESS => {
  3. "after": "f102d1927c4d42cfcca42aaa8e961be4c0b06e00",
  4. "before": null,
  5. "changed": true,
  6. "warnings": []
  7. }
  8. 172.17.0.3 | SUCCESS => {
  9. "after": "f102d1927c4d42cfcca42aaa8e961be4c0b06e00",
  10. "before": null,
  11. "changed": true,
  12. "warnings": []
  13. }

验证一下:

  1. [root@docker ~]# ansible webserver -a "ls /usr/myapp"
  2. 172.17.0.3 | SUCCESS | rc= >>
  3. README.md
  4. cpu_load.sh
  5. diyHttpServer.py
  6. look_IP.sh
  7. one.py
  8. two.txt
  9.  
  10. web1 | SUCCESS | rc= >>
  11. README.md
  12. cpu_load.sh
  13. diyHttpServer.py
  14. look_IP.sh
  15. one.py
  16. two.txt
6.服务管理
 
确保http服务是打开的状态:

  1. ansible webserver -m service -a "name=httpd state=started"

重启webserver组内的 web服务器:

  1. ansible webserver -m service -a "name=httpd state=restarted"

很遗憾,我的测试环境中,因为被管理机器都是docker 容器,而且 ansible 的 service 模块,官方发文说现在还不支持容器的服务支持。详见此页面:https://github.com/ansible/ansible-modules-core/issues/4024

7.收集信息

Facts就是主机上已经发现的变量,在playbooks中有描述。可以用于实现指定的任务的条件或者获取特定的信息,可以通过下面来获得所有 facts:

  1. [root@docker ~]# ansible all -m setup

8.脚本模块

scripts 脚本模块采用脚本名称,后面跟空格分隔的参数列表组成,如下所示:

  1. [root@docker ~]# ansible webserver -m script -a "/tmp/myapp/cpu_load.sh"

上面栗子中,位于本地路径的脚本将被传输到远程主机上并执行,适合本地写好的安装程序脚本,或其它自定义脚本。

好吧,模块还有很多很多,具体的只有等用到时仔细研究了,下一篇开始进入playbooks 的学习了。新手上路,文中如果有错误的地方,还请大牛们多多指教。

本文属于作者原创,转载请注明出处:飞走不可 :http://www.cnblogs.com/hanyifeng/p/6431450.html

参考资料链接:http://docs.ansible.com/ansible/intro_adhoc.html

Ansible 系列之 Ad-Hoc介绍及使用的更多相关文章

  1. XE7 & IOS开发之开发账号(3):证书、AppID、设备、授权profile的申请使用,附Debug真机调试、Ad hoc下iPA文件生成演示(XCode5或以上版本推荐,有图有真相)

    网上能找到的关于Delphi XE系列的移动开发的相关文章甚少,本文尽量以详细的图文内容.傻瓜式的表达来告诉你想要的答案. 原创作品,请尊重作者劳动成果,转载请注明出处!!! 注意,以下讨论都是以&q ...

  2. XE7 & IOS开发之开发账号(2):发布证书、发布授权profile的申请使用,附Ad hoc真机调试、生成ipa文件演示(XCode所有版本通用,有图有真相)

    网上能找到的关于Delphi XE系列的移动开发的相关文章甚少,本文尽量以详细的图文内容.傻瓜式的表达来告诉你想要的答案. 原创作品,请尊重作者劳动成果,转载请注明出处!!! 注意,以下讨论都是以&q ...

  3. Ansible系列(一):基本配置和使用

    本文目录:1.1 安装Ansible1.2 配置Ansible 1.2.1 环境配置 1.2.2 SSH互信配置 1.2.3 简单测试1.3 inventory Ansible是一种批量.自动部署工具 ...

  4. Ansible系列(五):playbook应用和roles自动化批量安装示例

    html { font-family: sans-serif } body { margin: 0 } article,aside,details,figcaption,figure,footer,h ...

  5. Ansible系列(四):playbook应用和roles自动化批量安装示例

    Ansible系列文章:http://www.cnblogs.com/f-ck-need-u/p/7576137.html playbook是ansible实现批量自动化最重要的手段.在其中可以使用变 ...

  6. Ad hoc sql

    SQL Server如何启用Ad Hoc Distributed Queries? 2011-08-11 14:53 wangdingbang CSDN博客 字号:T | T   本文主要介绍了SQL ...

  7. ios开发 ad hoc

    iOS证书分2种,1种是开发证书,用来给你(开发人员)做真机测试的:1种是发布证书,发布证书又分发布到app store的(这里不提及)和发布测试的ad hoc证书. 那ad hoc证书和开发证书区别 ...

  8. iOS 开发 入门:使用Ad Hoc 进行用户测试

    在完成iOS开发,准备进行发布之前,我们都希望App能在周围的朋友之间先进行测 试,提提意见,修改完善之后再发布到App Store上.Apple考虑到这一点,因此通过Ad Hoc来实现发布前的用户测 ...

  9. ios开发 ad hoc怎么用

    简单的说就是这样 ad hoc 方式是苹果用来给未上线的app做测试用的,首先你要在苹果开发平台上申请一个ad hoc的证书,再在profile中生成一个ad hoc 的profile文件(只需要在生 ...

  10. iOS程序发布测试-生成ad hoc证书

    转自: http://blog.sina.com.cn/s/blog_68444e230100srdn.html iOS程序发布测试3-生成ad hoc证书 iOS证书分2种,1种是开发证书,用来给你 ...

随机推荐

  1. UVa 311 - Packets

    题目大意:有1X1,2X2 ... 5X5,6X6六种类型的物品,把他们装进6X6的盒子里,求使用的最少盒子数. 贪心吧,其实一看就知道思路了,算是常识吧,装物品时通常都是先装大的,再在其余空间放小的 ...

  2. 那就用pthon来写个跳板机吧

    1.需求 程序一: 1.后台管理 - 堡垒机上创建用户和密码(堡垒机root封装的类,UserProfile表) - .bashrc /usr/bin/python3 /data/bastion.py ...

  3. SNPs & MAF

    SNPs,全称是single nucleotide polymorphisms,SNPs等位基因频率的容易估计.采用混和样本估算等位基因的频率是种高效快速的策略.该策略的原理是:首先选择参考样本制作标 ...

  4. 25+免费的Bootstrap HTML5网站模板

    在前端框架中,Bootstrap可以说是非常有名的高级网站设计框架.网上也有很多使用Bootstrap程序创建的免费模板.这些模板设计成响应式模式,因此你可以使用它们来为所有的设备平台和浏览器创建网站 ...

  5. 《疯狂Java讲义》(七)---- 方法

    一 方法的参数传递机制 Java方法的参数传递方式只有一种:值传递.就是将实际参数值的副本传入方法内,而参数本身不会受到任何影响. eg. 基本类型的值传递 public class Primitiv ...

  6. php如何判断是手机访问还是电脑访问

    <?php function isMobile(){ $useragent=isset($_SERVER['HTTP_USER_AGENT']) ? $_SERVER['HTTP_USER_AG ...

  7. 开箱即用 - Grunt合并和压缩 js,css 文件

    js,css 文件合并与压缩 Grunt 是前端自动化构建工具,类似webpack. 它究竟有多强悍,请看它的 介绍. 这里只演示如何用它的皮毛功能:文件合并与压缩. 首先说下js,css 合并与压缩 ...

  8. Top K问题的两种解决思路

    Top K问题在数据分析中非常普遍的一个问题(在面试中也经常被问到),比如: 从20亿个数字的文本中,找出最大的前100个. 解决Top K问题有两种思路, 最直观:小顶堆(大顶堆 -> 最小1 ...

  9. HDU4403(暴搜)

    A very hard Aoshu problem Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & ...

  10. android Fragment和FragmentActivity

    MainActivity.java import android.app.AlertDialog; import android.app.Notification; import android.co ...