• ansible运维工具(一)


    运维工具介绍
    OS Provisioning: PXE, Cobbler(repository, distritution,profile)
    PXE: dhcp, tftp, (http, ftp)
    dnsmasq: dhcp, dns
    OS Config:
    Puppet, saltstack, func
    Deployment:
    fabric

    运维工具分类:
    	agent: puppet,func
        agentless: ansible,fabric
        	ssh service
    
        ansible 的核心组件:
        	ansible core
    		host inventory
            core modules
            custom modules
            playbook (yaml) 允许我们将多个任务写在一个文件中,这个文件就叫做playbook,是yaml格式,使用jinjia2定义模版语言)
            connect plugin (使用的是python中的pramiko插件,log插件)
    
        ansible的特性:
        	基于python语言实现,由Pramiko 来实现创建ssh连接,PyYAML和jinjia2三个类模块;
    
            部署简单, agentless
            默认使用SSH协议;
            	(1)基于密钥认证;
                (2)在Inventory中定义指定账户和密码。
            主从模式;
            	master: ansible, ssh client 主节点指ansible节点,同时是ssh的客户端节点
                slave: ansible的客户端主机 同时是ssh server节点。
            支持自定义模块:支持各种编程语言
            支持Playbook
            基于“模块”管理完成各种 “任务”
    
    ansible的安装:
    在epel源有提供,只是在系统中没有自带
    使用yum info ansible 查看软件的一个简介
    初步使用ansible:
    	1. 在Inventory文件中定义要管理的连接信息
    	2. 使用ansible的命令行客户端,通过读取Inventory文件定位每一个可以被管理的主机,从而指挥他们来工作。
    	3. 远程主机管理之前最好能做基于ssh密钥认证方式,这样就不需要每一次输入密码。也不用在Inventory文件中写明文密码。
     命令使用格式:
     	ansible -m "model_name" -h 'hostname' -a "array"
    	rpm -ql ansible 查看安装了哪些文件
        配置文件:有两个文件需要我们留意的
        	/etc/ansible/ansible.conf
            假如有100个主机,一次操作这么多对ansible主机会有很大压力,所以可以配置一批处理多少个配置文件
    		/etc/ansible/hosts 它其实就是inventory,这个文件可以将被管理主机定义进来,每一个被管理主机的ip,用户,端口,密码等等
        ansible不是服务,所以没有需要运行的服务,但是额外有一些命令程序需要注意
        /usr/bin/ansible
        /usr/bin/ansible-doc 查看得出ansible已经支持哪些自带的模块
        /usr/bin/ansible-galaxy
        /usr/bin/ansible-playbook
        /usr/bin/ansible-pull
        /usr/bin/ansible-vault
    ansible命令使用事例:
    首先编辑inventory文件 /etc/ansible/hosts文件
    
    	# cat /etc/ansible/
        ansible.cfg  hosts        hosts_bak    roles/
        # cat /etc/ansible/hosts
        [websrvs]
        10.211.55.7
        10.211.55.5
        [dbsrvs]
        10.211.55.8
    
    如何查看模块帮助文档
        ansible-doc -l 列出所有模块
        ansible-doc -s module_name 查看某一个模块的使用说明
    尝试运行一个任务
    ansible 命令应用基础
    	man ansible查看基本用法
        ansible <host-pattern> [-f forks] [-m module_name] [-a args]
        <host-pattern 对哪些主机生效
        -f forks 一批控制多少主机执行任务。其实就是启动的并发线程数
        -m 模块名
        -a args 模块特有的参数
    

    常见模块:
    command 模块 当命令行不指定模块的时候,默认模块就是command模块,用于在远程主机执行命令。
    这个模块有一个缺点,就是运行命令不能使用变量或者参数 ,如果想要使用变量 或者参数那么要使用ansible的另外一个shell模块

    	基于ip地址运行
        [root@centos-linux .ssh]# ansible 10.211.55.8 -m command -a 'date'
        10.211.55.8 | SUCCESS | rc=0 >>
        Mon Apr  2 14:32:04 HKT 2018
    
        基于inventory里配置的主机组运行
        # ansible websrvs  -m command -a 'date'
        10.211.55.7 | SUCCESS | rc=0 >>
        Mon Apr  2 14:31:08 HKT 2018
    
        10.211.55.5 | SUCCESS | rc=0 >>
        Mon Apr  2 14:31:09 HKT 2018
    
        使用all,inventory里有一个默认的组把所有主机加入到这个组中
        [root@centos-linux .ssh]# ansible all  -m command -a 'date'
        10.211.55.7 | SUCCESS | rc=0 >>
        Mon Apr  2 14:33:34 HKT 2018
    
        10.211.55.8 | SUCCESS | rc=0 >>
        Mon Apr  2 14:33:34 HKT 2018
    
        10.211.55.5 | SUCCESS | rc=0 >>
        Mon Apr  2 14:33:35 HKT 2018
    
    	cron 模块
        ansible-doc -s cron
        属性:
        	present . 安装
            absent 移除
        如:
        */10 * * * * /bin/echo 'hello, world'
        ansible all -m cron -a 'minute="*/10" job="/bin/echo hello" name="test job" state=present'
        ansible all -m cron -a 'minute="*/10" job="/bin/echo hello" name="test job" state=absent'
    
        user模块
        	最关键的属性
            name 指定用户的名称
    	# ansible-doc -s user
    
        [root@centos-linux .ssh]# ansible websrvs -m user -a 'name="user1"'
        10.211.55.5 | SUCCESS => {
            "changed": true,
            "comment": "",
            "createhome": true,
            "group": 1001,
            "home": "/home/user1",
            "name": "user1",
            "shell": "/bin/bash",
            "state": "present",
            "system": false,
            "uid": 1001
        }
        10.211.55.7 | SUCCESS => {
            "changed": true,
            "comment": "",
            "createhome": true,
            "group": 1001,
            "home": "/home/user1",
            "name": "user1",
            "shell": "/bin/bash",
            "state": "present",
            "system": false,
            "uid": 1001
        }
        删除
        ansible websrvs -m user -a 'name="user1" state=absent'
    
        group模块,实现组管理的
    
            # ansible websrvs -m group -a "name=mysql gid=306 system=yes"
            10.211.55.5 | SUCCESS => {
                "changed": true,
                "gid": 306,
                "name": "mysql",
                "state": "present",
                "system": true
            }
            10.211.55.7 | SUCCESS => {
                "changed": true,
                "gid": 306,
                "name": "mysql",
                "state": "present",
                "system": true
            }
    	然后在使用user模块添加用户的时候指定组
            # ansible websrvs -m user -a "name=mysql uid=306 system=yes group=mysql"
            10.211.55.7 | SUCCESS => {
                "changed": true,
                "comment": "",
                "createhome": true,
                "group": 306,
                "home": "/home/mysql",
                "name": "mysql",
                "shell": "/bin/bash",
                "state": "present",
                "system": true,
                "uid": 306
            }
            10.211.55.5 | SUCCESS => {
                "changed": true,
                "comment": "",
                "createhome": true,
                "group": 306,
                "home": "/home/mysql",
                "name": "mysql",
                "shell": "/bin/bash",
                "state": "present",
                "system": true,
                "uid": 306
            }
        copy模块 ,从本机 复制文件到远程主机上
        ansible-doc -s copy
    
        # ansible all -m copy -a "src=/etc/fstab dest=/tmp/fstab.ansible owner=root mode=640"
        src 指定本地文件路径,可以使用相对路径和绝对路径
        dest 远程服务器文件拷贝的目标目录 ,只能使用绝对路径
        owner 拷贝后属主是root
        mode 权限 640
        备注:src属性不是必须的,可以使用content属性直接指定文件内容
        # ansible all -m copy -a 'content="Hello Ansible
    Hello my brother
    " dest=/tmp/test.ansible'
        不仅可以拷贝文件,也可以是目录,直接写目录就可以了
    
        file模块,这是一个管理文件属性的模块
        可以使用file模块创建链接文件
        # ansible websrvs -m file -a 'owner=mysql group=mysql mode=644 path=/tmp/fstab.ansible'
    
        创建一个符号链接
        # ansible websrvs -m file -a ' path=/tmp/fstab.link src=/tmp/fstab.ansible state=link'
        path 指定你要改的文件,也可以用dest属性,还可以用name属性
    	state = link	设置状态为链接文件
        src 指定源文件
    
    	ping 模块
        测试远程主机的连通性
            # ansible all -m ping
            10.211.55.7 | SUCCESS => {
                "changed": false,
                "ping": "pong"
            }
            10.211.55.8 | SUCCESS => {
                "changed": false,
                "ping": "pong"
            }
            10.211.55.5 | SUCCESS => {
                "changed": false,
                "ping": "pong"
            }
    
    	service模块 ,非常重要的模块 ,控制服务的指定状态
        # ansible websrvs -m service -a 'enabled=true name=httpd state=started'
        enable 是否开机自动启动,取值为true或者false;
        name: 服务名称
    	state: 状态 取值友started, stopped
    
        shell 模块,可以使用变量
        比如我们在三台机器上已经创建了user1用户,现在我们使用shell模块给用户创建密码
        假如我们使用command命令执行
            # ansible all -m command -a 'echo mypasswd|passwd -stdin user1'
            10.211.55.8 | SUCCESS | rc=0 >>
            mypasswd|passwd -stdin user1
    
            10.211.55.7 | SUCCESS | rc=0 >>
            mypasswd|passwd -stdin user1
    
            10.211.55.5 | SUCCESS | rc=0 >>
            mypasswd|passwd -stdin user1
       命令执行后,没有报错,这时我们看下密码文件,user1到底有没有被设置密码
           cat /etc/shadow
           user1:!!:17623:0:99999:7:::
       发现并没有为user1设置密码,这就是因为使用command 不能执行较复杂的命令,这时我们使用shell模块
            # ansible all -m shell -a 'echo mypasswd|passwd --stdin user1'
            10.211.55.7 | SUCCESS | rc=0 >>
            Changing password for user user1.
            passwd: all authentication tokens updated successfully.
    
            10.211.55.8 | SUCCESS | rc=0 >>
            Changing password for user user1.
            passwd: all authentication tokens updated successfully.
    
            10.211.55.5 | SUCCESS | rc=0 >>
            Changing password for user user1.
            passwd: all authentication tokens updated successfully.
        这时在看下/etc/shadow文件如下:
       	user1:$6$YFEI7Fqn$cwMdso5xwPv5gTKkHSOavP4LraxQNv78DDP4r.tKXiewhRp9Ps7tQPofouYnQs2JjEIm0B2nKY4tR1.QRdash.:17623:0:99999:7:::
    
    	script 模块
        如果想在远程主机上执行一个 ansible服务器上存在的脚本,就需要使用此模块
        指定一个本地脚本,它会自动将这个脚本复制到每一个远程主机上并运行下。
        例如本地有test.sh脚本
    		#!?bin/bash
            echo "hello ansible form script" > /tmp/script.ansible
            useradd user2
        然后通过ansible script脚本
        	# ansible all -m script -a '/tmp/test.sh'
        如果发现执行失败,因为老版本ansible script 执行本地的脚本,脚本必须在执行命令的当前目录下如:
        	# ansible all -m script -a 'test.sh'
    
        yum 模块,安装程序包,卸载程序包
        # ansible all -m yum -a 'name=zsh'
        name 指明要安装的程序包,可以带上版本号
        state= persent, latest 表示安装,absent表示卸载
    
    	setup 模块,收集远程主机的facts
        能查看每个被管理节点在接收并运行管理命令之前,会将自己主机的相关信息,如操作系统版本,IP地址等报告给远程的ansible主机
        # ansible all -m setup 直接查看所有远程主机的facts信息
        比如nginx的配置文件,要设置work_prosess 参数设置,一般是指为服务器cpu核心数-1的数量,这就需要远程主机发过来的facts信息,进行设置。要使用到模版文件为不同配置的服务器生成不同的nginx配置文件。
  • 相关阅读:
    1、vsCode插件开发流程入门
    node中MySQL的安装与使用
    sublime使用插件
    Node.js基础知识梳理
    第5章-11 字典合并 (40分)
    我的考研心得-zju-se
    解决 重启tomcat上传的文件被自动删除或未重启过段时间也自动删除(deloy path)
    org.hibernate.InstantiationException: No default constructor for entity
    UE.delEditor is not a function问题原因及解决方法
    javaweb开发过程中遇到的问题
  • 原文地址:https://www.cnblogs.com/zhming26/p/8707539.html
Copyright © 2020-2023  润新知