Ansible安装与配置(自动化运维管理工具) 原创 2016年06月02日 18:35:01 标签: ansible / 运维管理 / python 原文链接:http://blog.csdn.net/xyang81/article/details/51568227 Ansible是一个简单高效的自动化运维管理工具,用Python开发,能大批量管理N多台机器,可以并发的在多台机器上部署应用、安装软件、执行命令、配置和编排任务。 一、Ansible工作机制 ansible架构图
从图中可以看出ansible分为以下几个部份: 1> Control Node:控制机器 2> Inventory:主机清单,配置管理主机列表 3> Playbooks:剧本、任务编排。根据规则定义多个任务,模块组织结构清晰,由ansible自动执行。 4> Modules(Core | Custom):模块,用于执行某个具体的任务 5> connection plugin(连接插件):Ansible通过不同的协议连接到远程主机上,执行指定的命令。默认采用ssh协议连接远程主机。 二、Ansible执行流程 Ansible执行流程 简单理解就是Ansible在运行时,首先读取ansible.cfg中的配置,根据规则获取Inventory中的管理主机列表,并行的在这些主机中执行配置的任务,最后等待执行返回的结果。 三、安装Ansible 一台控制主机:192.168.0.202 三台管理主机: 192.168.0.200 192.168.0.201 192.168.0.203 安装要求: 控制服务器:需要安装 Python2.6/2.7 管理服务器:需要安装 Python2.4 以上版本,若低于 Python2.5 需要安装 pythonsimplejson; 若启用了 selinux,则需要安装 libselinux-python。 本次安装基于CentOS7系统环境、Python2.7.5、root用户。 3.1、yum安装(推荐) yum install epel-release yum install ansible 3.2、pip安装 pip install ansible 注:pip方式安装不会在/etc/ansible目录下生成默认的相关配置文件 四、配置 控制主机:用于控制其它机器的主机 管理主机:被控制主机管理的主机 4.1、配置管理主机 vim /etc/ansible/hosts 在hosts文件中添加管理主机的IP地址列表: 配置管理主机 4.2、配置控制主机SSH密钥 4.2.1、在控制主机中生成ssh密钥对 ssh-keygen -t rsa 一路回车即可在$HOME/.ssh目录下生成id_rsa和id_rsa.put私钥和公钥两个文件。 注: 如果在生成密钥的时候设置了密码,ansible每次执行命令的时候,都会提示输入密钥密码,可通过下面的命令记住密码。 ssh-agent bsh ssh-add ~/.ssh/id_rsa 4.2.2、将公钥拷贝到管理主机中.ssh/authorized_keys文件中,实现免密码登录远程管理主机 ssh-copy-id -i ~/.ssh/id_rsa.pub root@192.168.0.200 ssh-copy-id -i ~/.ssh/id_rsa.pub root@192.168.0.201 ssh-copy-id -i ~/.ssh/id_rsa.pub root@192.168.0.203 注:ssh-copy-id命令会自动将id_rsa.pub文件的内容追加到远程主机root用户下.ssh/authorized_keys文件中。 4.2.3、ansible配置 vim /etc/ansible/ansible.cfg 1> 禁用每次执行ansbile命令检查ssh key host host_key_checking = False 2> 开启日志记录 log_path = /var/log/ansible.log 3> ansible连接加速配置 [accelerate] #accelerate_port = 5099 accelerate_port = 10000 #accelerate_timeout = 30 #accelerate_connect_timeout = 5.0 # If set to yes, accelerate_multi_key will allow multiple # private keys to be uploaded to it, though each user must # have access to the system via SSH to add a new key. The default # is "no". accelerate_multi_key = yes 五、测试 最后测试下在三台管理机器批量执行一个ping命令 ansible all -m ping 结果如下: ansible all -m ping运行结果 从上图可以看出,在每台管理机器上都成功执行了ping命令。 一些Ansible深入功能的学习资料: http://blog.xiaorui.cc/category/ansible/ http://lixcto.blog.51cto.com/4834175/d-4 https://github.com/ansible/ansible-examples http://rfyiamcool.blog.51cto.com/1030776/d-51 http://dl528888.blog.51cto.com/2382721/d-4/p-1 http://edu.51cto.com/course/course_id-2220.html http://edu.51cto.com/course/course_id-2032.html
ansible 配置文件 ansible 配置文件/etc/ansible/ansible.cfg (一般保持不变) [defaults] #inventory = /etc/ansible/hosts #主机列表配置文件 #library = /usr/share/my_modules/ #库文件放目录 #remote_tmp = $HOME/.ansible/tmp # 临时py命令文件存放的远程主机目录 #local_tmp = $HOME/.ansible/tmp # 本机的临时命令执行目录 #forks = 5 # 默认并发数 #sudo_user = root # 默认sudo 用户 #ask_sudo_pass = True #每次执行ansible命令是否询问ssh密码 #ask_pass = True #remote_port = 22 #host_key_checking = False # 检查对应服务器的host_key, 建议取消注释 #log_path = /var/log/ansible.log #日志文件 建议取消注释 Ansible ansible通过ssh实现配置管理、应用部署、任务执行等功能,建议配置ansible端能基于密钥认证的方式联系各被管理节点 ansible <host-pattern> [-m module_name] [-a args] -=-version 显示版本 -m module 指定模块,默认为command -v 详细过程 -vv -vvv更详细 --list-hosts 显示主机列表,可简写为--list -k, --ask-pass 提示输入ssh链接密码,默认key验证 -K, --ask-become-pass 提示输入sudo时的口令 -C, --check 检查,并不执行 -T, --timeout=TIMEOUT 执行命令的超时时间,默认为10s -u, --user=REMOTE_USER 执行远程执行的用户 -b, --become 代替旧版的sudo切换 Ansible的Host- 逻辑与 ansible "websrvs:&dbsrvs" -m ping 在websrvs组并且在dbsrvs组的主机 逻辑非 ansible 'websrvs:!dbsrvs' -m ping 在websrvs组但是不在dbsrvs组中的主机 注意:此处为单引号 综合逻辑 ansible 'websrvs:dbsrvs:&appsrvs:!ftpsrvs' -m ping 正则表达式 ansible "websrvs:&dbsrvs" -m ping ansible "~(web|db).*\.magedu\.com" -m ping Ansible命令执行过程 ansible命令执行过程 加载自己的配置文件默认/etc/ansible/ansible.cfg 加载自己对应的模块文件,如command 通过ansible将模块或命令生成对应的临时py文件,并将该文件传输至远程服务器的对应执行用户$HOME/.ansible/tmp/ansible-tmp-数字/xxx.py文件 给文件+x执行 执行返回结果 删除临时py文件,sleep 0退出 执行状态: 绿色:执行成功并且不需要做改变的操作 黄色:执行成功并且对目标主机做变更 红色:执行失败 Ansible常用模块 Command:在远程主机执行命令,默认模块,可忽略-m选项 ansible websrvs -m command -a 'service vsftpd start' ansible websrvs -m command -a 'echo magedu | passwd --stdin wang'不成功 此命令不支持$VARNAME <> | ; &等,用shell模块实现 Shell:和command相似,用shell执行命令 ansible websrvs -m shell -a 'echo magedu | passwd --stdin wang' 调用bash执行命令 类似cat /tmp/stanley.md | awk -F'|' '{print $1,$2}' &> /tmp/example.txt 这些复杂命令,即使使用shell也可能会失败,解决办法:写脚本时,copy到远程,执行,再把需要的结果拉回来执行命令的机器 script:运行脚本 -a "/PATH/TO/SCRIPT_FILE" ansible websrvs -m script -a f1.sh Hostname:管理主机名 ansible node1 -m hostname -a "name=websrv" Cron:计划任务 支持时间:minute,hour, day, month, weekday ansible srv -m cron -a 'minute=*/5 job='/usr/sbin/ntpdate 172.16.0.1 &>/dev/null' name=synctime''创建任务 ansible srv -m cron -a 'state=absent name=synctime‘ 删除任务 Yum:管理包 ansible srv -m yum -a 'name=httpd state=latest' 安装 ansible srv -m yum -a 'name=httpd state=absent' 删除 Copy:从服务器复制文件到客户端 ansible srv -m copy -a "src=/root/f1.sh dest=/tmp/f2.sh owner=wang mode=600 backup=yes" 如目标存在,默认覆盖,此处指定先备份 ansible srv -m copy -a "content='test content\n' dest=/tmp/f1.txt" 利用内容,直接生成目标文件 Fetch:从客户端取文件到服务端,copy相反,目录可先tar ansible srv -m fetch -a 'src=/root/a.sh dest=/data/scripts' File:设置文件属性 ansible srv -m file -a 'path=/root/a.sh owner=wang mode=755' ansible web -m file -a 'src=/app/testfile dest=/app/testfile-link state=link' service:管理服务 ansible srv -m service -a 'name=httpd state=stopped' ansible srv -m service -a 'name=httpd state=started' ansible srv -m service -a 'name=httpd state=reloaded' ansible srv -m service -a 'name=httpd state=restart' User:管理用户 ansible srv -m user -a 'name=user1 comment="test user" uid=2048 home=/app/user1 group=root' ansible srv -m user -a 'name=sysuser1 system=yes home=/app/sysuser1' ansible srv -m user -a 'name=user1 state=absent remove=yes' 删除用户及家目录 Group:管理组 ansible srv -m group -a 'name=testgroup system=yes' ansible srv -m group -a 'name=testgroup state=absent' Ansible系列命令 Ansible系列命令 ansible ansible-doc ansible-playbook ansible-vault ansible-console ansible-galaxy ansible-pull Ansible显示模块帮助 ansible-doc [options] [module...] -a 显示所有模块的文档 -l, --list 列出可用的模块 -s, --snippet 显示模块的playbook片段 显示: ansible-doc -l 列出所有模块 ansible-cod ping 查看指定模块帮助用法 ansible-doc -s ping 查看指定模块帮助用法 Ansible系列命令 ansible-galaxy 链接https://galaxy.ansible.com下载相应的roles 列出所有已安装的galaxy ansible-galaxy list 安装galaxy ansible-galaxy install geerlingguy.redis 删除galaxy ansible-galaxy remove geerlingguy.redis Ansible系列命令 ansible-pull 推送命令至远程,效率无线提升,对运维要求较高 Ansible-playbook ansible-playbook hello.yml cat hello.yam #hello world ymnl fille - hosts:websrvs remote_user:root tasks: - name:hello world command:/usr/bin/wall hello world