ansible批量管理服务工具

 

 

批量管理服务器的工具

 

  1. 无须部署agent,通过ssh进行管理
  2.  
  3. 流行的自动化运维工具:https://github.con/ansible/ansible

 

三种批量管理工具

 

  1. ansible (so easy) 500以下服务器
  2.  
  3. saltstack (比较复杂) 1000到4万服务器
  4.  
  5. puppet (超级复杂) 只有很老企业在用

 

jkenkins简介

 

  1. 可视化运维(主要用在可视化部署)
  2.  
  3. 持续构建,可以和git,svn结合(存放开发代码的仓库)
  4.  
  5. 可结合ssh实现可视化运维
  6.  
  7. 可结合ansible实现可视化运维

 

Ansible服务器简单的综合安全管理策略

 

  1. #禁止非root用户查看Ansible管理服务器端/etc/hosts文件
  2. [[email protected] ~]# ll /etc/hosts
  3. -rw-r--r--. 1 root root 180 9月 9 00:38 /etc/hosts
  4. [[email protected] ~]# chmod 600 /etc/hosts
  5. #禁止非root用户查看Ansible的主机清单配置文件
  6. [[email protected] ~]# ll /etc/ansible/hosts
  7. -rw-r--r-- 1 root root 87 9月 9 21:59 /etc/ansible/hosts
  8. [[email protected] ~]# chmod 600 /etc/ansible/hosts

 

ansible查看帮助

 

  1. /usr/local/python/bin/ansible-doc -l(查看总帮助)
  2.  
  3. /usr/local/python/bin/ansible-doc -s shell(查看shell模块的帮助)
  4.  
  5. /usr/local/python/bin/ansible-doc -s raw

 

安装ansible流程

 

如果Centos7版本

需要安装yum -y install net-toolsvim

关闭防火墙:systemctl stop firewalld 关闭防火墙开机启动:systemctl disable fierwalld

关闭selinux

 

7.5yum安装ansible

7.5yum仓库全可以用,本地的需要自己手动打开

yum -y install epel-release

yum -y install ansible (自动安装sshpass软件包)

 

安装支持包

yum -y install lrzsz vim net-tools gcc gcc-c++ ncurses ncurses-devel unzip zlib-devel zlib openssl-devel openssl libffi-devel

ansible批量管理服务工具

 

下载python源码包

链接:https://pan.baidu.com/s/1nE0v2fN6dq4FHfhSTbBnsg 
提取码:ud04

需要云yum

wget https://www.python.org/ftp/python/3.5.2/Python-3.5.2.tgz

ansible批量管理服务工具

 

源码编译Python3.5

tar xf Python-3.5.2.tgz -C /usr/src

cd /usr/src/Python-3.5.2

./configure --prefix=/usr/local/python

make && make install

ln -s /usr/local/python/bin/python3 /usr/bin/python3(制作软链接)

which python3(查看命令是否存在)

python3 -V(查询python版本)

ansible批量管理服务工具

 

静心等待ansible安装完毕后

ln -s /usr/local/python/bin/ansible /usr/local/bin(制作软链接)

which ansible(查看命令是否存在)

ansible --version(查看ansible版本)

ansible批量管理服务工具

 

ansible的简单配置

通过pip安装的ansible是没有配置文件的

mkdir -p /etc/ansible(默认没有,需要手动创建)

vim /etc/ansible/hosts(默认没有,需要手动创建)

ansible批量管理服务工具

 

ansible命令使用格式

ansible -i 主机或主机组 -m 指定模块 -a 命令 (-i指定配置文件,不写就默认路径下/etc/ansible/hosts,-m指定模块,-a发布命令)

 

command模块发布命令使用格式

(对方需要有python包,发布命令)

ansible nginx -m command -a 'hostname -I' 
(分发模块内容格式,nginx是模块名,-a是条件,-m command是调用ansible里面的模块发布命令用)

ansible client2 -m command -a 'hostname -I' 
(分发单个主机格式,client2是主机名,-a是条件,-m command是调用ansible里面的模块发布命令用)

ansible client1 -m command -a 'hostname -I' 
(分发单个主机格式,client1是主机名,-a是条件,-m command是调用ansible里面的模块发布命令用)

ansible client1:client2 -m command -a 'hostname -I' 
(分发多个主机格式,client1:client2是主机名,-a是条件,-m command是调用ansible里面的模块发布命令用)

ansible all -m command -a 'hostname -I' 
(all是分发所有主机格式,-a是条件,-m command是调用ansible里面的模块发布命令用)

ansible批量管理服务工具 
ansible批量管理服务工具 
ansible批量管理服务工具
ansible批量管理服务工具

 

ping模块发布命令使用格式

(对方需要有python包)

ping模块检查服务器是否连接正常,ping模块不需要-a指定参数

ansible all -m ping (ansible的ping模块格式)

ansible批量管理服务工具

 

shell模块发布命令使用格式

(对方需要有python包)

shell模块支持管道符格式 
ansible all -m shell -a 'echo test | grep t'

shell模块支持重定向格式 
ansible all -m shell -a "echo bb >> /tmp/testansible"

shell模块支持awk格式 
ansible all -m shell -a "cat /etc/passwd | awk -F":" '{print $1}'" (如果遇到特殊符号需要加入\转义)

ansible批量管理服务工具
ansible批量管理服务工具
ansible批量管理服务工具

 

raw模块使用格式仅通过ssh实现

(不依赖python包)

ansible批量管理服务工具 
ansible批量管理服务工具 
ansible批量管理服务工具

 

copy模块注意事项

yum -y install libselinux-python(传送失败的话说明对方没有这个支持包)

 

copy模块拷贝文件目录使用格式

ansible all -m copy -a 'src=/root/xin dest=/tmp' 
(src源文件,dest目标位置,对方没有目录模块自动创建)

ansible批量管理服务工具
ansible批量管理服务工具 
ansible批量管理服务工具

ansible all -m copy -a 'src=/root/xin dest=/tmp backup=yes' 
(src源文件,dest目标位置,backup=yes覆盖同时是否备份源文件)

ansible批量管理服务工具
ansible批量管理服务工具 
ansible批量管理服务工具

ansible all -m copy -a 'src=/root/xin dest=/tmp owner=nobody group=nobody mode=0600' 
(owner=属主是谁,group=属组是谁,mode=它权限)

ansible批量管理服务工具
ansible批量管理服务工具 
ansible批量管理服务工具

 

script模块批量运行脚本使用格式

ansible all -m script -a "/service/scripts/auto_nginx.sh"

 

  1. #操作示例-->远程批量分发并自动部署nginx
  2. #所有被管理端需要挂载光盘,并创建本地yum配置文件
  3. [[email protected] scripts]# pwd
  4. /service/scripts
  5. [[email protected] scripts]# ls | xargs -n1
  6. auto_nginx.sh #自动安装nginx脚本
  7. fenfa.sh #批量分发脚本
  8. nginx-1.10.2.tar.gz #nginx源码包
  9. [[email protected] scripts]# cat auto_nginx.sh #nginx安装脚本
  10. #!/bin/sh
  11. #nginx install shell scripts
  12. test -d /media/cdrom || mkdir -p /media/cdrom
  13. mount /dev/sr0 /media/cdrom &>/dev/null
  14. yum -y install gcc gcc-c++ make pcre pcre-devel zlib zlib-devel openssl openssl-devel &>/dev/null
  15. test -d /service/scripts || exit 3
  16. cd /service/scripts/
  17. tar xf nginx-1.10.2.tar.gz -C /usr/src/
  18. cd /usr/src/nginx-1.10.2/
  19. ./configure --prefix=/usr/local/nginx --with-http_ssl_module --with-http_stub_status_module &>/dev/null
  20. make &>/dev/null
  21. make install &>/dev/null
  22. exit 0
  23. [[email protected] scripts]# cat fenfa.sh #源码包和安装脚本的批量分发脚本
  24. #!/bin/sh
  25. #批量分发脚本
  26. Group=$1
  27. ansible $Group -m copy -a "src=/service/scripts/ dest=/service/scripts/"
  28. ansible $Group -m script -a "/service/scripts/auto_nginx.sh"
  29. [[email protected] scripts]# sh fenfa.sh all #**脚本

 

cron定时任务模块

Ansible中的cron模块用于定义任务计划。主要包括两种状态(state)

ansible批量管理服务工具

 

  1. #添加定时任务计划,在所有被管理的主机里每十分钟输出hello字符串,定时任务描述为test cron job
  2. [[email protected] ~]# ansible all -m cron -a 'minute="*/10" job="/bin/echo hello" name="test cron job"'
  3. Web02 | SUCCESS => {
  4. "changed": true,
  5. "envs": [],
  6. "jobs": [
  7. "test cron job"
  8. ]
  9. }
  10. Web01 | SUCCESS => {
  11. "changed": true,
  12. "envs": [],
  13. "jobs": [
  14. "test cron job"
  15. ]
  16. }
  17. [[email protected] ~]# ansible all -m shell -a 'crontab -l'
  18. Web01 | SUCCESS | rc=0 >>
  19. #Ansible: test cron job
  20. */10 * * * * /bin/echo hello
  21. Web02 | SUCCESS | rc=0 >>
  22. #Ansible: test cron job
  23. */10 * * * * /bin/echo hello
  24. #删除描述为test cron job的定时任务
  25. [[email protected] ~]# ansible all -m cron -a 'minute="*/10" job="/bin/echo hello" name="test cron job" state=absent'
  26. Web02 | SUCCESS => {
  27. "changed": true,
  28. "envs": [],
  29. "jobs": []
  30. }
  31. Web01 | SUCCESS => {
  32. "changed": true,
  33. "envs": [],
  34. "jobs": []
  35. }
  36. [[email protected] ~]# ansible all -m shell -a 'crontab -l'
  37. Web02 | SUCCESS | rc=0 >>
  38. Web01 | SUCCESS | rc=0 >>
  39. #给Web01服务器上的普通用户yunjisuan添加一个定时任务
  40. [[email protected] ~]# ansible Web01 -m shell -a 'id yunjisuan'
  41. Web01 | SUCCESS | rc=0 >>
  42. uid=1000(yunjisuan) gid=1000(yunjisuan) 组=1000(yunjisuan)
  43. [[email protected] ~]# ansible Web01 -m cron -a 'minute="*/10" job="/bin/echo hello" name="yunjisuan cron job" user="yunjisuan"'
  44. Web01 | SUCCESS => {
  45. "changed": true,
  46. "envs": [],
  47. "jobs": [
  48. "yunjisuan cron job"
  49. ]
  50. }
  51. [[email protected] ~]# ansible Web01 -m shell -a 'crontab -u yunjisuan -l'
  52. Web01 | SUCCESS | rc=0 >>
  53. #Ansible: yunjisuan cron job
  54. */10 * * * * /bin/echo hello
  55. [[email protected] ~]# ansible Web01 -m cron -a 'minute="*/10" job="/bin/echo hello" name="yunjisuan cron job" user="yunjisuan" state="absent"'
  56. Web01 | SUCCESS => {
  57. "changed": true,
  58. "envs": [],
  59. "jobs": []
  60. }
  61. [[email protected] ~]# ansible Web01 -m shell -a 'crontab -u yunjisuan -l'
  62. Web01 | SUCCESS | rc=0 >>

 

yum模块批量安装软件包

利用yum模块安装软件包,虽然能被shell模块替代,但是用yum模块更显专业一些

ansible批量管理服务工具

 

user模块批量创建用户

用户管理模块。管理用户账号

ansible批量管理服务工具

 

  1. #在Web02上创建一个普通用户yunjisuan,并设置用户的密码为123123
  2. [[email protected] ~]# ansible Web02 -m user -a 'name=yunjisuan comment="welcom to yunjisuan" uid=1066 groups=wheel password=123123 shell=/bin/bash home=/home/yunjisuan'
  3. Web02 | SUCCESS => {
  4. "changed": true,
  5. "comment": "welcom to yunjisuan",
  6. "create_home": true,
  7. "group": 1066,
  8. "groups": "wheel",
  9. "home": "/home/yunjisuan",
  10. "name": "yunjisuan",
  11. "password": "NOT_LOGGING_PASSWORD",
  12. "shell": "/bin/bash",
  13. "state": "present",
  14. "system": false,
  15. "uid": 1066
  16. }
  17. [[email protected] ~]# ansible Web02 -m shell -a 'tail -1 /etc/passwd'
  18. Web02 | SUCCESS | rc=0 >>
  19. yunjisuan:x:1066:1066:welcom to yunjisuan:/home/yunjisuan:/bin/bash
  20. [[email protected] ~]# ansible Web02 -m shell -a 'tail -1 /etc/shadow'
  21. Web02 | SUCCESS | rc=0 >>
  22. yunjisuan:123123:17783:0:99999:7::: #密码居然是明文!!!

利用ansible的user模块状态用户时要注意在password参数的后边添加密文,否则不能登陆用户 
通过Python的pip程序安装passlib即可为密码加密

 

  1. #安装Python2的pip工具,并通过pip工具安装Python的加密模块来给密码加密
  2. [[email protected] ~]# yum -y install epel-release
  3. [[email protected] ~]# yum -y install python2-pip
  4. [[email protected] ~]# pip install passlib
  5. #生成密文密码
  6. [[email protected] ~]# python -c "from passlib.hash import sha512_crypt;import getpass;print sha512_crypt.encrypt(getpass.getpass())"
  7. Password: #输入你想要加密的密码
  8. $6$rounds=656000$Tw15COd8DLh/VS94$Mcmz/8CcjBKiEl0mYHcOQQCxEA5mz66EcGH2qXVk6o.Sm7FsRS.DsDVy6ET8iI6jDa045I94slZqWFwyYnRSW1 #加密后的密码
  9. #删除之前创建的yunjisuan用户,并删除它的家目录
  10. [[email protected] ~]# ansible Web02 -m user -a 'name=yunjisuan state=absent remove=true'
  11. Web02 | SUCCESS => {
  12. "changed": true,
  13. "force": false,
  14. "name": "yunjisuan",
  15. "remove": true,
  16. "state": "absent"
  17. }
  18. #继续在Web02上创建yunjisuan用户
  19. [[email protected] ~]# ansible Web02 -m user -a 'name=yunjisuan comment="welcom to yunjisuan" uid=1066 groups=wheel password=$6$rounds=656000$Tw15COd8DLh/VS94$Mcmz/8CcjBKiEl0mYHcOQQCxEA5mz66EcGH2qXVk6o.Sm7FsRS.DsDVy6ET8iI6jDa045I94slZqWFwyYnRSW1 shell=/bin/bash' home=/home/yunjisuan'
  20. [[email protected] ~]# ansible Web02 -m shell -a 'tail -1 /etc/shadow'
  21. Web02 | SUCCESS | rc=0 >>
  22. yunjisuan:$6$rounds=656000$Tw15COd8DLh/VS94$Mcmz/8CcjBKiEl0mYHcOQQCxEA5mz66EcGH2qXVk6o.Sm7FsRS.DsDVy6ET8iI6jDa045I94slZqWFwyYnRSW1:17783:0:99999:7::: #终于密文了

 

setup模块批量查看服务的所有属性

Ansible中使用setup模块收集,查看被管理主机的facts(facts是Ansible采集被管理主机设备信息的一个功能)。每个被管理主机在接收并运行管理命令之前,都会将自己的相关信息(操作系统版本,IP地址等)发送给控制主机

 

  1. #查看远程主机的facts信息
  2. [[email protected] ~]# ansible Web01 -m setup | head
  3. Web01 | SUCCESS => {
  4. "ansible_facts": {
  5. "ansible_all_ipv4_addresses": [
  6. "192.168.200.184"
  7. ],
  8. "ansible_all_ipv6_addresses": [
  9. "fe80::20c:29ff:fe77:16ad"
  10. ],
  11. "ansible_apparmor": {
  12. "status": "disabled"

 

ansible-playbook的初步使用

playbook可以把ansible的模块进行组合

 

  1. ln -s /usr/local/python/bin/ansible-playbook /usr/local/bin (优先制作软链接)
  2.  
  3. shell模块支持很多模式,copy模块分发文件或目录,register模块输出命令运行结果,nginx_conf配置下发并检测,vars自定义变量,setupvars内置变量,filevars可变配置文件
  4.  
  5. vim test_shell[copy,register,nginx_conf,vars,setupvars,filevars].yaml (执行模板)
  6.  
  7. ansible-playbook test_shell[copy,register,nginx_conf,vars,setupvars,filevars].yaml (执行配置文件)
  8.  
  9. 我们可以使用ansible all -m setup | less (查看ansible内置变量)
  10.  
  11. vim if.j2 (下发配置文件模板样式)

 

下发配置文件里面使用判断语法

 

  1. vim /tmp/if.j2
  2.  
  3. {% if PORT %} #if PORT存在
  4. ip=0.0.0.0:{{ PORT }}
  5. {% else %} #否则的话
  6. ip=0.0.0.0:80
  7. {% endif %} #结尾
  8.  
  9. vim test_ifvars.yaml
  10.  
  11. ---
  12. - hosts: all
  13. gather_facts: True #开启系统内置变量
  14. vars:
  15. - PORT: 90 #自定义变量
  16. tasks:
  17. - name: jinja2 if test
  18. template: src=/tmp/if.j2 dest=/root/test
  19.  
  20. ansible-playbook test_ifvars.yaml (下达分发命令)
  21.  
  22.  
  23. 如果我们将变量PORT值为空的话,就会进入else否则的80端口
  24.  
  25. ---
  26. - hosts: all
  27. gather_facts: True
  28. vars:
  29. - PORT: #置空
  30. tasks:
  31. - name: jinja2 if test
  32. template: src=/tmp/if.j2 dest=/root/test

 

Playbook下发可变配置文件

 

  1. #利用template模块下发可变的配置文件
  2.  
  3. ---
  4. - hosts: all
  5. gather_facts: True #开启系统变量
  6. vars:
  7. - myname: "yunjisuan" #自定义变量
  8. tasks:
  9. - name: template test
  10. template: src=/tmp/test dest=/root/test #使用template下发可变配置文件

配置文件如果使用copy模块去下发的话,那配置都是一样的; 
如果下发的配置文件里有可变的配置,需要用到template模块。

 

playbook使用register输出命令运行结果

 

  1. ---
  2. - hosts: all
  3. tasks:
  4. - name: test register
  5. shell: echo "welcome to yunjisuan"
  6. register: print_result #将之前命令的输出结果保存在变量print_result里
  7. - debug: var=print_result #将变量的值作为debug输出出来。
  8.  
  9.  
  10. 我们在用playbook进行ansible模块操作的时候,并没有命令的执行结果输出,默认被隐藏了
  11. 我们可以通过register模块追加输出命令的执行结果

 

playbook的自定义变量和内置变量

我们可以使用ansible all -m setup | less查看ansible内置变量

 

  1. ---
  2. - hosts: all
  3. vars: #定义变量
  4. - name: "yunjisuan" #第一个name变量
  5. age: "3" #第二个age变量
  6. tasks:
  7. - name: "{{ name }}" #{{}}两对大括号引用变量,变量名两头空格
  8. shell: echo "myname {{ name }},myage {{ age }}"
  9. register: var_result
  10. - debug: var=var_result

 

  1. ---
  2. - hosts: all
  3. gather_facts: True
  4. tasks:
  5. - name: setup var
  6. shell: echo "ip {{ ansible_all_ipv4_addresses[0] }} cpu {{ ansible_processor_count }}" >> /tmp/test
  7. - name: setup var2
  8. shell: echo "time {{ ansible_date_time["date"] }}" >> /tmp/test
  9. register: var_result
  10. - debug: var=var_result
  11.  
  12.  
  13. 特别提示:
  14. 引用变量需要在双引号中引用。
  15.  
  16. 在使用自定义变量时,我们要特别注意不要和系统的内置保留变量同名,容易引发问题。
  17.  
  18. Found variable using reserved name: name #name是一个保留的内置变量,我们在自定义时不能用,会有警告

 

  1. ---
  2. - hosts: all
  3. gather_facts: True #使用ansible内置变量
  4. tasks:
  5. - name: setup var
  6. shell: echo "ip {{ ansible_all_ipv4_addresses[0] }} cpu {{ ansible_processor_count }}" >> /tmp/test
  7. - name: setup var2
  8. shell: echo "time {{ ansible_date_time["date"] }}" >> /tmp/test
  9. register: var_result
  10. - debug: var=var_result
  11.  
  12. #python取变量方法
  13.  
  14. a = [1,3,5] --> a[0]=1 #这样取值就不会带[]
  15.  
  16. a = {"sl":123123,"sl1"123321} --> a[sl]=123123 #这样取值就不会带[]

 

playbook的简单shell模块的使用

 

  1. --- #开头三个小-开头
  2. - hosts: webB
  3. tasks:
  4. - name: test
  5. shell: echo "welcome to yunjisaun" >> /tmp/username
  6. - name: test2
  7. shell: echo "welcome to yunjisuan" >> /tmp/username
  8. 模板说明:
  9. --- #开头必须有三个小-,顶格写
  10. - hosts: #正文配置代码的第一级,必须有两个空格(-占一个空格位)
  11. - host: webB #webB是host参数的值,值和hosts:之间要有一个空格
  12. tasks: #tasks:表示接下来要执行的具体任务
  13. - name: #相对于tasks再多缩进两个格(-占一个空格位),表示属于tasks的下一级
  14. - name: test #test只是要执行的具体命令的名字可以随便写。name:后还是有一个空格要注意
  15. shell: #表示调用shell模块执行命令相对于tasks仍旧要多缩进两个空格
  16. shell: echo "xxx" >> xxx #shell:后边还是要有个空格,需要注意。

 

playbook的简单copy模块的使用

 

  1. ---
  2. - hosts: all
  3. tasks:
  4. - name: test copy
  5. copy: src=/tmp/copy_test dest=/tmp/
  6. 模板说明:
  7. --- #开头必须有三个小-,顶格写
  8. - hosts: #正文配置代码的第一级,必须有两个空格(-占一个空格位)
  9. tasks: #tasks:表示接下来要执行的具体任务
  10. - name: test #test只是要执行的具体命令的名字可以随便写。name:后还是有一个空格要注意
  11. copy: src=/tmp/copy_test dest=/tmp/ #把源文件拷贝到对方的位置

 

Playbook的notify通知和下发nginx配置

 

  1. vim nginx.j2
  2. worker_processes {{ ansible_processor_count }}; #可变的参数
  3.  
  4. #实战下发可执行动作的可变的nginx配置文件
  5.  
  6. ---------------------------------------------------------------------------
  7.  
  8. vim test_nginxvars.yaml
  9. ---
  10. - hosts: all
  11. gather_facts: True #开启系统内置变量
  12. tasks:
  13. - name: nginx conf
  14. template: src=/tmp/nginx.j2 dest=/usr/local/nginx/conf/nginx.conf
  15. notify:
  16. - reload nginx #下发通知给handlers模块执行名字叫做reload nginx的动作
  17. handlers: #定义动作
  18. - name: reload nginx #动作的名字
  19. shell: /usr/local/nginx/sbin/nginx -s reload
  20.  
  21. ansible-playbook test_nginxvars.yaml (执行分发命令)

 

nginx配置下发并检测

 

  1. ---
  2. - hosts: all
  3. tasks:
  4. - name: copy nginx.conf
  5. copy: src=/tmp/nginx.conf dest=/usr/local/nginx/conf/ backup=yes
  6. - name:
  7. shell: /usr/local/nginx/sbin/nginx -t
  8. register: nginx_result
  9. - debug: var=nginx_result

 

ansible的script模块批量运行脚本

 

  1. #操作示例-->远程批量分发并自动部署nginx
  2. #所有被管理端需要挂载光盘,并创建本地yum配置文件
  3.  
  4.  
  5. auto_nginx.sh #自动安装nginx脚本
  6. fenfa.sh #批量分发脚本
  7. nginx-1.10.2.tar.gz #nginx源码包
  8.  
  9.  
  10. #!/bin/sh
  11. #nginx install shell scripts
  12. test -d /media/cdrom || mkdir -p /media/cdrom
  13. mount /dev/sr0 /media/cdrom &>/dev/null
  14. yum -y install gcc gcc-c++ make pcre pcre-devel zlib zlib-devel openssl openssl-devel &>/dev/null
  15. test -d /service/scripts || exit 3
  16. cd /service/scripts/
  17. tar xf nginx-1.10.2.tar.gz -C /usr/src/
  18. cd /usr/src/nginx-1.10.2/
  19. ./configure --prefix=/usr/local/nginx --with-http_ssl_module --with-http_stub_status_module &>/dev/null
  20. make &>/dev/null
  21. make install &>/dev/null
  22. exit 0
  23.  
  24.  
  25. #源码包和安装脚本的批量分发脚本
  26.  
  27.  
  28. #!/bin/sh
  29. #批量分发脚本
  30. Group=$1
  31. ansible $Group -m copy -a "src=/service/scripts/ dest=/service/scripts/"
  32. ansible $Group -m script -a "/service/scripts/auto_nginx.sh"

 

使用roles标准化Playbook

roles功能可以用来规范playbook的编写

 

创建所需要的roles原型目录结构

 

  1. #创建roles基本原型的目录结构
  2. [[email protected] myroles]# tree /myroles/
  3. /myroles/
  4. ├── nginx.yaml #入口触发配置文件
  5. └── roles #playbook的原型配置目录
  6. └── nginx #nginx相关模组配置目录
  7. ├── files #copy模块和script模块的参数src默认会从这个文件夹查找
  8. ├── handlers #用来存放notify的
  9. ├── tasks #用来存放ansible模块任务的
  10. ├── templates #用来存放j2的
  11. └── vars #用来存放变量的
  12. 7 directories, 1 file
  13. #入口触发配置文件
  14. [[email protected] myroles]# cat /myroles/nginx.yaml
  15. ---
  16. - hosts: all #执行的主机范围
  17. gather_facts: True #开启系统内置变量
  18. roles: #启用roles原型配置
  19. - nginx #执行nginx原型模组

 

roles中tasks任务编排模组的使用

 

  1. #在nginx模组添加tasks任务配置文件
  2. [[email protected] myroles]# cat roles/nginx/tasks/main.yaml
  3. ---
  4. - name: check alived #任务1的名字
  5. ping: #执行ping模块
  6. - name: #任务2的名字
  7. shell: ls / #执行shell模块
  8. register: ls_result #将执行结果保存给变量
  9. - debug: var=ls_result #变量的值赋值给debug进行输出
  10. #完成后的目录结构如下所示
  11. [[email protected] myroles]# tree /myroles/
  12. /myroles/
  13. ├── nginx.yaml #nginx模组入口配置文件
  14. └── roles
  15. └── nginx #nginx原型模组目录
  16. ├── files
  17. ├── handlers
  18. ├── tasks
  19. │ └── main.yaml #nginx模组的tasks任务配置文件
  20. ├── templates
  21. └── vars
  22. 7 directories, 2 files

 

执行简单的roles任务模型

 

  1. #执行nginx入口配置文件
  2. [[email protected] myroles]# ansible-playbook nginx.yaml
  3. PLAY [all] ****************************************************************************************************
  4. TASK [Gathering Facts] ****************************************************************************************
  5. ok: [webA]
  6. ok: [webB]
  7. TASK [nginx : check alived] ***********************************************************************************
  8. ok: [webA]
  9. ok: [webB]
  10. TASK [nginx : shell] ******************************************************************************************
  11. changed: [webA]
  12. changed: [webB]
  13. TASK [nginx : debug] ******************************************************************************************
  14. ok: [webA] => {
  15. "ls_result": {
  16. "changed": true,
  17. "cmd": "ls /",
  18. "delta": "0:00:00.002805",
  19. "end": "2018-06-21 11:52:29.343592",
  20. "failed": false,
  21. "rc": 0,
  22. "start": "2018-06-21 11:52:29.340787",
  23. "stderr": "",
  24. "stderr_lines": [],
  25. "stdout": "bin\nboot\ndev\netc\nhome\nlib\nlib64\nmedia\nmnt\nopt\nproc\nroo\nroot\nrun\nsbin\nservice\nsrv\nsys\ntmp\nusr\nvar",
  26. "stdout_lines": [
  27. "bin",
  28. "boot",
  29. "dev",
  30. "etc",
  31. "home",
  32. "lib",
  33. "lib64",
  34. "media",
  35. "mnt",
  36. "opt",
  37. "proc",
  38. "roo",
  39. "root",
  40. "run",
  41. "sbin",
  42. "service",
  43. "srv",
  44. "sys",
  45. "tmp",
  46. "usr",
  47. "var"
  48. ]
  49. }
  50. }
  51. ok: [webB] => {
  52. "ls_result": {
  53. "changed": true,
  54. "cmd": "ls /",
  55. "delta": "0:00:00.002708",
  56. "end": "2018-06-21 11:52:29.359754",
  57. "failed": false,
  58. "rc": 0,
  59. "start": "2018-06-21 11:52:29.357046",
  60. "stderr": "",
  61. "stderr_lines": [],
  62. "stdout": "bin\nboot\ndev\netc\nhome\nlib\nlib64\nmedia\nmnt\nopt\nproc\nroo\nroot\nrun\nsbin\nservice\nsrv\nsys\ntmp\nusr\nvar",
  63. "stdout_lines": [
  64. "bin",
  65. "boot",
  66. "dev",
  67. "etc",
  68. "home",
  69. "lib",
  70. "lib64",
  71. "media",
  72. "mnt",
  73. "opt",
  74. "proc",
  75. "roo",
  76. "root",
  77. "run",
  78. "sbin",
  79. "service",
  80. "srv",
  81. "sys",
  82. "tmp",
  83. "usr",
  84. "var"
  85. ]
  86. }
  87. }
  88. PLAY RECAP ****************************************************************************************************
  89. webA : ok=4 changed=1 unreachable=0 failed=0
  90. webB : ok=4 changed=1 unreachable=0 failed=0

ansible-playbook执行入口配置文件nginx.yaml后,它会自动在roles目录下查找nginx目录并进入后查找tasks任务目录并执行main.yaml的任务配置文件。

其实,这个roles的操作等效于以下配置

 

  1. #本配置和之前的roles配置等效
  2. [[email protected] myroles]# cat /service/scripts/test.yaml
  3. ---
  4. - hosts: all
  5. gather_facts: True
  6. tasks: #其实roles的本质就是将tasks任务单独写了。
  7. - name: check alived #并在入口文件里追加了roles去查找tasks配置文件路径
  8. ping:
  9. - name:
  10. shell: ls /
  11. register: ls_result
  12. - debug: var=ls_result

 

roles中vars自定义变量模组的使用

 

  1. #创建自定义变量vars模组的配置文件
  2. [[email protected] myroles]# cat roles/nginx/vars/main.yaml
  3. ---
  4. my_name: yunjisuan
  5. phone: 1800000000
  6. [[email protected] myroles]# cat roles/nginx/tasks/main.yaml
  7. ---
  8. - name: check alived
  9. ping:
  10. - name:
  11. shell: ls /
  12. register: ls_result
  13. - debug: var=ls_result
  14. - name: #添加对变量引用的任务编排
  15. shell: echo my phone is {{ phone }}
  16. register: echo_result
  17. - debug: var=echo_result
  18. [[email protected] myroles]# ansible-playbook nginx.yaml #执行入口配置文件

 

使用copy,script模块的标准化

roles模型里使用copy,script模块,默认从roles/nginx/files这里面找

 

  1. [[email protected] myroles]# cat roles/nginx/files/test
  2. welcome to yunjisuan
  3. [[email protected] myroles]# cat roles/nginx/files/test.sh
  4. echo "aaa" >> /tmp/test
  5. [[email protected] myroles]# chmod +x roles/nginx/files/test.sh
  6. [[email protected] myroles]# cat roles/nginx/tasks/main.yaml
  7. ---
  8. - name: check alived
  9. ping:
  10. - name:
  11. shell: ls /
  12. register: ls_result
  13. - debug: var=ls_result
  14. - name:
  15. shell: echo my phone is {{ phone }}
  16. register: echo_result
  17. - debug: var=echo_result
  18. - name: #添加copy模块
  19. copy: src=test dest=/root/
  20. - name: #添加script模块(自动在目标IP机器上执行脚本)
  21. script: test.sh
  22. [[email protected] myroles]# ansible-playbook nginx.yaml

 

roles中template模块的使用

roles模型里使用template模块,默认从roles/nginx/template里面找

 

  1. [[email protected] myroles]# cat roles/nginx/templates/test.j2
  2. myname is {{ my_name }},my phone is {{ phone }} #引用自定义变量
  3. my ipaddress is {{ansible_all_ipv4_addresses[0]}} #引用内置变量
  4. [[email protected] myroles]# cat roles/nginx/tasks/main.yaml
  5. ---
  6. - name: check alived
  7. ping:
  8. - name:
  9. shell: ls /
  10. register: ls_result
  11. - debug: var=ls_result
  12. - name:
  13. shell: echo my phone is {{ phone }}
  14. register: echo_result
  15. - debug: var=echo_result
  16. - name:
  17. copy: src=test dest=/root/
  18. - name:
  19. script: test.sh
  20. - name:
  21. template: src=test.j2 dest=/root/test2 #下发可变配置文件
  22. [[email protected] myroles]# ansible-playbook nginx.yaml

 

roles中notify模块的使用

roles使用notify模块,默认从roles/nginx/handles里面找

 

  1. [[email protected] myroles]# cat roles/nginx/handlers/main.yaml
  2. ---
  3. - name: start_nginx #定义handlers的动作类型
  4. shell: /usr/local/nginx/sbin/nginx
  5. - name: stop_nginx #定义handlers的动作类型
  6. shell: /usr/local/nginx/sbin/nginx -s stop
  7. - name: reload_nginx #定义handlers的动作类型
  8. shell: /usr/local/nginx/sbin/nginx -s reload
  9. [[email protected] myroles]# cat roles/nginx/tasks/main.yaml
  10. ---
  11. - name: check alived
  12. ping:
  13. - name:
  14. shell: ls /
  15. register: ls_result
  16. - debug: var=ls_result
  17. - name:
  18. shell: echo my phone is {{ phone }}
  19. register: echo_result
  20. - debug: var=echo_result
  21. - name:
  22. copy: src=test dest=/root/
  23. - name:
  24. script: test.sh
  25. - name:
  26. template: src=test.j2 dest=/root/test2
  27. notify: start_nginx #执行template任务后下发通知给handlers执行start_nginx
  28. [[email protected] myroles]# ansible-playbook nginx.yaml

 

特别提示:

notify下发通知只有当之前的任务造成了变化那么才会被执行,如果没有发生任何改变,则notify不会被执行。例如:

 

  1. #tasks任务造成改变,触发notify
  2. [[email protected] myroles]# cat /tmp/test.yaml
  3. ---
  4. - hosts: webA
  5. gather_facts: True
  6. tasks:
  7. - name:
  8. copy: src=/tmp/test dest=/root/ #这步造成目标改变才能出发notify
  9. notify: start_nginx
  10. handlers:
  11. - name: start_nginx
  12. shell: /usr/local/nginx/sbin/nginx
  13. [[email protected] myroles]# ansible-playbook /tmp/test.yaml
  14. PLAY [webA] ***************************************************************************************************
  15. TASK [Gathering Facts] ****************************************************************************************
  16. ok: [webA]
  17. TASK [copy] ***************************************************************************************************
  18. changed: [webA] #发生了改变
  19. RUNNING HANDLER [start_nginx] #触发notify *********************************************************************************
  20. changed: [webA]
  21. PLAY RECAP ****************************************************************************************************
  22. webA : ok=3 changed=2 unreachable=0 failed=0
  23. #我们再次执行/tmp/test.yaml
  24. [[email protected] myroles]# ansible-playbook /tmp/test.yaml
  25. PLAY [webA] ***************************************************************************************************
  26. TASK [Gathering Facts] ****************************************************************************************
  27. ok: [webA]
  28. TASK [copy] ***************************************************************************************************
  29. ok: [webA] #没有造成任务改变,未触发notify通知
  30. PLAY RECAP ****************************************************************************************************
  31. webA : ok=2 changed=0 unreachable=0 failed=0

 

ansible批量管理企业案例

4.1 ansible all -m copy -a 'src=/root/xin.sh dest=/root'

4.2 ansible all -m user -a 'name=yunjisuan shell=/sbin/nologin createhome=no'

4.3 ansible all -m shell -a 'echo "123123" | pass --stdin root'

4.4 ansible all -m user -a 'name=benet password=321321 shell=/bin/bash'

4.5 ansible all -m cron -a 'job="/bin/echo xin > /tmp/sl" name="test cron job"'

4.6 ansible all -m shell -a 'vmstat'

ansible批量管理服务工具

相关文章: