运维工具介绍
OS Provisioning: PXE, Cobbler(repository, distritution,profile)
PXE: dhcp, tftp, (http, ftp)
dnsmasq: dhcp, dns
OS Config:
Puppet, saltstack, func
Deployment:
fabricpython
运维工具分类: 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模块mysql
基于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\nHello my brother\n" 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配置文件。