分类 自动化运维 下的文章

ansible-playbook roles 安装zabbix-agent 监控 php


Ansible为了层次化、结构化地组织Playbook,使用了角色(roles)。Roles能够根据层次型结构自动装载变量文件、task以 
及handlers等。简单来讲,roles就是通过分别将变量、文件、任务、模块及处理器放置于单独的目录中,并可以便捷地 
include它们,roles一般用于基于主机构建服务的场景中,但也可以用于构建守护进程等场景中。
创建roles时一般需要以下步骤:首先创建以roles命名的目录。然后在roles目标下分别创建以个角色名称命令的目录,如 
websevers等,在每个角色命令的目录中分别创建files、handlers、tasks、templates、meta、defaults和vars目录,用 
不到的目录可以创建为空目录。最后在Playbook文件中调用各角色进行使用

roles内各目录含义解释
files:用来存放由copy模块或script模块调用的文件。
templates:用来存放jinjia2模板,template模块会自动在此目录中寻找jinjia2模板文件。
tasks:此目录应当包含一个main.yml文件,用于定义此角色的任务列表,此文件可以使用include包含其它的位于此目录的 
task文件。
handlers:此目录应当包含一个main.yml文件,用于定义此角色中触发条件时执行的动作。
vars:此目录应当包含一个main.yml文件,用于定义此角色用到的变量。
defaults:此目录应当包含一个main.yml文件,用于为当前角色设定默认变量。
meta:此目录应当包含一个main.yml文件,用于定义此角色的特殊设定及其依赖关系
目录结构
[root@baiduyun zabbix]# tree /etc/ansible/roles/
/etc/ansible/roles/
├── zabbix-agent
│   ├── files
│   │   ├── check_service.conf 
│   │   ├── php-fpm_status.sh
│   │   
│   ├── tasks
│   │   ├── main.yml
│   │   └── zabbix-agent.yml
│   ├── templates
│   │   └── zabbix_agentd.j2
│   └── vars

cat check_service.conf 
UserParameter=php[*],/etc/zabbix/scripts/php-fpm_status.sh $1
[root@baiduyun files]# cat php-fpm_status.sh 
#########################################################################
# File Name: php-fpm_status.sh
#########################################################################
#!/bin/bash

listenqueue(){       #处于等待状态中的连接数,如果不为0,需要增加php-fpm进程数
    wget --quiet -O - http://127.0.0.1:9996/status?auto |grep "listen queue:"|grep -vE "len|max"|awk 
'{print$3}'
}

listenqueuelen(){  #处于等待连接队列的套接字大小
    wget --quiet -O - http://127.0.0.1:9996/status?auto |grep "listen queue len" |awk '{print$4}'
}

idle(){          #处于空闲状态的进程数
    wget --quiet -O - http://127.0.0.1:9996/status?auto |grep "idle processes" |awk '{print$3}'
}
active(){       #处于活动状态的进程数
    wget --quiet -O - http://127.0.0.1:9996/status?auto |grep "active" |awk '{print$3}'|grep -v 
"process"
}
total(){        #进程总数
    wget --quiet -O - http://127.0.0.1:9996/status?auto |grep "total processes" |awk '{print$3}'
}

mactive(){    #从php-fpm启动到现在的进程处于活动状态数

    wget --quiet -O - http://127.0.0.1:9996/status?auto |grep "max active processes:" |awk '{print$4}'
}

$1

[root@baiduyun tasks]# cat main.yml 
- include: zabbix-agent.yml
tags: zabbix-agent

[root@baiduyun tasks]# cat zabbix-agent.yml 
- name: Install Zabbix-Agent RPM
  yum:
    name: https://repo.zabbix.com/zabbix/4.0/rhel/7/x86_64/zabbix-release-4.0-1.el7.noarch.rpm 
    state: installed

- name: Install zabbix-agent 
  register: zabbix-agent
  yum:
    name: zabbix-agent
    ignore_errors: true

- name: create zabbix scripts directory
  file:
    path: /etc/zabbix/scripts
    state: directory
    mode: 0755


- name: Sync zabbix-agentd.conf
  template: 
    src: /etc/ansible/roles/zabbix-agent/templates/zabbix_agentd.j2 
    dest: /etc/zabbix/zabbix_agentd.conf 
    owner: root 
    group: root 
    mode: 0644

- name: php status
  copy:
    src: /etc/ansible/roles/zabbix-agent/files/php-fpm_status.sh
    dest: /etc/zabbix/scripts
    owner: root
    group: root
    mode: 0644

- name: php moban
  copy:
    src: /etc/ansible/roles/zabbix-agent/files/check_service.conf
    dest: /etc/zabbix/zabbix_agentd.d/
    owner: root
    group: root
    mode: 0644

  - name: zabbix-server start and enable
  systemd:
    name: zabbix-agent
    enabled: yes
    state: started
 
[root@baiduyun templates]# cat zabbix_agentd.j2 
PidFile=/var/run/zabbix/zabbix_agentd.pid
LogFile=/var/log/zabbix/zabbix_agentd.log
LogFileSize=0
Server=139.9.72.161
ListenPort=10050
ServerActive=139.9.72.161
Hostname={{agent_hostname}}
Timeout=30
Include=/etc/zabbix/zabbix_agentd.d/*.conf

执行
ansible-playbook /etc/ansible/zabbix-agent.yml -i /etc/ansible/ssh/hosts -e "hosts=baidu 
agent_hostname=baiduyun" -b

Jenkins服务搭建和部署


**安装jdk**
yum -y list java*  yum search jdk  寻找包
yum install -y java-1.8.0-openjdk.x86_64
yum 安装的jdk路径在 /usr/lib/jvm/
**通过yum来安装**
wget -O /etc/yum.repos.d/jenkins.repo https://pkg.jenkins.io/redhat-stable/jenkins.repo
rpm --import https://pkg.jenkins.io/redhat-stable/jenkins.io.key
yum install jenkins -y
systemctl start jenkins //启动jenkins服务
检查 /etc/init.d/Jenkins 文件(可通过vi编辑器修改)中JDK路径是否与本地路径一致
/usr/lib/jvm/jre-1.8.0-openjdk/bin/java 加入

接下来就是访问网址,本地访问http://localhost:8080 
按照提示来操作

新建任务 选择构建一个自由风格  选择参数构建 

WJS.png

3G.png

执行时候报没有权限  把jenkins 改为root
[root@baiduyun ansible]# cat /etc/sysconfig/jenkins |grep root
JENKINS_USER="root"
chown -R root:root /var/lib/jenkins
chown -R root:root /var/cache/jenkins
chown -R root:root /var/log/jenkins
systemctl restart jenkins

ansible PlayBook


**一、PlayBook的作用**
之前的模块都是使用Ad-hoc方式(Ad-hoc方式是一种可以快速输入的命令,而且不需要保存起来的命令,相当于bash中的一句 
话shell)点对点命令执行,可以管理远程主机,但如果服务器数量比较多,配置信息也比较多,可以利用Ansible PlayBook 
编 
写剧本,以更加简便的方式实现任务处理的自动化和流程化。

**二、PlayBook组成及参数详解**
PlayBook是由一个或多个“play”组成的列表,play的主要功能是为Ansible中的task定义好的角色,指定剧本对应的服务器 
组。 
相当于task是一个任务,task调用Ansible的各种模块,将多个play组织在一个playbook剧本中,全部组成一个完整的流程控 
制集合
1、PlayBook组件包括
target:定义PlayBook的远程主机组
variable:定义PlayBook使用的变量
task:定义远程主机上执行的任务列表
handler:定义task执行完成后需要调用的任务,例如修改配置文件之后,启动跟handler任务重启相关联的服务
2、target常用参数详解
hosts:定义远程主机组
user:执行该任务的用户
sudo:设置为yes的时候,执行任务使用root权限
sudo_user:指定sudo的普通用户
connection:默认基于SSH链接客户端
gather_facks:获取远程主机facts基础信息
3、variable常用参数详解
vars:定义格式,变量名:变量值
vars_files:指定变量文件
vars_prompt:用户交互模式自定义变量
setup:模块取远程主机的值
4、task常用参数详解
name:任务显示名称也是屏幕显示信息
action:定义执行的动作
copy:复制本地文件到远程主机
template:复制本地文件到远程主机,可以引用本地变量
service:定义服务的状态
基于Ansible PlayBook还可以收集命令、创建任务集,可以大大降低管理工作的复杂程度,PlayBook采用YAML语法结构

**三、YAML语言特性**
YAML(yet another markup language)是一种直观的能被电脑识别的数据序列化格式,是一个容易阅读,和脚本语言交互,用 
来表达资料序列的编程语言。YAML使用空白字符和分行来分隔资料,适合用Python、Ruby、Perl、grep来操作。

YAML语言特性为:

可读性强
和脚本语言的交互性好
使用实现语言的数据类型
一致的信息模型
易于实现
可以基于流来处理
可扩展性强
四、Ansible PlayBook示例
(1)判断是否需要安装某个服务
检测远程主机是否由nginx服务,不存在则安装nginx服务,安装完成后并启动nginx
1.1 编写脚本 
PlayBook代码如下,文件名是xxx.yml
#apache
---

- hosts: huawei
  user: xiaowang 
  become: yes #是否允许身份切换
  become_method: sudo #切换用户身份的方式,有sudo、su、pbrun等方式,默认为sudo


  tasks:
    - name: Apache server Install
      yum: name=httpd state=installed
      notify: #notify”这个action可用于在每个play的最后被触发,notify中调用handler中定义的操作
       - start httpd

  handlers:
    - name: start httpd
      service: name=httpd state=started enabled=yes
ansible-playbook apache.yml -i /etc/ansible/ssh/hosts
(2)PlayBook远程修改配置文件
安装好了之后,我们可以把http的发布页面从本地发送给远程服务器上面去 
这是只需要在tasks里面添加一个任务即可 
代码如下:
#apache
---

- hosts: huawei
  user: xiaowang 
  become: yes #是否允许身份切换
  become_method: sudo #切换用户身份的方式,有sudo、su、pbrun等方式,默认为sudo


  tasks:
    - name: Apache server Install
      yum: name=httpd state=installed
      notify: #notify”这个action可用于在每个play的最后被触发,notify中调用handler中定义的操作
       - start httpd
    - name: Apache server index.html Update
      copy: src=/mnt/index.html dest=/var/www/html/ mode=644
  handlers:
    - name: start httpd
      service: name=httpd state=started enabled=yes
(3)PlayBook自定义模版
Ansible PlayBook还可以自定义template模版文件,模板文件主要是用于服务器需求不一致、需要独立定义的情况。 
templates模板:
功能:根据模块文件动态生成对应的配置文件

使用方法:

(1)templates文件必须存放在templates目录下,且以.j2为后缀

(2)templates模块只能被playbook调用

(3)yam文件需和templates目录平级,目录结构如下:

./

├── temnginx.yml

└── templates

└── nginx.conf.j2

**示例1:使用template传输配置文件**
创建templates目录
cp /etc/nginx/nginx.conf  templates/nginx.conf.j2

vim testtemplate.yml
---
– hosts: huawei
  become: yes
  become_method: sudo
  user: xiaowang
  tasks:
   – name: install package
     yum: name=nginx
   – name: copy template
     template: src=nginx.conf.j2 dest=/etc/nginx/nginx.conf
   – name: start service
     service: name=nginx state=started enabled=yes
ansible-playbook testtemplate.yml -i /etc/ansible/ssh/hosts
示例2:template引用系统变量

**ansible roles角色**
playbook roles角色这个词一直不知道怎么解释,这么说吧,我们常用的lnmp环境,可以分为nginx 
管理、mysql管理、php 管理等,如果我们使用playbook写成一个文件,这个文件会很大,但是不方 
便组织,我们可以分组,将 其按大组分类,再细分为 具体的小任务。
[ansible  PlayBook][1]

ansible 常用命令


**# 使用此user的su执行操作,默认为root,已废弃,使用become替代  -b --become 使用become的方式升级权限
因为我们使用的是普通用户来操作**

-i 目标主机列表  -m 指定模块名称
**ansible ping 模块**
ansible -i /etc/ansible/ssh/hosts all -m ping -b

**ansible copy 模块**
-a 模块的参数或者命令 force=yes:用来强制取消软件安装过程中的交互确认提示 第一次使用时候
ansible -i /etc/ansible/ssh/hosts all  -m copy -a "src=/root/test.sh dest=/tmp/test.sh mode=755 
owner=root group=root force=yes" -b

content:表示文件内容把helloworld加入test.txt  backup=yes 备份
ansible -i /etc/ansible/ssh/hosts huawei -m copy -a 'content="hello world" dest=/tmp/test.txt 
backup=yes mode=755 owner=root' -b

**ansible command 模块  主要执行linux基础命令**
ansible -i /etc/ansible/ssh/hosts all -m command -a "date" -b
ansible -i /etc/ansible/ssh/hosts huawei -m command -a "systemctl start nginx" -b

**ansible yum 模块**  主要用于软件安装 升级  卸载absent
name: 安装最新版本的apache
yum: name=httpd state=latest
name: 移除apache
yum: name=httpd state=absent
name: 安装一个特殊版本的apache
yum: name=httpd-2.2.29-1.4.amzn1 state=present
name: 升级所有的软件包
yum: name=* state=latest
name: 从一个远程yum仓库安装nginx
yum: name=http://nginx.org/packages/centos/6/noarch/RPMS/nginx-release-centos-6-0.el6.ngx.noarch.rpm 
state=present
name: 从本地仓库安装nginx
yum: name=/usr/local/src/nginx-release-centos-6-0.el6.ngx.noarch.rpm state=present
name: 安装整个Development tools相关的软件包
yum: name="@Development tools" state=present
ansible -i /etc/ansible/ssh/hosts huawei -m yum -a "name=sysstat,screen state=installed" -b

**ansible file模块** 文件、创建、删除、修改、权限、属性、维护和管理
修改文件属性
ansible -i /etc/ansible/ssh/hosts huawei -m file -a "path=/tmp/test.txt owner=nginx group=nginx 
mode=0644" -b
生成链接文件
ansible -i /etc/ansible/ssh/hosts huawei -m file -a "src=/root/test.sh dest=/root/testlink.sh 
owner=root group=root state=link force=yes" -b
创建空文件
ansible -i /etc/ansible/ssh/hosts huawei -m file -a "path=/root/abc.sh state=touch mode=0644" -b
创建空目录
ansible -i /etc/ansible/ssh/hosts huawei -m file -a "path=/root/abc state=directory mode=755" -b
删除目录或文件,强制执行
ansible -i /etc/ansible/ssh/hosts huawei -m file -a "path=/root/abc state=absent force=yes" -b

**ansible user group模块**  生成用户、删除用户
生成用户
ansible -i /etc/ansible/ssh/hosts huawei -m user -a "name=test password=1DhUWqz2JZqc home=/home 
uid=999 comment=‘this is a ansible test user‘ shell=/bin/sh" -b
删除用户remove是否移除家目录
ansible -i /etc/ansible/ssh/hosts huawei -m user -a "name=test state=absent remove=yes force=yes" -b
生成组
ansible -i /etc/ansible/ssh/hosts huawei -m group -a 'name=g1 gid=666 state=present system=yes' -b
删除组
ansible -i /etc/ansible/ssh/hosts huawei -m group -a 'name=g1 state=absent' -b

**ansible cron 模块**   present(添加)、absent(移除) job:任何计划执行的命令,state要等于present
同步时间每天凌晨0点0分
ansible -i /etc/ansible/ssh/hosts huawei -m cron -a "minute=0 hour=0 day=* weekday=* name='server 
status' job='/usr/sbin/ntpdat 139.224.227.121'" -b
备份
ansible  -i /etc/ansible/ssh/hosts huawei -m cron -a "minute=0 hour=0 day=* month=* weekday=* 
name='Ntpdate server for sync time' backup=yes job='ntpdate www.lcl.com'"
删除
ansible -i /etc/ansible/ssh/hosts huawei -m cron -a "name='server status' state=absent" -b

**ansible 修改主机名字:hostname**
ansible -i /etc/ansible/ssh/hosts huawei -m hostname -a "name=ansible-test245" -b

**Ansible synchronize模块主要用于目录、文件的同步,主要基于rsync命令工具同步目录和文件** 
(1)常用的src为源目录,dest为目标目录,示例为将远程主机的/tmp/目录同步为本地Ansible服务器的/tmp/目录 
需要些安装rsync 软件
ansible -i /etc/ansible/ssh/hosts huawei -m synchronize -a "src=/tmp/ dest=/tmp/"  -b
(2)compress=yes表示开启压缩,delete表示数据一致,rsync_opts表示同步参数,–exclude表示排除文件
ansible -i /etc/ansible/ssh/hosts huawei -m synchronize -a "src=/tmp dest=/mnt compress=yes delete=yes 
archive=yes rsync_opts=--exclude=*.txt" #这句表示把本地的/tmp目录以及里面除了.txt结尾的文件同步到huawei 
的/mnt目录里面,并且同步/tmp目录以及文件的属性,还要删除本地没有但远程主机有的文件

**Ansible shell模块主要用于远程客户端上执行各种shell命令或者运行脚本**
(1)远程执行shell脚本,并把结果追加至服务器/tmp/var.log文件,这种用shell执行而不用command,就是因为command 
不支持变量、重定向、管道符等操作
ansible -i /etc/ansible/ssh/hosts huawei -m shell -a "/bin/sh /mnt/test.sh >> /tmp/var.log" -b
ansible -i /etc/ansible/ssh/hosts huawei -m command -a "cat /tmp/var.log" -b
(2)执行之前切换目录,屏蔽警告信息,创建目录 
ansible -i /etc/ansible/ssh/hosts huawei -m shell -a "mkdir -p `date +%F` chdir=/tmp/ warn=no" -b
##这里是为了创建一个今天日期的目录,所以date +%F不是引号而是和shell脚本中使用命令时使用的反引号
(3)用shell可以使用管道符,比如查看远程客户端nginx服务是否启动,用默认的command模块就会报错,这里也显示shell 
模块和command模块的区别 
ansible -i /etc/ansible/ssh/hosts huawei -m shell  -a "ps -ef | grep http"
[root@baidu tmp]# ansible -i /etc/ansible/ssh/hosts huawei  -m  command  -a "ps -ef | grep nginx"
1.1.1.1 | FAILED | rc=1 >>
error: garbage option
Usage:
 ps [options]
Try 'ps --help <simple|list|output|threads|misc|all>'
or 'ps --help <s|l|o|t|m|a>'
for additional help text.
For more details see ps(1).non-zero return code

**Ansible常用模块-script模块**
script 模块可以帮助我们在远程主机上执行 ansible 管理主机上的脚本,也就是说,脚本一直存在于 ansible 管理主机本 
地,不需要手动拷贝到远程主机后再执行。 
ansible -i /etc/ansible/ssh/hosts all -m script -a "test.sh" -b #需要在脚本所在目录里面执行

**Ansible service模块主要用于远程客户端各种服务管理,包括启动、停止、重启、重新加载等** 
enabled:是否开机启动服务
name:服务名称
runlevel:服务启动级别
arguments:服务命令行参数传递
state:服务操作状态,状态包括started、stopped、restarted、reloaded
#停止nginx
ansible -i /etc/ansible/ssh/hosts huawei -m service -a "name=nginx state=stopped" -b
#将服务设置成开机自启动
ansible -i /etc/ansible/ssh/hosts huawei -m service -a "name=nginx enabled=yes" -b

ansible 安装配置


安装:
yum install -y ansible
关闭selinux
创建一个ssh 放置主机信息 
mkdir -p  /etc/ansible/ssh
cd !$  创建hosts
cat hosts
[aliyun]
1.1.1.1 ansible_ssh_port=58102 ansible_ssh_user=xiaowang  
ansible_ssh_private_key_file=/etc/ansible/xwang.pem
[baidu]
2.2.2.2 ansible_ssh_port=58102 ansible_ssh_user=xiaowang  
ansible_ssh_private_key_file=/etc/ansible/xwang.pem

centos7修改主机名:
hostnamectl set-hostname baidu    然后reboot 

把私钥上传到/etc/ansible/
这里使用xiaownag用户需要自行建立用户并配置公钥

使用密钥对远程登录Linux服务器

测试:
修改秘钥权限chmod 500 xwang.pem
ansible -i /etc/ansible/ssh/hosts all -m ping
第一次需要认证输入yes
解决办法:在/etc/ansible/ansible.cfg文件中进行配置;
在# uncomment this to disable SSH key host checking下
host_key_checking = False默认是注释掉的  
打开 host_key_checking = False的注释。同样也可以实现跳过 ssh 首次连接提示验证部分