ansible简介 本文共有5840个字,关键词: 使用python开发,以playbook作为基础部署架构 特点:仅依靠SSH协议通讯就可以完成全平台,无需编译,模块化的部署管理 作用:推送playbook进行远程节点快速部署 ansible与chef/saltstack的不同: chef: 使用ruby 语言编写,C/S架构,配置需要git依赖(实现版本控制功能) pipline脚本编写规范,需要编程经验 saltstack: 使用python语言编写,C/S架构,模块化配置管理 YAML脚本编写规范,适合大规模集群部署 (含有异步文件服务器,为客户端加快文件服务速度) ansible: python语言编写,无client,模块化配置管理 playbook脚本编写规范,易于上手,适合中小规模快速部署 优势: 1. 轻量级无客户端(agentless),SSH连接,无形中减少了客户端资源的占用,安全问题。 2. 开源免费,学习成本低,快速上手 3. 使用playbook作为核心的配置架构,统一的脚本格式批量户部署 4. 完善的模块化扩展,支持目前主流的开发场景 5. 强大的稳定性和兼容性 6. 活跃的官方社区问题讨论,方便Troubleshooting与DEBUG问题 在部署ansible环境时,避免python模块的冲突,保证部署的模块只会应用于ansible,而不会影响到其他工具的使用,将ansible与其他系统工具隔离开,使用python内置的virtualenv命令隔离python3.6语言环境,单独划分一个环境给ansible使用 ansible的部署: yum包管理安装 ansible成为系统全局下的工具,系统下任意的用户都可以使用,但是如果当前系统下的其他用户安装了其他的python模块,这里就会与ansible下的模块造成潜在的冲突。 因为在全局状态下,Python的模块安装后都会保存在Python的同一个Python扩展目录下,当ansible用到的模块与其他工具用到的模块一致时,但是调用模块的版本不同,这样势必会造成Python模块的管理混乱,最终影响产品部署交付。 我们可以clone ansible的源码至主机中,配合virtualenv实现ansible特定版本独立环境的创建,保证ansible在一个独立的python环境下运行。 ansible2.5+Python3.6部署: ``` 1. 安装python3.6版本,以及pip3 ~]# wget http://www.python.org/ftp/python/3.6.5/python-3.6.5.tar.xz ~]# tar -xvf python-3.6.5.tar.xz ~]# cd python-3.6.5 ~]# ./configure --prefix=/usr/local/ --with-ensurepip=install --enable-shared LDFLAGS=”-wi,-rpath /usr/local/lib” --prefix=/usr/local/ #指定安装目录 --with-ensurepip=install #安装pip包管理工具 --enable-shared LDFLAGS=”-wi,-rpath /usr/local/lib” #用来配置python3.6匹配当前系统的参数值 ~]# make ~]# make altinstall #~]# make && make altinstall #需要root权限执行 ~]# whitch pip3.6 ~]# ln -s /usr/local/bin/pip3.6 /usr/local/bin/pip #给pip3.6做软链接 2. 安装virtualenv,用于隔离python与ansible环境 ~]# pip install virtualenv 3. 创建ansible账户病安装python3.6版本env实例 ~]# useradd deploy && su - deploy #创建一个名为.py3-a2.5-env的实例目录 ~]# virtualenv -p /usr/local/bin/python3 .py3-a2.5-env 4. git源代码安装ansible2.5 #安装git环境及依赖 ~]# yum -y install git nss curl ~]# cd /home/deploy/.py3-a2.5-env ~]# git clone https://github.com/ansible/ansible.git ~]# cd ansible && git checkout stable-2.5 5. 加载python3.6 virtualenv环境 ~]# source /home/deploy/.py3-a2.5-env/bin/activate 6. 安装ansible依赖包 ~]# pip install paramiko pyYAML jinjia2 7. 在python3.6环境下加载ansible2.5(虚拟环境) ~]# source /home/deploy/.py3-a2.5-env/ansible/hacking/env-setup -q 8. 验证ansible2.5 ~]# ansible --version ``` ansible playbook入门和编写规范 playbooks表层目录结构: inventory/ testenv roles/ testbox/ tasks/ main.yml deploy.yml ``` 1. inventory/ #存放一个或多个server清单,用来保存目标部署主机的相关域名或者IP地址,以及该主机的变量参数。 #通常可以使用具体部署环境的名称给server清单进行命名,如devlop开发环境、UAT测试环境、production生产环境,对应保存在清单下的主机地址具体部署到哪个环境当中。 testenv文件结构: [testservers] #server组标列表标签,可以保存一个或者多个目标主机(IP或域名) test.example.com #目标部署服务器主机名 [testserver:vars] #server组列表参数(变量) #目标主机key:value键值对参数作为server组的变量声明 server_name=test.example.com user=root output=/root/test.txt 2. roles/ #用来保存我们需要部署的详细任务列表,可以存放一个或多个role,通常会命名为项目名称。 tasks/ #用于保存项目的主任务文件:main.yml main.yml任务文件 #文件位于roles目录下的项目目录下的tasks目录中,用来保存特定role下面要执行的具体任务乐章,文件中会有一个或多个task作为音符 #task一般由两部分组成 - name: print server name and user to remote testbox #任务名称,用于识别不同的task的作用 shell: “echo Currently {{user}} is logining {{server_name}} >{{output}}” #具体要执行的任务,通常会调用ansible内建的模块来编排我们的任务逻辑,此处调用的是inventory中定义的键值对参数。 3. deploy.yml #playbooks任务入口文件,它将调度我们roles/下需要去部署的项目,以及该项目下所有的任务,最终将任务部署到我们在inventory/中定义的目标主机中。 #核心文件,用来直接和ansible playbook命令直接对话,它将playbook下的编排内容展示给ansible命令,进行最终的演奏,将项目部署到对应的目标主机当中。 - hosts: "testserver" #调用对应server列表中的主机,inventory/testenv文件中的server组标签 gather_facts: ture #获取server基本信息 remote_user: root #目标服务器系统用户指定 roles: -testbox #指定roles/下的任务目录进行任务执行 ``` SSH免密认证 ``` 1. ansible服务器端创建SSH本地秘钥 ~]# ssh-keygen -t rsa #在本地创建rsa格式的公钥与私钥 2. ansible服务器端建立与目标部署机器的秘钥认证 ~]# ssh-copy-id -i /home/deploy/.ssh/id_rsa.pub root@test.example.com #将公钥传输到目标机器,实现ansible服务器端免密访问目标服务器 ``` 执行playbooks,将对应项目进行部署 ``` ~]# ansible-playbook -i inventory/testenv ./deploy.yml playbooks执行结果字段含义: PLAY RECAP #playbooks执行总结 主机名:test.example.com ok=2 #成功执行2个task changed=1 #有一个task有变动,对目标主机进行了修改 unreachable=0 #无法到达的主机数为0 filed=0 #语法结构没有错误 ``` ansible常用的模块: ``` file模块:在目录主机创建文件或目录,并赋予其系统权限 - name: create a file file: 'path=/root/foo.txt state=touch mode=0755 owner=foo group=foo’ #任务 copy模块:实现ansible服务端到目录主机的文件传递 - name copy a file copy: 'remote_src=no src=roles/testbox/files/foo.sh dest=/root/foo.sh mode=0664 force=yes’ remote_src=no #声明将ansible主机的文件传送到目标主机中 src=roles/testbox/files/foo.sh #源文件路径 dest=/root/foo.sh #目标路径 mode=0664 #指定目标主机copy的文件权限 force=yes #强制执行,同名覆盖 stat模块:用于获取远程文件状态信息,并将其信息保存在一个环境变量下供随后使用。 - name: check if foo.sh exists stat: 'path=/root/foo.sh’ register: script_stat Debug模块:打印到ansible执行输出,与stat结合使用 - debug: msg='foo.sh exists' #输出内容为:foo.sh exists when: script_stat.stat.exists #判断语句 command/shell模块:用来执行Linux目标主机命令,推荐使用shell模块 #shell环境会调用Linux环境下的/bin/bash,因此可以使用系统变量,重定向符、管道符等 #command不能使用特殊的用法 - name: run the script command: "sh /root/foo.sh" #执行目标主机上的指定目录下的脚本 - name: run the script shell: "echo 'test' > /root/test.txt" template模块:实现ansible服务端到目标主机jinja2模板传送 - name: write the nginx config file template: src=roles/testbox/templates/nginx.conf.j2 dest=/etc/nginx/nginx.conf Packaging模块:调用目标主机系统包管理工具(yum|apt)进行安装 - name: ensure nginx is at the latest version yum: pkg=nginx state=latest #CentOS|RedHat pkg=nginx #指定安装包的名称 state=latest #保证为最新的版本 - name: ensure nginx is at the latest version apt: pkg=nginx state=latest #Debian|Ubuntu service模块:管理目标主机系统服务,调用service或systemctl - name: start nginx service service: name=nginx state=started ``` 「一键投喂 软糖/蛋糕/布丁/牛奶/冰阔乐!」 赞赏 × 几人行 (๑>ڡ<)☆谢谢老板~ 2元 5元 10元 50元 100元 任意金额 2元 使用微信扫描二维码完成支付 版权声明:本文为作者原创,如需转载须联系作者本人同意,未经作者本人同意不得擅自转载。 Ansible 2019-05-04 评论 2595 次浏览