Ansible的script模块批量运行脚本:批量安装Nginx | |||||||||||||
思路 |
| ||||||||||||
环境 | 使用centos7系统,创建三台虚拟机,名称分别为Ansible,Web01和Web02
关闭防火墙,selinux的进程和开机启动 | ||||||||||||
1. | [root@Ansible ~]# mkdir -p /service/scripts //创建一个目录,用于存放批量分发的软件包 [root@Ansible scripts]# ls nginx-1.10.2.tar.gz //查看目录中的安装包,如果没有,那么使用lrzsz命令上传一个 | ||||||||||||
2. | [root@Ansible scripts]# vim fenfa.sh //编写分发nginx源码包的脚本 [root@Ansible scripts]# vim auto_nginx.sh //编写安装nginx源码包的脚本 [root@Ansible scripts]# ls auto_nginx.sh fenfa.sh nginx-1.10.2.tar.gz //查看/service/scripts中的内容,确认是否有误 | ||||||||||||
3. | [root@Ansible scripts]# vim /etc/ansible/hosts //进入ansible的虚拟主机配置文件,编写主机范围模块 | ||||||||||||
4. | [root@Ansible scripts]# sh fenfa.sh Nginx //执行脚本到Nginx模块,黄色表示对方系统做出了改变 Web01: Web02: 批量部署Nginx完成 | ||||||||||||
Ansible-playbook | |||||||||||||
文件格式以.yaml结尾,使用ansible-playbook xxx.yaml进行调用执行 绿色为执行成功,但是不会修改目标文件;黄色为修改成功 | |||||||||||||
例1: | [root@Ansible scripts]# vim test_shell.yaml //编辑playbook配置文件 [root@Ansible scripts]# ansible-playbook test_shell.yaml //执行 查看是否执行成功: | ||||||||||||
例2: | [root@Ansible scripts]# vim jiaoben.yaml //编写playbook配置文件 all表示分发给所有主机模块 拷贝前,要注意是否有这个文件 [root@Ansible scripts]# ansible-playbook jiaoben.yaml //执行 检查: WEB01: WEB02: | ||||||||||||
例3: | 在playbook执行后,只能看到结果,但不到过程,如果想要看到过程,需要添加一个参数:register功能,它可以将上面的执行结果保存到一个变量中,然后再调用debug模块,将上面变量值保存到var变量中,然后输出到屏幕上。 [root@Ansible scripts]# vim test_register.yaml //创建playbook配置文件 [root@Ansible scripts]# ansible-playbook test_register.yaml //执行 | ||||||||||||
例4: | Nginx配置下发并检测: 上面的实验中,我们传了并安装了Nginx,但是并没有启动,因为我们没有修改配置文件。但是实际生活中,我们是并不会去修改配置文件的,而是批量将一个修改好的配置文件,直接发送过去。将原文件覆盖,并测试。 [root@Ansible tmp]# vim nginx.conf //在tmp目录中创建个nginx.conf配置文件 [root@Ansible scripts]# vim test_nginx.yaml //编写playbook配置文件 | ||||||||||||
playbook的自定义变量和内置变量 | |||||||||||||
自定义变量 | [root@Ansible scripts]# vim zdybl.yaml //编写 [root@Ansible scripts]# ansible-playbook zdybl.yaml //执行 | ||||||||||||
内置 变量 | Python知识 列表:其实就是一个变量名可以存多个值,列表是有索引的,从左到右,最左 边的是索引0,然后依次类推。 如:list=[1,3,5,7,9] list[0]=1,list[1]=3,list[2]=5 字典:字典是键、值、对的方式。一个变量里存的不是值了,而是一个个的组 合对。字典是无序的,所以不能索引取值。,字典是已知键的名字,返回对应的值,所以叫键值对儿。 如:dict={“user”:666,”user2”:111,”user3”:333} dict[“user”]=666,dict[“user3”]=333 二者混合使用,字典的返回值成了列表,返回的是列表中的所有值,而并不是 指定的值,这时就要通过特殊的格式进行操作。 如:dict={“user1”:[1,2,3],”user2”:[2,4,6]} 那么要想去user1中的2这个值,就需要这样取值: dict[“user1”][1] 含义为:从user1字典取值,该值为列表,其中有多个值,继续按照列表取值法,取第二个值(列表对应的值从0开始排列)。 | ||||||||||||
在ansible中也是如此,不过略有不同 如:取出下列IP地址,该如何书写? 正常情况下,应该是:ansible_facts[“ansible_all_ipv4_addresses”][0] 但是可以简写成:ansible_all_ipv4_addresses[0] 如:取出7这个值 ansible_python[“version”][“minor”] 当成两个字典来进行处理,最后的7当成列表,只有一个值的话,默认列表取0,无需填写。 | |||||||||||||
例:取IP、内核数和minor的值 [root@Ansible scripts]# vim ip.yaml [root@Ansible scripts]# ansible-playbook ip.yaml | |||||||||||||
Playbook下发可变的配置文件 | |||||||||||||
下发可变的配置文件 | [root@Ansible tmp]# vim test //在/tmp目录里,编写一个文件 第一个是自定义变量 第二个是系统变量 [root@Ansible tmp]# cd /service/scripts/ //进入到目录中 [root@Ansible scripts]# vim /test_filevars.yaml //编写可变配置文件 [root@Ansible scripts]# ansible-playbook test_filevars.yaml | ||||||||||||
判断 语法 | [root@Ansible scripts]# vim /tmp/if.j2 //在tmp目录下编写一个文件 JS语法:一般有j2语法的文件,我们以.j2结尾,代表该文件支持jinjia2格式 如果port存在,那么返回0.0.0.0:PORT值。如果不存在,就返回0.0.0.0:80 [root@Ansible scripts]# vim test_ifvars.yaml //编写判断语法调用文件 如果没有PORT值,那么就会被认为假,分发0.0.0.0:80这个内容到test;如果有PORT值,那么该值就会赋到变量中,然后将0.0.0.0:PORT到test文件中 [root@Ansible scripts]# ansible-playbook test_ifvars.yaml 检测: | ||||||||||||
下发可变的Nginx配置文件 | [root@Ansible scripts]# vim /tmp/nginx.j2 //编辑要分发的nginx配置文件 [root@Web01 conf]# rm -f nginx.conf [root@Web02 conf]# rm -f nginx.conf //删除两台Web服务器的主配置文件 [root@Ansible scripts]# vim text_nginxvars.yaml 当template模块执行成功,是黄色提示,如果是绿色,那么表示并没有对其进行修改操作。 检测: WEB01 WEB02: | ||||||||||||
roles标准化playbook | |||||||||||||
作用 | 最大化的重复利用剧本中重复相同的地方。 | ||||||||||||
Linux基础——Ansible批量自动化管理工具(二)
最新推荐文章于 2022-08-21 16:18:00 发布