ansible 部署zabbix_agentd(分应用)

本文介绍了一种使用Ansible进行批量部署的方法,包括通过解析主机列表文件生成动态inventory,并自动创建用于不同服务(如Tomcat、Redis等)的Ansible Playbook。此外,还提供了如何配置和运行Playbook的具体步骤。

主机hosts

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
tomcat  192.1.1.121
redis 192.1.1.121
mongodb  192.1.1.121
tomcat  192.1.1.122
tomcat  192.1.1.123
redis 192.1.1.124
mongodb  192.1.1.124
tomcat  192.1.1.124
other  192.1.1.125
tomcat  192.1.1.126
fastdfs 192.1.1.127
fastdfs 192.1.1.128
fastdfs 192.1.1.129
other   192.1.1.130
other   192.1.1.131
fastdfs 192.1.1.132
fastdfs 192.1.1.133


生成动态inventory

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
devhosts.py
#!/usr/bin/python
# coding:utf-8
import sys
 
try:
    import json
except ImportError:
    import simplejson as json
 
 
def grouplist():
    inventory = {}
    # inventory['local'] = ['127.0.0.1']
    # sfile = '/etc/ansible/books.txt'
    sfile = 'books.txt'
    with open(sfile, 'rb') as f:
        for in f.readlines():
            group = i.strip().split()[0]
            name = i.strip().split()[1]
            if not group in inventory:
                inventory[group] = {
                    'hosts': []
                }
            inventory[group]['hosts'].append(name)
        print json.dumps(inventory, indent=4)
 
 
 
def hostinfo(name):
    vars = {}
    vars = {
        'admin''Jane Jolie',
        'datacenter'1
    }
    print json.dumps(vars, indent=4)
 
 
if __name__ == '__main__':
    if len(sys.argv) == 2 and (sys.argv[1== '--list'):
        grouplist()
    elif len(sys.argv) == 3 and (sys.argv[1== '--host'):
        hostinfo(sys.argv[2])
    else:
        print "Usage: %s --list or --host <hostname>" % sys.argv[0]
        sys.exit(1)


生成批量部署ansible-playbook

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
devansible.py
#!/usr/bin/python
# coding:utf-8
import sys
 
try:
    import json
except ImportError:
    import simplejson as json
 
dfile = 'ansible.sh'
 
def grouplist():
    inventory = {}
    # inventory['local'] = ['127.0.0.1']
    # sfile = '/etc/ansible/books.txt'
    sfile = 'books.txt'
    with open(sfile, 'rb') as f:
        for in f.readlines():
            group = i.strip().split()[0]
            name = i.strip().split()[1]
            if not group in inventory:
                inventory[group] = {
                    'hosts': []
                }
            inventory[group]['hosts'].append(name)
        # print json.dumps(inventory, indent=4)
        return inventory
 
 
 
def hostinfo(name):
    vars = {}
    vars = {
        'admin''Jane Jolie',
        'datacenter'1
    }
    print json.dumps(vars, indent=4)
 
def ansiblelast():
    inventory = grouplist()
    keys = []
    stringlist = []
    for key, item in inventory.iteritems():
        keys.append(key)
    print keys
    for key in keys:
        stringa = 'ansible-playbook -i /etc/ansible/devhosts.py %s.yml --extra-vars ' \
                  '"host=%s"' % (key,key)
        stringlist.append(stringa)
    with open(dfile, 'wb') as f1:
        for in stringlist:
            line = str(i) + "\n"
            f1.write(line)
 
if __name__ == '__main__':
    ansiblelast()


得到ansible.sh

1
2
3
4
5
ansible-playbook -/etc/ansible/devhosts.py fastdfs.yml --extra-vars "host=fastdfs"
ansible-playbook -/etc/ansible/devhosts.py mongodb.yml --extra-vars "host=mongodb"
ansible-playbook -/etc/ansible/devhosts.py other.yml --extra-vars "host=other"
ansible-playbook -/etc/ansible/devhosts.py redis.yml --extra-vars "host=redis"
ansible-playbook -/etc/ansible/devhosts.py tomcat.yml --extra-vars "host=tomcat"

默认最基本的模板

ansible-playbook -i /etc/ansible/devhosts.py install.yml --extra-vars "host=all"


复制sudoers,可以准备几个sudoers

ansible -i /etc/ansible/devhosts.py all -m copy -a 'src=/etc/ansible/zabbix/sudoers dest=/etc/sudoers mode=440'


注意权限

chown -R zabbix.zabbix /usr/local/zabbix


手动安装

1
2
3
4
useradd zabbix -/sbin/nologin
touch /var/log/zabbix_agentd.log
chmod 777 /var/log/zabbix_agentd.log
sudoers


最后,把主机hosts文件插入数据库



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

--- - name: 部署Zabbix Agent (CentOS7) hosts: all become: yes become_user: root become_method: sudo vars: zabbix_version: "6.2.9" zabbix_server_ip: "{{ zabbix_server | default('192.168.16.40') }}" zabbix_agent_port: "10050" # 敏感信息建议用ansible-vault加密存储 monitor_user: "monitor" monitor_password: "123456" # 生产环境需用ansible-vault加密 zabbix_install_prefix: "/usr/local/zabbix" # 使用相对路径,符合Ansible文件结构规范 local_zabbix_source: "/zabbix/zabbix-{{ zabbix_version }}.tar.gz" zabbix_agent_template: "/zabbix/zabbix_agentd.conf.j2" zabbix_init_script: "/zabbix/zabbix_agentd" tasks: # 1. 系统准备 - name: 安装基础仓库和工具 yum: name: - epel-release - yum-utils - wget state: present update_cache: yes - name: 启用必要系统仓库 command: yum-config-manager --enable base updates extras changed_when: false # 2. 创建管理用户 - name: 创建monitor用户 user: name: "{{ monitor_user }}" password: "{{ monitor_password | password_hash('sha512') }}" # 密码哈希化 shell: /bin/bash create_home: yes state: present groups: wheel # 加入wheel组便于 append: yes # 3. 安装依赖包(解决包依赖问题) - name: 安装编译和运行依赖 yum: name: # 系统工具 - gcc - make - automake - libtool # Zabbix依赖 - net-snmp - net-snmp-devel - curl-devel - java-1.8.0-openjdk - java-1.8.0-openjdk-devel - libevent - libevent-devel - mysql-devel # 硬件监控相关(通过EPEL仓库获取) - libssh2-devel state: present update_cache: yes register: yum_result retries: 3 delay: 5 until: yum_result is succeeded # 失败重试机制 # 4. 创建Zabbix运行用户 - name: 创建zabbix系统用户 user: name: zabbix shell: /sbin/nologin system: yes state: present create_home: no # 5. 上传并处理安装包 - name: 检查本地安装包是否存在 delegate_to: 192.168.16.11 stat: path: "{{ local_zabbix_source }}" register: zabbix_package failed_when: not zabbix_package.stat.exists # 本地包不存在则失败 - name: 上传Zabbix安装包 copy: src: "{{ local_zabbix_source }}" dest: "/zabbix/zabbix-{{ zabbix_version }}.tar.gz" owner: "{{ monitor_user }}" group: "{{ monitor_user }}" mode: '0644' vars: ansible_user: "{{ monitor_user }}" ansible_password: "{{ monitor_password }}" - name: 解压Zabbix源码 unarchive: src: "/tmp/zabbix-{{ zabbix_version }}.tar.gz" dest: "/usr/local/src/" remote_src: yes owner: root group: root creates: "/usr/local/src/zabbix-{{ zabbix_version }}" # 已存在则跳过 # 6. 编译安装 - name: 配置编译环境 shell: | export CFLAGS="-std=gnu99" ./configure --prefix={{ zabbix_install_prefix }} --enable-agent args: chdir: "/usr/local/src/zabbix-{{ zabbix_version }}" creates: "/usr/local/src/zabbix-{{ zabbix_version }}/Makefile" # 避免重复配置 - name: 编译安装Zabbix Agent make: chdir: "/usr/local/src/zabbix-{{ zabbix_version }}/" target: install register: make_result retries: 2 delay: 3 until: make_result is succeeded # 7. 权限配置 - name: 设置Zabbix目录权限 file: path: "{{ item }}" state: directory owner: zabbix group: zabbix mode: '0755' recurse: yes # 递归设置子目录 loop: - "{{ zabbix_install_prefix }}/etc" - "{{ zabbix_install_prefix }}/etc/zabbix_agentd.conf.d" - "{{ zabbix_install_prefix }}/scripts" - name: 创建系统命令链接 file: src: "{{ zabbix_install_prefix }}/{{ item.src }}" dest: "/usr/local/{{ item.dest }}/{{ item.src | basename }}" state: link force: yes # 存在旧链接则覆盖 loop: - { src: "bin/zabbix_get", dest: "bin" } - { src: "bin/zabbix_sender", dest: "bin" } - { src: "sbin/zabbix_agentd", dest: "sbin" } # 8. 配置Agent - name: 检查模板文件是否存在 delegate_to: 192.168.16.11 stat: path: "{{ zabbix_agent_template }}" register: template_file failed_when: not template_file.stat.exists - name: 生成Zabbix Agent配置文件 template: src: "{{ zabbix_agent_template }}" dest: "{{ zabbix_install_prefix }}/etc/zabbix_agentd.conf" owner: zabbix group: zabbix mode: '0644' validate: "{{ zabbix_install_prefix }}/sbin/zabbix_agentd -c %s -t agent.ping" # 配置验证 notify: 重启Zabbix Agent # 9. 服务管理配置 - name: 检查启动脚本是否存在 delegate_to: 192.168.16.11 stat: path: "{{ zabbix_init_script }}" register: init_file failed_when: not init_file.stat.exists - name: 部署启动脚本 copy: src: "{{ zabbix_init_script }}" dest: "/etc/init.d/zabbix_agentd" mode: '0755' owner: root group: root notify: 重启Zabbix Agent - name: 配置sudo权限(安全限制) lineinfile: path: /etc/sudoers.d/zabbix create: yes line: "{{ monitor_user }} ALL=(root) NOPASSWD: /etc/init.d/zabbix_agentd start, /etc/init.d/zabbix_agentd stop, /etc/init.d/zabbix_agentd restart, /etc/init.d/zabbix_agentd status" validate: 'visudo -cf %s' mode: '0440' # sudoers文件安全权限 # 10. 防火墙配置 - name: 开放Zabbix Agent端口 firewalld: port: "{{ zabbix_agent_port }}/tcp" permanent: yes immediate: yes state: enabled when: ansible_facts['services']['firewalld.service']['state'] == 'running' - name: 临时关闭SELinux(如需永久关闭请修改/etc/selinux/config) command: setenforce 0 when: ansible_facts['selinux']['status'] == 'enabled' changed_when: false # 11. 启动并验证服务 - name: 启动Zabbix Agent服务 service: name: zabbix_agentd enabled: yes state: started - name: 验证服务是否启动 command: pgrep zabbix_agentd register: agent_process failed_when: agent_process.rc != 0 changed_when: false - name: 验证端口监听 wait_for: port: "{{ zabbix_agent_port }}" state: started timeout: 10 host: 0.0.0.0 handlers: - name: 重启Zabbix Agent service: name: zabbix_agentd state: restarted jumpserver:192.168.16.11 优化修改
09-01
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值