简单使用ansible-playbook

1.使用以下命令给客户端安装httpd服务:

[root@server ~]# ansible testhost -m yum -a "name=httpd"
192.168.77.128 | SUCCESS => {"changed": true, "msg": "", "rc": 0, "results": ["Loaded plugins: fastestmirror, langpacks\nLoading mirror speeds from cached hostfile\n * base: mirrors.cn99.com\n * epel: mirrors.tongji.edu.cn\n * extras: mirrors.aliyun.com\n * updates: mirrors.163.com\nResolving Dependencies\n--> Running transaction check\n---> Package httpd.x86_64 0:2.4.6-67.el7.centos.6 will be installed\n--> Finished Dependency Resolution\n\nDependencies Resolved\n\n================================================================================\n Package      Arch          Version                        Repository      Size\n================================================================================\nInstalling:\n httpd        x86_64        2.4.6-67.el7.centos.6          updates        2.7 M\n\nTransaction Summary\n================================================================================\nInstall  1 Package\n\nTotal download size: 2.7 M\nInstalled size: 9.4 M\nDownloading packages:\nRunning transaction check\nRunning transaction test\nTransaction test succeeded\nRunning transaction\n  Installing : httpd-2.4.6-67.el7.centos.6.x86_64                           1/1 \n  Verifying  : httpd-2.4.6-67.el7.centos.6.x86_64                           1/1 \n\nInstalled:\n  httpd.x86_64 0:2.4.6-67.el7.centos.6                                          \n\nComplete!\n"]
}

2.执行以下命令启动httpd服务:

[root@server ~]# ansible testhost -m service -a "name=httpd state=started enabled=yes"## 然后会输出一堆状态信息,只要第一句为SUCCESS则代表启动成功

注:这里的name是centos系统里的服务名,可以通过chkconfig --list查看到。

其他控制服务的命令:

# 停止服务
[root@server ~]# ansible testhost -m service -a "name=httpd state=stopped"
# 重新启动服务
[root@server ~]# ansible testhost -m service -a "name=httpd state=restarted"
# 重载服务
[root@server ~]# ansible testhost -m service -a "name=httpd state=reloaded"

3.在name后面还可以加上state=installed或removed,加上removed的话,表示卸载这个服务,如果不指定state的值默认是installed:

[root@server ~]# ansible testhost -m yum -a "name=httpd state=removed"
192.168.77.128 | SUCCESS => {"changed": true, "msg": "", "rc": 0, "results": ["Loaded plugins: fastestmirror, langpacks\nResolving Dependencies\n--> Running transaction check\n---> Package httpd.x86_64 0:2.4.6-67.el7.centos.6 will be erased\n--> Finished Dependency Resolution\n\nDependencies Resolved\n\n================================================================================\n Package      Arch          Version                       Repository       Size\n================================================================================\nRemoving:\n httpd        x86_64        2.4.6-67.el7.centos.6         @updates        9.4 M\n\nTransaction Summary\n================================================================================\nRemove  1 Package\n\nInstalled size: 9.4 M\nDownloading packages:\nRunning transaction check\nRunning transaction test\nTransaction test succeeded\nRunning transaction\n  Erasing    : httpd-2.4.6-67.el7.centos.6.x86_64                           1/1 \n  Verifying  : httpd-2.4.6-67.el7.centos.6.x86_64                           1/1 \n\nRemoved:\n  httpd.x86_64 0:2.4.6-67.el7.centos.6                                          \n\nComplete!\n"]
}
[root@server ~]# 

然后到客户端上通过rpm -qa httpd命令查看是否已卸载成功:

[root@client ~]# rpm -qa httpd
[root@client ~]# 

Ansible文档的使用:

1.列出所有可用的模块命令:

ansible-doc -l

2.查看指定模块的文档,例如我要查看cron模块的文档,可使用以下命令:

ansible-doc cron

ansible-doc后面跟模块名就可以查看该模块的文档。


24.22 使用ansible playbook

playbook相当于可以把模块命令都写入到配置文件里面,这样就可以直接执行配置文件了,有点脚本的意思:

[root@server ~]# vim /etc/ansible/test.yml
---
- hosts: testhostremote_user: roottasks:- name: test_playbookshell: touch /tmp/test.txt

文件格式说明:

  • 第一行需要有三个杠,hosts参数指定了对哪些主机进行参作,如果是多台机器可以用逗号作为分隔,也可以使用主机组,在/etc/ansible/hosts里定义;
  • user参数指定了使用什么用户登录远程主机操作;
  • tasks指定了一个任务,其下面的name参数同样是对任务的描述,在执行过程中会打印出来,shell是ansible模块名字

编辑完成之后,使用ansible-playbook命令执行该文件:

[root@server ~]# ansible-playbook /etc/ansible/test.ymlPLAY [testhost] ***********************************************************************************************************TASK [Gathering Facts] ****************************************************************************************************
ok: [192.168.77.128]TASK [test_playbook] ******************************************************************************************************[WARNING]: Consider using file module with state=touch rather than running touchchanged: [192.168.77.128]PLAY RECAP ****************************************************************************************************************
192.168.77.128             : ok=2    changed=1    unreachable=0    failed=0   [root@server ~]# 

然后到客户端上看看是否有创建test.txt文件:

[root@client ~]# ls -l /tmp/test.txt 
-rw-r--r-- 1 root root 0 1月  30 11:58 /tmp/test.txt
[root@client ~]# 

如上,代表执行成功。


24.23 playbook里的变量

我们通过一个创建用户的例子,来演示一下playbook里的变量使用方式:

[root@server ~]# vim /etc/ansible/create_user.yml  # 编辑内容如下
---
- name: create_userhosts: testhostuser: rootgather_facts: falsevars:- user: "test"tasks:- name: create useruser: name="{{ user }}"

说明:

  • name参数对该playbook实现的功能做一个概述,后面执行过程中,会打印 name变量的值 ,可以省略;
  • gather_facts参数指定了在以下任务部分执行前,是否先执行setup模块获取主机相关信息,如果需要在后面的tasks里获取setup收集到的信息,就需要把这个参数设置为True;
  • vars参数,指定了变量,这里声明了一个user变量,其值为test ,需要注意的是,变量值一定要用引号引住;
  • user提定了调用user模块,name是user模块里的一个参数,而增加的用户名字调用了上面user变量的值。

执行该文件:

[root@server ~]# ansible-playbook /etc/ansible/create_user.ymlPLAY [create_user] ********************************************************************************************************TASK [create user] ********************************************************************************************************
changed: [192.168.77.128]PLAY RECAP ****************************************************************************************************************
192.168.77.128             : ok=1    changed=1    unreachable=0    failed=0   [root@server ~]# 

到客户端上看看用户是否已创建:

[root@client ~]# id test
uid=1003(test) gid=1003(test) 组=1003(test)
[root@client ~]# 

24.24 playbook里的循环

playbook除了有变量,还有循环语句,以下通过一个简单的例子来演示一下循环的使用方式:

[root@server ~]# vim /etc/ansible/while.yml
---
- hosts: testhostuser: roottasks:- name: change mode for filesfile: path=/tmp/{{ item }} state=touch mode=600with_items:- 1.txt- 2.txt- 3.txt

说明:

  • file模块可以对文件进行相关的操作,例如创建文件或者更改文件权限等,具体可以查看该模块的文档
  • with_items为循环的对象,相当于是一个数组或集合,写在下面的1.txt、2.txt以及3.txt是该集合的元素。而item则表示的是遍历出来的元素,也就是说item指代的是1.txt、2.txt以及3.txt。
  • state的值设置为touch表示如果该文件不存在就进行创建
  • path表示文件的路径
  • mode设置权限

执行该文件:

[root@server ~]# ansible-playbook /etc/ansible/while.yml PLAY [testhost] ***********************************************************************************************************TASK [Gathering Facts] ****************************************************************************************************
ok: [192.168.77.128]TASK [change mode for files] **********************************************************************************************
changed: [192.168.77.128] => (item=1.txt)
changed: [192.168.77.128] => (item=2.txt)
changed: [192.168.77.128] => (item=3.txt)PLAY RECAP ****************************************************************************************************************
192.168.77.128             : ok=2    changed=1    unreachable=0    failed=0   [root@server ~]# 

到客户端上看看文件是否已创建:

[root@client ~]# ll /tmp/*.txt
-rw------- 1 root root  0 1月  30 15:54 /tmp/1.txt
-rw------- 1 root root  0 1月  30 15:54 /tmp/2.txt
-rw------- 1 root root  0 1月  30 15:54 /tmp/3.txt
[root@client ~]# 

24.25 playbook里的条件判断

我们都知道在脚本中循环和条件判断是必不可少的语句,所以在playbook里这两种语句也是有的,循环我们已经介绍完了,接下来我们通过一个简单的创建文件的例子演示一下条件判断语句的使用方式。

我们一般以setup模块收集到的主机信息,来作为判断条件。所以在编写代码之前,我们需要先获取相应的信息,例如我要以ip地址来作为判断条件,那么我就得先从setup里获取主机ip的相关信息。

执行以下命令可以查看到setup收集到的所有的facter信息,输出的信息是JSON格式的:

ansible testhost -m setup

编写文件内容如下:

[root@server ~]# vim /etc/ansible/when.yml
---
- hosts: testhostuser: rootgather_facts: Truetasks:- name: use whenshell: touch /tmp/when.txtwhen: ansible_eno16777736.ipv4.address == "192.168.77.128"

说明:

  • ansible_eno16777736是一个数组存储着网卡相关信息,ipv4属于该数组的子元素,但是ipv4也是一个数组,而address则是ipv4数组的子元素。我们需要使用address 来作为判断条件。
  • 所以要访问address就需要使用这样的格式:ansible_eno16777736.ipv4.address,address表示的是键,而"192.168.77.128"则是值,when为判断语句相当于if,所以其判断条件为:该键的值为"192.168.77.128"时就执行shell模块里定义的语句。

执行该文件:

[root@server ~]# ansible-playbook /etc/ansible/when.yml PLAY [testhost] ***********************************************************************************************************TASK [Gathering Facts] ****************************************************************************************************
ok: [192.168.77.128]TASK [use when] ***********************************************************************************************************[WARNING]: Consider using file module with state=touch rather than running touchchanged: [192.168.77.128]PLAY RECAP ****************************************************************************************************************
192.168.77.128             : ok=2    changed=1    unreachable=0    failed=0   [root@server ~]# 

到客户端上看看文件是否已创建:

[root@client ~]# ll /tmp/when.txt
-rw-r--r-- 1 root root 0 1月  30 16:33 /tmp/when.txt
[root@client ~]#

24.26 playbook中的handlers

有一种情况就是执行了tasks里面的内容之后,服务器发生了变化,这时我们可能需要执行一些相关的操作。例如我们修改了某个服务的配置文件后,则需要重启一下服务。而handlers就是完成这样的事情的,它相当于编程中的回调函数,当tasks里的内容执行成功后,就会执行handlers里定义的内容。也类似于shell脚本中的&&符号,例如 cat 1.txt && rm -f 1.txt ,当cat 1.txt命令执行成功之后就会执行rm -f 1.txt命令,否则不执行。

下面用一个简单的例子来演示一下handlers的使用方式:

[root@server ~]# vim /etc/ansible/handlers.yml
---
- name: handlers testhosts: testhostuser: roottasks:- name: copy filecopy: src=/etc/passwd dest=/tmp/test_passwd.txtnotify: test handlershandlers:- name: test handlersshell: echo "This is a test string" >> /tmp/test_passwd.txt

说明:

  • 只有copy模块执行成功后,才会去调用下面的handlers里定义的内容。也就是说如果/etc/passwd和/tmp/test_passwd.txt内容是一样的话,就不会去执行handlers里面的shell相关命令,因为copy没有被执行。 这种比较适合配置文件发生更改后,重启服务的操作。
  • notify用于指定handlers的name参数的值,因为handlers可以定义多个,所以需要使用notify来进行指定调用哪一个。

执行该文件:

[root@server ~]# ansible-playbook /etc/ansible/handlers.yml PLAY [handlers test] ******************************************************************************************************TASK [Gathering Facts] ****************************************************************************************************
ok: [192.168.77.128]TASK [copy file] **********************************************************************************************************
changed: [192.168.77.128]RUNNING HANDLER [test handlers] *******************************************************************************************
changed: [192.168.77.128]PLAY RECAP ****************************************************************************************************************
192.168.77.128             : ok=3    changed=2    unreachable=0    failed=0   [root@server ~]# 

到客户端上看看文件末尾的那一行是否是我们echo进去的那一行内容:

[root@client ~]# tail -n1 /tmp/test_passwd.txt 
This is a test string

[root@client ~]#




本文转自 ZeroOne01 51CTO博客,原文链接:http://blog.51cto.com/zero01/2066913,如需转载请自行联系原作者

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/453638.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

原则

昨天例会上,领导分享了他最近看过的一本书《原则》。试想,工作上,生活中我的原则是什么呢?关于技术学习的原则。一开始的时候,一般都是遇到不会的再去学习,我一直比较喜欢带着问题,这样会学习效…

Python内置函数简记

一、数学运算类 abs(x)求绝对值 1、参数可以是整型,也可以是复数 2、若参数是复数,则返回复数的模complex([real[, imag]])创建一个复数divmod(a, b)分别取商和余数 注意:整型、浮点型都可以float([x])将一个字符串或数转换为浮点数。如果无参…

开源Java反编译工具

Java 反编译器 1. JD-GUI JD-GUI 是一个用 C 开发的 Java 反编译工具,由 Pavel Kouznetsov开发,支持Windows、Linux和苹果Mac Os三个平台。 而且提供了Eclipse平台下的插件JD-Eclipse。JD-GUI不需要安装,直接点击运行,可以反编译j…

基于MPI的H.264并行编码代码移植与优化

2010 03 25基于MPI的H.264并行编码代码移植与优化范 文洛阳理工学院计算机信息工程系 洛阳 471023摘 要 H.264获得出色压缩效果和质量的代价是压缩编码算法复杂度的增加。为了寻求更高的编码速度,集群并行计算被运用到H.264的视频编码计算中。分析H.264可实现并行计…

python自动取款机程序_python ATM取款机----运维开发初学(上篇)

自动取款机基本功能:可以存取转账,刷卡信息查询,银行卡号历史信息查询,消费记录查询,修改密码。思维导图如下:数据库设计:mysql> desc balan_list; #保存账号交易记录option_type-----------…

java的运行参数

贴个java的运行参数: Usage: java [-options] class [args...] (to execute a class) or java [-options] -jar jarfile [args...] (to execute a jar file) where options include: -client to select the "client" VM -server to select t…

阿里服务器+Centos7.4+Tomcat+JDK部署

适用对象 本文档介绍如何使用一台基本配置的云服务器 ECS 实例部署 Java web 项目。适用于刚开始使用阿里云进行建站的个人用户。 配置要求 这里列出的软件版本仅代表写作本文档使用的版本。操作时,请您以实际软件版本为准。 操作系统:CentOS 7.4Tomcat …

php输出mysqli查询出来的结果

php连接mysql我有文章已经写过了,这篇文章主要是介绍从mysql中查询出结果之后怎么输出的问题。 一:mysqli_fetch_row(); 查询结果:array([0]>小王) 查询: [php] view plaincopy while ($row mysqli_fetch_assoc($result)) …

rhel mysql安装_RHEL6.4下MySQL安装方法及简单配置

1.MySQL安装方法简介 1.rpm包yum安装 2.通用二进制包安装 3.源码编译安装 注意:实验所采用的系统平台为:RHEL6.4 2.rpm ins首页 → 数据库技术背景:阅读新闻RHEL6.4下MySQL安装方法及简单配置[日期:2014-04-08]来源:Li…

H.264算法的DSP移植与优化

摘要:在TMS320DM643平台上实现H.264基档次编码器的移植与优化显得格外实用和必要。基于对DSP平台的结构特性和H.264的计算复杂度分析,主要从核心算法、数据传输和存储器/Cache使用几方面对H.264编码器进行了…

IDA*与A*

我实在懒得写博客了,直接放上来之前讲课做的的PPT得了。 PPT_Source Code.zip 转载于:https://www.cnblogs.com/zzzc18/p/8323927.html

java 子类 父类 转换_Java子类与父类之间的类型转换

1.向上转换父类的引用变量指向子类变量时,子类对象向父类对象向上转换。从子类向父类的转换不需要什么限制,只需直接蒋子类实例赋值给父类变量即可,这也是Java中多态的实现机制。2.向下转换在父类变量调用子类特有的、不是从父类继承来的方法…

H.264视频编解码的代码移植和优化

基于DSP系统开发的视频编解码系统,国内几乎都是走的移植,优化的路线,并且移植的代码,都是开源的。毕竟花费大量的人力,物力去开发一套自己的代码,并不见得比一些成熟的开源代码效率更高,健壮性更…

SublimeText2 快捷键

SublimeText2 快捷键,与对应功能一览表: 快捷键功能ctrlshiftn打开新Sublimectrlshiftw关闭Sublime,关闭所有打开文件ctrlshiftt重新打开最近关闭文件ctrln新建文件ctrls保存ctrlshifts另存为ctrlf4关闭文件ctrlw关闭ctrlk, ctrlb切换侧边栏显…

java-linux-eclipse配置

转载于:https://www.cnblogs.com/sheying/p/8327517.html

n皇后问题java_经典n皇后问题java代码实现

问题描述:在n*n的二维表格,把n个皇后在表格上,要求同一行、同一列或同一斜线上不能有2个以上的皇后。例如八皇后有92种解决方案,五皇后有10种解决方案。public class TestQueen {int n; //皇后的个数int num 0; // 记录方案数int…

ffmpeg mplayer x264 代码重点详解 详细分析

ffmpeg和mplayer中求平均值得方法 1 ordinary c language level #define avg2(a,b) ((ab1)>>1) #define avg4(a,b,c,d) ((abcd2)>>2) 显而易见...,注意a,b宏表达式可能引出的副作用 2 SIMD by software…

nagios监控服务器的搭建

nagios 概述: 开源的免费的网络监视工具。 监控: windows, Linux,Unix,交换机和路由器。报警。 Nagios是插件式的结构,它本身没有任何监控功能,所有的监控都是通过插件进行的,因此其是高度模块化和富于弹性的。Nagios…

BZOJ1031: [JSOI2007]字符加密Cipher

1031: [JSOI2007]字符加密Cipher Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 7882 Solved: 3425[Submit][Status][Discuss]Description 喜欢钻研问题的JS同学,最近又迷上了对加密方法的思考。一天,他突然想出了一种他认为是终极的加密办法&#…

java栈顶元素_栈在Java类库中的实现

栈是一种后进先出的数据结构。在它之上,主要有三种操作:(1)判断栈是否为空——empty();(2)在栈顶添加一个元素——push(E);(3)删除并返回栈顶元素——pop()。在Java类库中,Stack类实现了栈,它继承自Vector类…