<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Ansible on F嘉阳</title><link>https://blog.fjy8018.top/tags/ansible/</link><description>Recent content in Ansible on F嘉阳</description><generator>Hugo -- gohugo.io</generator><language>zh-cn</language><lastBuildDate>Thu, 07 Sep 2023 17:16:51 +0800</lastBuildDate><atom:link href="https://blog.fjy8018.top/tags/ansible/index.xml" rel="self" type="application/rss+xml"/><item><title>DevOps实践心得一</title><link>https://blog.fjy8018.top/archives/213/</link><pubDate>Fri, 16 Aug 2019 19:32:00 +0800</pubDate><guid>https://blog.fjy8018.top/archives/213/</guid><description>&lt;h2 id="初遇devops"&gt;&lt;a href="#%e5%88%9d%e9%81%87devops" class="header-anchor"&gt;&lt;/a&gt;初遇DevOps&#10;&lt;/h2&gt;&lt;p&gt;最早接触到&lt;code&gt;DevOps&lt;/code&gt;是在2018年8月26日，那时首先接触到的就是大名鼎鼎的&lt;code&gt;Jenkins&lt;/code&gt;，当时看了多篇关于持续集成和持续部署的文章，蠢蠢欲动，便开始了第一套&lt;code&gt;DevOps&lt;/code&gt;环境的搭建&lt;/p&gt;&#10;&lt;h2 id="jenkins"&gt;&lt;a href="#jenkins" class="header-anchor"&gt;&lt;/a&gt;Jenkins&#10;&lt;/h2&gt;&lt;p&gt;第一套&lt;code&gt;DevOps&lt;/code&gt;是用&lt;code&gt;Jenkins&lt;/code&gt;+&lt;code&gt;Ansible&lt;/code&gt;+&lt;code&gt;GitLab&lt;/code&gt;搭建的，那时只是了解Docker的好处，并没有使用Docker搭建整套环境，还是基于传统虚拟服务器搭建的整套流程。&lt;/p&gt;&#10;&lt;p&gt;&lt;code&gt;Jenkins&lt;/code&gt;不仅可以编写&lt;code&gt;groove&lt;/code&gt;脚本、pipeline 流水线等，还能与&lt;code&gt;maven&lt;/code&gt;集成自动构建，深深感受到了&lt;code&gt;Jenkins&lt;/code&gt;的强大，同时大量的用户为其贡献了许多插件，有很多实践问题都可以在网上搜索到解决方案&lt;/p&gt;&#10;&lt;p&gt;搭建过程：&lt;/p&gt;&#10;&lt;p&gt;&lt;a class="link" href="https://blog.fjy8018.top/archives/176/" &gt;相关文章&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;a class="link" href="https://blog.fjy8018.top/archives/175/" &gt;相关文章&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;a class="link" href="https://blog.fjy8018.top/archives/177/" &gt;相关文章&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;a class="link" href="https://blog.fjy8018.top/archives/179/" &gt;相关文章&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;a class="link" href="https://blog.fjy8018.top/archives/178/" &gt;相关文章&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;a class="link" href="https://blog.fjy8018.top/archives/180/" &gt;相关文章&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;最后顺利实现了静态网站持续集成、持续部署，详见：&#10;&lt;a class="link" href="https://blog.fjy8018.top/archives/181/" &gt;相关文章&lt;/a&gt;&lt;/p&gt;&#10;&lt;h2 id="dockergitlab"&gt;&lt;a href="#dockergitlab" class="header-anchor"&gt;&lt;/a&gt;Docker+GitLab&#10;&lt;/h2&gt;&lt;p&gt;随着容器化技术在国内越来越流行，容器普及度越来越高，其带来的环境隔离极大推动了&lt;code&gt;DevOps&lt;/code&gt;的落地，使得无需使用&lt;code&gt;python&lt;/code&gt;环境隔离，可以直接利用容器技术实现跨平台和环境隔离，并且利于迁移和部署&lt;/p&gt;&#10;&lt;p&gt;于是在2019年4月开始研究&lt;code&gt;GitLab&lt;/code&gt;官方文档，发现其早已原生支持流水线，并依托其&lt;code&gt;GitLab-runner&lt;/code&gt;可以直接实现整套&lt;code&gt;DevOps&lt;/code&gt;环境&lt;/p&gt;&#10;&lt;p&gt;因此，经过不断摸索，完整的搭建的基于&lt;code&gt;Docker&lt;/code&gt;和&lt;code&gt;GitLab&lt;/code&gt;的&lt;code&gt;DevOps&lt;/code&gt;环境，搭建过程见：&lt;/p&gt;&#10;&lt;p&gt;&lt;a class="link" href="https://blog.fjy8018.top/archives/205/" &gt;相关文章&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;a class="link" href="https://blog.fjy8018.top/archives/206/" &gt;相关文章&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;a class="link" href="https://blog.fjy8018.top/archives/207/" &gt;相关文章&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;由于国内当时对&lt;code&gt;GitLab&lt;/code&gt;流水线使用的并不多，因此遇到的很多坑都需要翻查官方文档和国外的实践记录，比如：&lt;/p&gt;&#10;&lt;p&gt;&lt;a class="link" href="https://blog.fjy8018.top/archives/208/" &gt;相关文章&lt;/a&gt;&lt;/p&gt;&#10;&lt;h2 id="devops-带来的好处"&gt;&lt;a href="#devops-%e5%b8%a6%e6%9d%a5%e7%9a%84%e5%a5%bd%e5%a4%84" class="header-anchor"&gt;&lt;/a&gt;DevOps 带来的好处&#10;&lt;/h2&gt;&lt;p&gt;2019年7月将手上的一个小型项目尝试使用完整的&lt;code&gt;DevOps&lt;/code&gt;流程开发，开发小组选择敏捷开发方法，所有的开发工具都尽量的适应快速的需求变化，同时投入非常少量的开发人员，分工明确，从一开始一周发布一次到最后一天可以发布多次&lt;/p&gt;&#10;&lt;p&gt;&lt;img class="gallery-image" data-flex-basis="373px" data-flex-grow="155" height="853" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://gitea.fjy8018.top/fjy8018/images/raw/branch/blog/img/1565881026961.png" width="1328"&gt;&lt;/p&gt;&#10;&lt;p&gt;开发人员已经完全从运维中脱离，全团队没有专门的运维人员，极大的提高了开发效率，精简了人员构成，一旦构建失败，开发人员可以根据邮件通知的内容排查上线失败问题，调整代码和配置后重新提交&lt;/p&gt;&#10;&lt;p&gt;&lt;img class="gallery-image" data-flex-basis="329px" data-flex-grow="137" height="954" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://gitea.fjy8018.top/fjy8018/images/raw/branch/blog/img/1565881202626.png" width="1310"&gt;&lt;/p&gt;&#10;&lt;p&gt;面板提供了流水线统计图，如果出现频繁的失败还是需要人工介入，查看问题原因&lt;/p&gt;&#10;&lt;p&gt;&lt;img class="gallery-image" data-flex-basis="470px" data-flex-grow="196" height="680" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://gitea.fjy8018.top/fjy8018/images/raw/branch/blog/img/1565881072564.png" width="1334"&gt;&lt;/p&gt;&#10;&lt;h2 id="当前的问题"&gt;&lt;a href="#%e5%bd%93%e5%89%8d%e7%9a%84%e9%97%ae%e9%a2%98" class="header-anchor"&gt;&lt;/a&gt;当前的问题&#10;&lt;/h2&gt;&lt;p&gt;尽管使用了基于&lt;code&gt;Docker&lt;/code&gt;+&lt;code&gt;GitLab&lt;/code&gt;的流水线实现了完整的&lt;code&gt;DevOps&lt;/code&gt;流程，但对于监控和日志部分仍然处在很多问题&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;尽管上线的是单体应用，服务器和应用的健康状态都无法得知，也没有相应的告警&lt;/li&gt;&#10;&lt;li&gt;应用的日志没有被外部服务收集，无法进行快速分析&lt;/li&gt;&#10;&lt;li&gt;没有实现完整的测试流程，生成测试覆盖率报告等&lt;/li&gt;&#10;&lt;li&gt;没有实现0停机上线，在容器切换时仍需停机1-2分钟&lt;/li&gt;&#10;&lt;li&gt;没有实现灰度上线、蓝绿部署等，上线失败需要手动回滚&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="未来探索方向"&gt;&lt;a href="#%e6%9c%aa%e6%9d%a5%e6%8e%a2%e7%b4%a2%e6%96%b9%e5%90%91" class="header-anchor"&gt;&lt;/a&gt;未来探索方向&#10;&lt;/h2&gt;&lt;ul&gt;&#10;&lt;li&gt;全面容器化服务治理方向&#10;&lt;ul&gt;&#10;&lt;li&gt;国内对容器化有非常多的实践&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;kubernetes&lt;/code&gt;作为容器调度成为大多数服务治理的选择&lt;/li&gt;&#10;&lt;li&gt;容器隔离、迁移和伸缩带来的巨大优势&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;容器与传统应用部署结合方式&#10;&lt;ul&gt;&#10;&lt;li&gt;以半全自动方式落地&lt;code&gt;DevOps&lt;/code&gt;，采用&lt;code&gt;Mesos&lt;/code&gt;+&lt;code&gt;marathon&lt;/code&gt;方式同时兼容传统服务部署和容器化部署&lt;/li&gt;&#10;&lt;li&gt;兼容分布式服务治理&lt;/li&gt;&#10;&lt;li&gt;国外有大量的实践案例&lt;/li&gt;&#10;&lt;li&gt;日志收集体系完备&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;</description></item><item><title>Jenkins+GitLab+Ansible实现静态网站自动部署</title><link>https://blog.fjy8018.top/archives/181/</link><pubDate>Sat, 01 Sep 2018 12:45:00 +0800</pubDate><guid>https://blog.fjy8018.top/archives/181/</guid><description>&lt;h2 id="环境准备"&gt;&lt;a href="#%e7%8e%af%e5%a2%83%e5%87%86%e5%a4%87" class="header-anchor"&gt;&lt;/a&gt;环境准备&#10;&lt;/h2&gt;&lt;p&gt;参考前几篇文章配置后实现以下环境&lt;/p&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;部署好Jenkins服务器一台(192.168.163.133),并在Jenkins服务器上部署ansible，且与目标主机(192.168.163.132)做了免密登录&lt;/li&gt;&#10;&lt;li&gt;可以访问的GitLab服务器一台，并注册了Jenkins相关账号且在Jenkins系统设置中配置完毕&lt;/li&gt;&#10;&lt;li&gt;一台工作环境主机，用于代码编写，该主机可以通过域名访问目标主机(192.168.163.132)&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;h2 id="编写ansible-playbook"&gt;&lt;a href="#%e7%bc%96%e5%86%99ansible-playbook" class="header-anchor"&gt;&lt;/a&gt;编写ansible playbook&#10;&lt;/h2&gt;&lt;h3 id="搭建基础工程目录结构"&gt;&lt;a href="#%e6%90%ad%e5%bb%ba%e5%9f%ba%e7%a1%80%e5%b7%a5%e7%a8%8b%e7%9b%ae%e5%bd%95%e7%bb%93%e6%9e%84" class="header-anchor"&gt;&lt;/a&gt;搭建基础工程目录结构&#10;&lt;/h3&gt;&lt;p&gt;从仓库下载之前编写的ansible工程目录结构&#10;&lt;a class="link" href="https://i.loli.net/2018/09/01/5b8a1bb810a25.png" target="_blank" rel="noopener"&#10; &gt;&lt;img alt="Jenkins_ansible1.png" class="gallery-image" data-flex-basis="1345px" data-flex-grow="560" height="94" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://i.loli.net/2018/09/01/5b8a1bb810a25.png" width="527"&gt;&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;若没有也可自行创建，最终文件目录结构如下&lt;/p&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code&gt;└─ansible-playbook-repo&#10; │ deploy.yml&#10; │&#10; ├─inventory&#10; │ dev&#10; │ prod&#10; │&#10; └─roles&#10; └─nginx&#10; ├─files&#10; │ │ health_check.sh&#10; │ │ index.html&#10; │ │&#10; │ └─website&#10; │&#10; ├─tasks&#10; │ main.yml&#10; │&#10; └─templates&#10; nginx.conf.j2&#10;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;a class="link" href="https://i.loli.net/2018/09/01/5b8a1bb8103d2.png" target="_blank" rel="noopener"&#10; &gt;&lt;img alt="Jenkins_ansible2.png" class="gallery-image" data-flex-basis="866px" data-flex-grow="360" height="105" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://i.loli.net/2018/09/01/5b8a1bb8103d2.png" width="379"&gt;&lt;/a&gt;&lt;/p&gt;&#10;&lt;h3 id="文件编写"&gt;&lt;a href="#%e6%96%87%e4%bb%b6%e7%bc%96%e5%86%99" class="header-anchor"&gt;&lt;/a&gt;文件编写&#10;&lt;/h3&gt;&lt;p&gt;工程入口&lt;code&gt;deploy.yml&lt;/code&gt;编写&lt;/p&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code&gt;- hosts: &amp;#34;nginx&amp;#34;&#10; gather_facts: true&#10; remote_user: root&#10; roles:&#10; - nginx&#10;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;编写开发环境配置文件&lt;code&gt;inventory/dev&lt;/code&gt;，此处dev与prod配置一致，若实际需求可自行修改，用于最后jenkins参数化构建的选项&#10;&lt;code&gt;inventory/dev&lt;/code&gt;文件内容&lt;/p&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code&gt;[nginx]&#10;test.fjy8018.top&#10;&#10;[nginx:vars]&#10;server_name=test.fjy8018.top&#10;port=80&#10;user=ansible&#10;worker_processes=4&#10;max_open_file=65505&#10;root=/www&#10;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;code&gt;inventory/prod&lt;/code&gt;文件内容&lt;/p&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code&gt;[nginx]&#10;test.fjy8018.top&#10;&#10;[nginx:vars]&#10;server_name=test.fjy8018.top&#10;port=80&#10;user=ansible&#10;worker_processes=4&#10;max_open_file=65505&#10;root=/www&#10;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;编写健康检查shell脚本&lt;code&gt;health_check.sh&lt;/code&gt;&#10;&lt;code&gt;roles/nginx/files/health_check.sh&lt;/code&gt;文件内容&lt;/p&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code&gt;#!/bin/bash&#10;&#10;# 接受命令行参数&#10;URL=$1&#10;&#10;# 访问目标地址，判断是否能正常访问并输出&#10;curl -Is http://$URL &amp;gt; /dev/null &amp;amp;&amp;amp; echo &amp;#34;远程主机状态正常&amp;#34; || echo &amp;#34;远程主机已停止&amp;#34;&#10;&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="添加静态网站文件"&gt;&lt;a href="#%e6%b7%bb%e5%8a%a0%e9%9d%99%e6%80%81%e7%bd%91%e7%ab%99%e6%96%87%e4%bb%b6" class="header-anchor"&gt;&lt;/a&gt;添加静态网站文件&#10;&lt;/h3&gt;&lt;p&gt;&lt;code&gt;/roles/nginx/files/website&lt;/code&gt;为静态网页模板目录，里面存放从网上下载的静态网站模板&#10;配置nginx指向该资源&#10;&lt;code&gt;/roles/nginx/templates/nginx.conf.j2&lt;/code&gt;文件内容&lt;/p&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code&gt;# For more information on configuration, see: &#10;user {{ user }}; &#10;worker_processes {{ worker_processes }}; &#10; &#10;error_log /var/log/nginx/error.log; &#10; &#10;pid /var/run/nginx.pid; &#10; &#10;events { &#10; worker_connections {{ max_open_file }}; &#10;} &#10; &#10; &#10;http { &#10; include /etc/nginx/mime.types; &#10; default_type application/octet-stream; &#10; &#10; log_format main &amp;#39;$remote_addr - $remote_user [$time_local] &amp;#34;$request&amp;#34; &amp;#39; &#10; &amp;#39;$status $body_bytes_sent &amp;#34;$http_referer&amp;#34; &amp;#39; &#10; &amp;#39;&amp;#34;$http_user_agent&amp;#34; &amp;#34;$http_x_forwarded_for&amp;#34;&amp;#39;; &#10; &#10; access_log /var/log/nginx/access.log main; &#10; &#10; sendfile on; &#10; #tcp_nopush on; &#10; &#10; #keepalive_timeout 0; &#10; keepalive_timeout 65; &#10; &#10; #gzip on; &#10; &#10; # Load config files from the /etc/nginx/conf.d directory &#10; # The default server is in conf.d/default.conf &#10; #include /etc/nginx/conf.d/*.conf; &#10; server { &#10; listen {{ port }} default_server; &#10; server_name {{ server_name }}; &#10; &#10; #charset koi8-r; &#10; &#10; #access_log logs/host.access.log main; &#10; &#10; location / { &#10; root {{ root }}/website; &#10; index index.html index.htm; &#10; } &#10; &#10; error_page 404 /404.html; &#10; location = /404.html { &#10; root /usr/share/nginx/html; &#10; } &#10; &#10; # redirect server error pages to the static page /50x.html &#10; # &#10; error_page 500 502 503 504 /50x.html; &#10; location = /50x.html { &#10; root /usr/share/nginx/html; &#10; } &#10; &#10; } &#10; &#10;}&#10;&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="编写主任务文件"&gt;&lt;a href="#%e7%bc%96%e5%86%99%e4%b8%bb%e4%bb%bb%e5%8a%a1%e6%96%87%e4%bb%b6" class="header-anchor"&gt;&lt;/a&gt;编写主任务文件&#10;&lt;/h3&gt;&lt;p&gt;主任务文件&lt;code&gt;main.yml&lt;/code&gt;内容如下&lt;/p&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code&gt;- name: 关闭系统防火墙&#10; service: name=firewalld state=stopped&#10;&#10;- name: 关闭强制访问控制策略&#10; selinux: state=disabled&#10;&#10;- name: 设置yum源&#10; yum: pkg=epel-release state=latest&#10;&#10;- name: 写入nginx配置文件&#10; template: src=roles/nginx/templates/nginx.conf.j2 dest=/etc/nginx/nginx.conf&#10;&#10;- name: 创建nginx根目录文件夹&#10; file: &amp;#39;path={{ root }} state=directory owner={{ user }} group={{ user }} mode=0755&amp;#39;&#10;&#10;- name: 文件拷贝&#10; copy: &amp;#39;remote_src=no src=roles/nginx/files/website dest=/www/website owner={{ user }} mode=0755&amp;#39;&#10;&#10;- name: 启动nginx&#10; service: name=nginx state=restarted&#10;&#10;- name: 运行健康检查&#10; shell: &amp;#34;sh roles/nginx/files/health_check.sh {{ server_name }}&amp;#34;&#10; # 本地执行&#10; delegate_to: localhost&#10; # 参数传递&#10; register: health_status&#10;&#10;- debug: msg=&amp;#34;{{ health_status.stdout }}&amp;#34;&#10;&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="git提交"&gt;&lt;a href="#git%e6%8f%90%e4%ba%a4" class="header-anchor"&gt;&lt;/a&gt;Git提交&#10;&lt;/h3&gt;&lt;p&gt;提交变更到版本仓库GitLab&lt;/p&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code&gt;git add .&#10;git commit -m &amp;#34;添加模板文件&amp;#34;&#10;git push origin master&#10;&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="jenkins创建并执行"&gt;&lt;a href="#jenkins%e5%88%9b%e5%bb%ba%e5%b9%b6%e6%89%a7%e8%a1%8c" class="header-anchor"&gt;&lt;/a&gt;Jenkins创建并执行&#10;&lt;/h2&gt;&lt;p&gt;创建自由风格构建任务，添加参数化构建、添加选项参数和文本参数&#10;&lt;a class="link" href="https://i.loli.net/2018/09/01/5b8a1bb82714b.png" target="_blank" rel="noopener"&#10; &gt;&lt;img alt="Jenkins_ansible3.png" class="gallery-image" data-flex-basis="348px" data-flex-grow="145" height="939" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://i.loli.net/2018/09/01/5b8a1bb82714b.png" width="1362"&gt;&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;添加Git仓库地址和账号&#10;&lt;a class="link" href="https://i.loli.net/2018/09/01/5b8a1bb81b6dc.png" target="_blank" rel="noopener"&#10; &gt;&lt;img alt="Jenkins_ansible4.png" class="gallery-image" data-flex-basis="466px" data-flex-grow="194" height="572" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://i.loli.net/2018/09/01/5b8a1bb81b6dc.png" width="1113"&gt;&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;添加Shell构建，Shell内容为&lt;/p&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code&gt;#!/bin/bash&#10;# 关闭命令行扩展环境，避免环境参数日志干扰&#10;set +x&#10;# 加载虚拟环境&#10;source /home/deploy/.py3-a2.5-env/bin/activate&#10;# 加载ansible到当前用户目录&#10;source /home/deploy/.py3-a2.5-env/ansible/hacking/env-setup -q&#10;&#10;cd $WORKSPACE&#10;ls -a&#10;# 查看版本&#10;ansible --version&#10;ansible-playbook --version&#10;&#10;# 引入资源清单，测试远程命令&#10;ansible-playbook -i inventory/$deploy_env ./deploy.yml -e project=nginx -e branch=$branch -e env=$deploy_env&#10;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;a class="link" href="https://i.loli.net/2018/09/01/5b8a1bb819714.png" target="_blank" rel="noopener"&#10; &gt;&lt;img alt="Jenkins_ansible5.png" class="gallery-image" data-flex-basis="461px" data-flex-grow="192" height="558" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://i.loli.net/2018/09/01/5b8a1bb819714.png" width="1072"&gt;&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;保存并构建&lt;/p&gt;&#10;&lt;h2 id="结果"&gt;&lt;a href="#%e7%bb%93%e6%9e%9c" class="header-anchor"&gt;&lt;/a&gt;结果&#10;&lt;/h2&gt;&lt;h3 id="构建成功"&gt;&lt;a href="#%e6%9e%84%e5%bb%ba%e6%88%90%e5%8a%9f" class="header-anchor"&gt;&lt;/a&gt;构建成功&#10;&lt;/h3&gt;&lt;p&gt;&lt;a class="link" href="https://i.loli.net/2018/09/01/5b8a1bb8103a8.png" target="_blank" rel="noopener"&#10; &gt;&lt;img alt="Jenkins_ansible6.png" class="gallery-image" data-flex-basis="236px" data-flex-grow="98" height="855" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://i.loli.net/2018/09/01/5b8a1bb8103a8.png" width="842"&gt;&lt;/a&gt;&lt;/p&gt;&#10;&lt;h3 id="访问测试"&gt;&lt;a href="#%e8%ae%bf%e9%97%ae%e6%b5%8b%e8%af%95" class="header-anchor"&gt;&lt;/a&gt;访问测试&#10;&lt;/h3&gt;&lt;p&gt;在工作主机上访问目标地址+资源路径即可，访问通过&#10;&lt;a class="link" href="https://i.loli.net/2018/09/01/5b8a1bb8636ce.png" target="_blank" rel="noopener"&#10; &gt;&lt;img alt="Jenkins_ansible7.png" class="gallery-image" data-flex-basis="475px" data-flex-grow="198" height="716" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://i.loli.net/2018/09/01/5b8a1bb8636ce.png" width="1418"&gt;&lt;/a&gt;&lt;/p&gt;&#10;&lt;h3 id="后续构建"&gt;&lt;a href="#%e5%90%8e%e7%bb%ad%e6%9e%84%e5%bb%ba" class="header-anchor"&gt;&lt;/a&gt;后续构建&#10;&lt;/h3&gt;&lt;p&gt;后期只要在工作主机变更代码推送到git仓库，再到Jenkins的web界面点击参数化构建即可让Jenkins自动拉取最新分支并执行Ansible脚本&lt;/p&gt;&#10;</description></item><item><title>Ansible Playbook编写测试</title><link>https://blog.fjy8018.top/archives/177/</link><pubDate>Sat, 25 Aug 2018 16:19:00 +0800</pubDate><guid>https://blog.fjy8018.top/archives/177/</guid><description>&lt;h2 id="环境准备"&gt;&lt;a href="#%e7%8e%af%e5%a2%83%e5%87%86%e5%a4%87" class="header-anchor"&gt;&lt;/a&gt;环境准备&#10;&lt;/h2&gt;&lt;p&gt;两台CentOS 7虚拟机，主IP为192.168.163.128，并在主IP虚拟机上安装了ansible2.5版本，目标IP为192.168.163.132&lt;/p&gt;&#10;&lt;h2 id="ansible编写"&gt;&lt;a href="#ansible%e7%bc%96%e5%86%99" class="header-anchor"&gt;&lt;/a&gt;Ansible编写&#10;&lt;/h2&gt;&lt;p&gt;切换用户&lt;/p&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code&gt;[root@localhost ~]# su - ansible&#10;上一次登录：六 8月 18 20:12:23 CST 2018pts/0 上&#10;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;进入虚拟环境&lt;/p&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code&gt;[ansible@localhost ~]$ source .py3-a2.5-env/bin/activate&#10;(.py3-a2.5-env) [ansible@localhost ~]$&#10;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;加载ansible到当前用户目录&lt;/p&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code&gt;source .py3-a2.5-env/ansible/hacking/env-setup -q&#10;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;验证版本&lt;/p&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code&gt;(.py3-a2.5-env) [ansible@localhost ~]$ ansible-playbook --version&#10;ansible-playbook 2.5.8 (stable-2.5 b23b1c2ee0) last updated 2018/08/18 20:35:45 (GMT +800)&#10; config file = None&#10; configured module search path = [&amp;#39;/home/ansible/.ansible/plugins/modules&amp;#39;, &amp;#39;/usr/share/ansible/plugins/modules&amp;#39;]&#10; ansible python module location = /home/ansible/.py3-a2.5-env/ansible/lib/ansible&#10; executable location = /home/ansible/.py3-a2.5-env/ansible/bin/ansible-playbook&#10; python version = 3.7.0 (default, Aug 18 2018, 20:09:08) [GCC 4.8.5 20150623 (Red Hat 4.8.5-28)]&#10;(.py3-a2.5-env) [ansible@localhost ~]$ ll&#10;总用量 0&#10;(.py3-a2.5-env) [ansible@localhost ~]$ pwd&#10;/home/ansible&#10;&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="配置目标主机的秘钥认证"&gt;&lt;a href="#%e9%85%8d%e7%bd%ae%e7%9b%ae%e6%a0%87%e4%b8%bb%e6%9c%ba%e7%9a%84%e7%a7%98%e9%92%a5%e8%ae%a4%e8%af%81" class="header-anchor"&gt;&lt;/a&gt;配置目标主机的秘钥认证&#10;&lt;/h3&gt;&lt;pre tabindex="0"&gt;&lt;code&gt;(.py3-a2.5-env) [ansible@localhost ~]$ ssh-keygen -t rsa&#10;Generating public/private rsa key pair.&#10;Enter file in which to save the key (/home/ansible/.ssh/id_rsa): &#10;Created directory &amp;#39;/home/ansible/.ssh&amp;#39;.&#10;Enter passphrase (empty for no passphrase): &#10;Enter same passphrase again: &#10;Your identification has been saved in /home/ansible/.ssh/id_rsa.&#10;Your public key has been saved in /home/ansible/.ssh/id_rsa.pub.&#10;The key fingerprint is:&#10;SHA256:pXMJqz9DPkjt6nKws35NYoMQeUdfu4CGATw76tr9lJY ansible@localhost.localdomain&#10;The key&amp;#39;s randomart image is:&#10;+---[RSA 2048]----+&#10;| ..o... . |&#10;| = .o.o . . |&#10;| =..o + o |&#10;| + . * o |&#10;| . o . .S + |&#10;|. o =++o |&#10;|. =EX |&#10;| o .+o+.B |&#10;|o ..+O+..+ |&#10;+----[SHA256]-----+&#10;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;拷贝公钥&lt;/p&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code&gt;(.py3-a2.5-env) [ansible@localhost ~]$ ssh-copy-id -i /home/ansible/.ssh/id_rsa.pub root@test.fjy8018.top&#10;/bin/ssh-copy-id: INFO: Source of key(s) to be installed: &amp;#34;/home/ansible/.ssh/id_rsa.pub&amp;#34;&#10;The authenticity of host &amp;#39;test.fjy8018.top (192.168.163.132)&amp;#39; can&amp;#39;t be established.&#10;ECDSA key fingerprint is SHA256:3UEr3lx2jznmN3FL3SflViR05IZe6AWweb3TeSsfX0M.&#10;ECDSA key fingerprint is MD5:0f:31:c1:cc:54:69:7f:d8:8d:7c:8c:22:95:2e:03:4e.&#10;Are you sure you want to continue connecting (yes/no)? yes&#10;/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed&#10;/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys&#10;root@test.fjy8018.top&amp;#39;s password: &#10;&#10;Number of key(s) added: 1&#10;&#10;Now try logging into the machine, with: &amp;#34;ssh &amp;#39;root@test.fjy8018.top&amp;#39;&amp;#34;&#10;and check to make sure that only the key(s) you wanted were added.&#10;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;测试免密登录&lt;/p&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code&gt;(.py3-a2.5-env) [ansible@localhost ~]$ ssh root@test.fjy8018.top&#10;Last login: Sat Aug 25 11:27:35 2018 from 192.168.163.1&#10;[root@localhost ~]# exit&#10;登出&#10;Connection to test.fjy8018.top closed.&#10;&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="编写环境变量"&gt;&lt;a href="#%e7%bc%96%e5%86%99%e7%8e%af%e5%a2%83%e5%8f%98%e9%87%8f" class="header-anchor"&gt;&lt;/a&gt;编写环境变量&#10;&lt;/h3&gt;&lt;p&gt;预期的文件结构为&lt;/p&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code&gt;├── deploy.yml&#10;├── inventory&#10;│ └── testenv&#10;└── roles&#10; └── testbox&#10; └── tasks&#10; └── main.yml&#10;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;code&gt;deploy.yml&lt;/code&gt;为工程入口，&lt;code&gt;testenv&lt;/code&gt;为环境变量文件，&lt;code&gt;tasks&lt;/code&gt;为任务文件夹，其中的&lt;code&gt;main.yml&lt;/code&gt;为要执行的任务&#10;新建playbook工程目录，并根据ansible规范创建对应的文件夹&lt;/p&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code&gt;(.py3-a2.5-env) [ansible@localhost ~]$ mkdir test_playbook&#10;(.py3-a2.5-env) [ansible@localhost ~]$ cd test_playbook/&#10;(.py3-a2.5-env) [ansible@localhost test_playbook]$ mkdir inventory&#10;(.py3-a2.5-env) [ansible@localhost test_playbook]$ mkdir roles&#10;(.py3-a2.5-env) [ansible@localhost test_playbook]$ cd inventory/&#10;(.py3-a2.5-env) [ansible@localhost inventory]$ vi testenv&#10;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;code&gt;testenv&lt;/code&gt;文件内容如下&lt;/p&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code&gt;[testservers]&#10;test.fjy8018.top&#10;&#10;[testservers:vars]&#10;server_name=test.fjy8018.top&#10;user=root&#10;output=/root/test.txt&#10;&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="远程执行命令并加载环境变量的值"&gt;&lt;a href="#%e8%bf%9c%e7%a8%8b%e6%89%a7%e8%a1%8c%e5%91%bd%e4%bb%a4%e5%b9%b6%e5%8a%a0%e8%bd%bd%e7%8e%af%e5%a2%83%e5%8f%98%e9%87%8f%e7%9a%84%e5%80%bc" class="header-anchor"&gt;&lt;/a&gt;远程执行命令并加载环境变量的值&#10;&lt;/h3&gt;&lt;pre tabindex="0"&gt;&lt;code&gt;(.py3-a2.5-env) [ansible@localhost test_playbook]$ ll&#10;总用量 0&#10;drwxrwxr-x 2 ansible ansible 21 8月 18 20:49 inventory&#10;drwxrwxr-x 2 ansible ansible 6 8月 18 20:47 roles&#10;(.py3-a2.5-env) [ansible@localhost test_playbook]$ cd roles/&#10;(.py3-a2.5-env) [ansible@localhost roles]$ mkdir testbox&#10;(.py3-a2.5-env) [ansible@localhost roles]$ cd testbox/&#10;(.py3-a2.5-env) [ansible@localhost testbox]$ mkdir tasks&#10;(.py3-a2.5-env) [ansible@localhost testbox]$ cd tasks/&#10;(.py3-a2.5-env) [ansible@localhost tasks]$ vi main.yml&#10;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;code&gt;main.yml&lt;/code&gt;文件内容如下&lt;/p&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code&gt;- name: Print server name and user to remote testbox&#10; shell: &amp;#34;echo &amp;#39;Currently {{ user }} is loggining {{ server_name }} &amp;#39; &amp;gt; {{ output }} &amp;#34;&#10;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;编写工程入口文件&lt;/p&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code&gt;(.py3-a2.5-env) [ansible@localhost test_playbook]$ pwd&#10;/home/ansible/test_playbook&#10;(.py3-a2.5-env) [ansible@localhost test_playbook]$ ll&#10;总用量 0&#10;drwxrwxr-x 2 ansible ansible 21 8月 18 20:49 inventory&#10;drwxrwxr-x 3 ansible ansible 21 8月 18 20:51 roles&#10;(.py3-a2.5-env) [ansible@localhost test_playbook]$ vi deploy.yml&#10;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;code&gt;deploy.yml&lt;/code&gt;文件内容如下&lt;/p&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code&gt;# 调用testenv里的servers标签定义的目标主机&#10;- hosts: &amp;#34;testservers&amp;#34;&#10;# 用于获取目标主机的信息&#10; gather_facts: true&#10; # 使用root用户操作&#10; remote_user: root&#10; # 指定进入roles目录下的testbox任务文件执行任务&#10; roles:&#10; - testbox&#10;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;查看当前目录结构，符合预期&lt;/p&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code&gt;[ansible@localhost test_playbook]$ tree .&#10;.&#10;├── deploy.yml&#10;├── inventory&#10;│ └── testenv&#10;└── roles&#10; └── testbox&#10; └── tasks&#10; └── main.yml&#10;&#10;4 directories, 3 files&#10;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;执行任务&lt;/p&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code&gt;(.py3-a2.5-env) [ansible@localhost ~]$ cd test_playbook/&#10;(.py3-a2.5-env) [ansible@localhost test_playbook]$ ls&#10;deploy.yml inventory roles&#10;(.py3-a2.5-env) [ansible@localhost test_playbook]$ ansible-playbook -i inventory/testenv ./deploy.yml &#10;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;部署完成&#10;&lt;a class="link" href="https://gitea.fjy8018.top/fjy8018/images/raw/branch/blog/img/5b810d982d357.png" target="_blank" rel="noopener"&#10; &gt;&lt;img alt="ansible9.png" class="gallery-image" data-flex-basis="625px" data-flex-grow="260" height="292" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://gitea.fjy8018.top/fjy8018/images/raw/branch/blog/img/5b810d982d357.png" width="761"&gt;&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;登录目标主机查看&#10;&lt;a class="link" href="https://gitea.fjy8018.top/fjy8018/images/raw/branch/blog/img/5b810d982d3ec.png" target="_blank" rel="noopener"&#10; &gt;&lt;img alt="ansible10.png" class="gallery-image" data-flex-basis="570px" data-flex-grow="237" height="309" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://gitea.fjy8018.top/fjy8018/images/raw/branch/blog/img/5b810d982d3ec.png" width="735"&gt;&lt;/a&gt;&lt;/p&gt;&#10;&lt;h3 id="远程文件创建"&gt;&lt;a href="#%e8%bf%9c%e7%a8%8b%e6%96%87%e4%bb%b6%e5%88%9b%e5%bb%ba" class="header-anchor"&gt;&lt;/a&gt;远程文件创建&#10;&lt;/h3&gt;&lt;p&gt;编辑任务文件&lt;/p&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code&gt;(.py3-a2.5-env) [ansible@localhost test_playbook]$ vi roles/testbox/tasks/main.yml&#10;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;修改为在远程创建文件，指定路径并赋予权限为755，所有者为foo用户，属于foo用户组，故添加如下内容&lt;/p&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code&gt;- name: create a file&#10; file: &amp;#39;path=/root/foo.txt state=touch mode=0755 owner=foo group=foo&amp;#39;&#10;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;执行文件&#10;&lt;a class="link" href="https://gitea.fjy8018.top/fjy8018/images/raw/branch/blog/img/5b810d982c79f.png" target="_blank" rel="noopener"&#10; &gt;&lt;img alt="ansible11.png" class="gallery-image" data-flex-basis="701px" data-flex-grow="292" height="259" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://gitea.fjy8018.top/fjy8018/images/raw/branch/blog/img/5b810d982c79f.png" width="757"&gt;&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;执行成功，登录目标主机查看是否创建&#10;&lt;a class="link" href="https://gitea.fjy8018.top/fjy8018/images/raw/branch/blog/img/5b810d982b4a2.png" target="_blank" rel="noopener"&#10; &gt;&lt;img alt="ansible12.png" class="gallery-image" data-flex-basis="684px" data-flex-grow="285" height="163" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://gitea.fjy8018.top/fjy8018/images/raw/branch/blog/img/5b810d982b4a2.png" width="465"&gt;&lt;/a&gt;&lt;/p&gt;&#10;&lt;h3 id="远程文件拷贝"&gt;&lt;a href="#%e8%bf%9c%e7%a8%8b%e6%96%87%e4%bb%b6%e6%8b%b7%e8%b4%9d" class="header-anchor"&gt;&lt;/a&gt;远程文件拷贝&#10;&lt;/h3&gt;&lt;p&gt;新建存放文件目录&lt;/p&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code&gt;(.py3-a2.5-env) [ansible@localhost test_playbook]$ mkdir roles/testbox/files&#10;(.py3-a2.5-env) [ansible@localhost test_playbook]$ tree .&#10;.&#10;├── deploy.yml&#10;├── inventory&#10;│ └── testenv&#10;└── roles&#10; └── testbox&#10; ├── files&#10; └── tasks&#10; └── main.yml&#10;&#10;5 directories, 3 files&#10;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;新建目标文件&lt;code&gt;foo.sh&lt;/code&gt;&lt;/p&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code&gt;(.py3-a2.5-env) [ansible@localhost test_playbook]$ vi roles/testbox/files/foo.sh&#10;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;文件内容如下&lt;/p&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code&gt;echo &amp;#34;This is a test script for ansible&amp;#34;&#10;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;编辑任务文件&lt;/p&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code&gt;(.py3-a2.5-env) [ansible@localhost test_playbook]$ vi roles/testbox/tasks/main.yml&#10;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;remote_src=no定义为文件传输，并设置644权限，指定强制执行，故添加任务如下&lt;/p&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code&gt;- name: copy a file&#10; copy: &amp;#39;remote_src=no src=roles/testbox/files/foo.sh dest=/root/foo.sh mode=0644 force=yes&amp;#39;&#10;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;执行成功&#10;&lt;a class="link" href="https://gitea.fjy8018.top/fjy8018/images/raw/branch/blog/img/5b810d982d7ce.png" target="_blank" rel="noopener"&#10; &gt;&lt;img alt="ansible13.png" class="gallery-image" data-flex-basis="337px" data-flex-grow="140" height="539" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://gitea.fjy8018.top/fjy8018/images/raw/branch/blog/img/5b810d982d7ce.png" width="758"&gt;&lt;/a&gt;&lt;/p&gt;&#10;&lt;h3 id="判断文件是否存在"&gt;&lt;a href="#%e5%88%a4%e6%96%ad%e6%96%87%e4%bb%b6%e6%98%af%e5%90%a6%e5%ad%98%e5%9c%a8" class="header-anchor"&gt;&lt;/a&gt;判断文件是否存在&#10;&lt;/h3&gt;&lt;p&gt;在&lt;code&gt;roles/testbox/tasks/main.yml&lt;/code&gt;添加任务如下&lt;/p&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code&gt;# 任务名称&#10;- name: check if foo.sh exists&#10; stat: &amp;#39;path=/root/foo.sh&amp;#39;&#10; register: script_stat&#10; # 若when中返回信息，则输出msg后的值&#10;- debug: msg=&amp;#34;foo.sh exists&amp;#34;&#10; # 调用模块任务&#10; when: script_stat.stat.exists&#10;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;执行，成功输出信息&#10;&lt;a class="link" href="https://gitea.fjy8018.top/fjy8018/images/raw/branch/blog/img/5b810d982cf76.png" target="_blank" rel="noopener"&#10; &gt;&lt;img alt="ansible14.png" class="gallery-image" data-flex-basis="430px" data-flex-grow="179" height="423" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://gitea.fjy8018.top/fjy8018/images/raw/branch/blog/img/5b810d982cf76.png" width="759"&gt;&lt;/a&gt;&lt;/p&gt;&#10;&lt;h3 id="远程执行命令"&gt;&lt;a href="#%e8%bf%9c%e7%a8%8b%e6%89%a7%e8%a1%8c%e5%91%bd%e4%bb%a4" class="header-anchor"&gt;&lt;/a&gt;远程执行命令&#10;&lt;/h3&gt;&lt;p&gt;在&lt;code&gt;roles/testbox/tasks/main.yml&lt;/code&gt;添加任务如下&lt;/p&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code&gt;- name: run the script&#10; command: &amp;#39;sh /root/foo.sh&amp;#39;&#10;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;执行成功&#10;&lt;a class="link" href="https://gitea.fjy8018.top/fjy8018/images/raw/branch/blog/img/5b810d982cf7a.png" target="_blank" rel="noopener"&#10; &gt;&lt;img alt="ansible15.png" class="gallery-image" data-flex-basis="404px" data-flex-grow="168" height="452" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://gitea.fjy8018.top/fjy8018/images/raw/branch/blog/img/5b810d982cf7a.png" width="762"&gt;&lt;/a&gt;&lt;/p&gt;&#10;&lt;h3 id="template模块任务"&gt;&lt;a href="#template%e6%a8%a1%e5%9d%97%e4%bb%bb%e5%8a%a1" class="header-anchor"&gt;&lt;/a&gt;template模块任务&#10;&lt;/h3&gt;&lt;p&gt;环境变量配置文件中&lt;code&gt;inventory/testenv&lt;/code&gt;添加如下命令&lt;/p&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code&gt;server_name=test.fjy8018.top&#10;port=80&#10;user=ansible&#10;worker_processes=4&#10;max_open_file=65505&#10;root=/www&#10;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;新建template文件夹&lt;/p&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code&gt;(.py3-a2.5-env) [ansible@localhost test_playbook]$ mkdir roles/testbox/templates&#10;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;添加nginx j2文件&lt;/p&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code&gt;(.py3-a2.5-env) [ansible@localhost test_playbook]$ vi roles/testbox/templates/nginx.conf.j2&#10;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;文件内容如下，其中调用了环境变量中的配置&lt;/p&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code&gt;# For more information on configuration, see: &#10;user {{ user }}; &#10;worker_processes {{ worker_processes }}; &#10; &#10;error_log /var/log/nginx/error.log; &#10; &#10;pid /var/run/nginx.pid; &#10; &#10;events { &#10; worker_connections {{ max_open_file }}; &#10;} &#10;...&#10;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;在&lt;code&gt;roles/testbox/tasks/main.yml&lt;/code&gt;添加任务如下&lt;/p&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code&gt;# 复制nginx配置文件&#10;- name: write the nginx config file&#10; template: src=roles/testbox/templates/nginx.conf.j2 dest=/etc/nginx/nginx.conf&#10;# 远程安装最新版nginx&#10;- name: install nginx at latest version&#10; yum: pkg=nginx state=latest&#10;# 新增模块任务启动nginx服务&#10;- name: start nginx service&#10; service: name=nginx state=started&#10;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;所有任务列表&#10;&lt;a class="link" href="https://gitea.fjy8018.top/fjy8018/images/raw/branch/blog/img/5b810d9829953.png" target="_blank" rel="noopener"&#10; &gt;&lt;img alt="ansible16.png" class="gallery-image" data-flex-basis="326px" data-flex-grow="136" height="573" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://gitea.fjy8018.top/fjy8018/images/raw/branch/blog/img/5b810d9829953.png" width="780"&gt;&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;查看变量参数是否应用成功&#10;&lt;a class="link" href="https://gitea.fjy8018.top/fjy8018/images/raw/branch/blog/img/5b810d9826462.png" target="_blank" rel="noopener"&#10; &gt;&lt;img alt="ansible18.png" class="gallery-image" data-flex-basis="483px" data-flex-grow="201" height="362" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://gitea.fjy8018.top/fjy8018/images/raw/branch/blog/img/5b810d9826462.png" width="730"&gt;&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;code&gt;ssh root@test.fjy8018.top ps -ef | grep nginx&lt;/code&gt;查看nginx是否启动成功&#10;&lt;a class="link" href="https://gitea.fjy8018.top/fjy8018/images/raw/branch/blog/img/5b810d9f492f9.png" target="_blank" rel="noopener"&#10; &gt;&lt;img alt="ansible19.png" class="gallery-image" data-flex-basis="1392px" data-flex-grow="580" height="130" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://gitea.fjy8018.top/fjy8018/images/raw/branch/blog/img/5b810d9f492f9.png" width="754"&gt;&lt;/a&gt;&lt;/p&gt;&#10;</description></item><item><title>Ansible安装配置</title><link>https://blog.fjy8018.top/archives/175/</link><pubDate>Sun, 19 Aug 2018 16:38:00 +0800</pubDate><guid>https://blog.fjy8018.top/archives/175/</guid><description>&lt;p&gt;&lt;a class="link" href="https://docs.ansible.com/ansible/latest/installation_guide/intro_installation.html" target="_blank" rel="noopener"&#10; &gt;ansible官方文档指南&lt;/a&gt;&lt;/p&gt;&#10;&lt;h2 id="系统预配置"&gt;&lt;a href="#%e7%b3%bb%e7%bb%9f%e9%a2%84%e9%85%8d%e7%bd%ae" class="header-anchor"&gt;&lt;/a&gt;系统预配置&#10;&lt;/h2&gt;&lt;p&gt;关闭防火墙&lt;/p&gt;&#10;&lt;pre&gt;&lt;code&gt;[root@localhost ~]# systemctl stop firewalld&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;p&gt;关闭防火墙开机启动&lt;/p&gt;&#10;&lt;pre&gt;&lt;code&gt;[root@localhost ~]# systemctl disable firewalld&#10;Removed symlink /etc/systemd/system/multi-user.target.wants/firewalld.service.&#10;Removed symlink /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service.&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;p&gt;关闭强制访问控制安全策略&lt;/p&gt;&#10;&lt;pre&gt;&lt;code&gt;vi /etc/sysconfig/selinux&#10;&#10;# This file controls the state of SELinux on the system.&#10;# SELINUX= can take one of these three values:&#10;# enforcing - SELinux security policy is enforced.&#10;# permissive - SELinux prints warnings instead of enforcing.&#10;# disabled - No SELinux policy is loaded.&#10;SELINUX=enforcing&#10;# SELINUXTYPE= can take one of three two values:&#10;# targeted - Targeted processes are protected,&#10;# minimum - Modification of targeted policy. Only selected processes are protected.&#10;# mls - Multi Level Security protection.&#10;SELINUXTYPE=targeted&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;p&gt;&lt;code&gt;SELINUX=enforcing&lt;/code&gt;改成&lt;code&gt;SELINUX=disabled&lt;/code&gt;&lt;/p&gt;&#10;&lt;p&gt;reboot使禁用操作生效&lt;/p&gt;&#10;&lt;p&gt;查看操作是否生效&lt;/p&gt;&#10;&lt;pre&gt;&lt;code&gt;[root@localhost ~]# getenforce&#10;Disabled&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;h2 id="安装python3"&gt;&lt;a href="#%e5%ae%89%e8%a3%85python3" class="header-anchor"&gt;&lt;/a&gt;安装Python3&#10;&lt;/h2&gt;&lt;pre&gt;&lt;code&gt;wget https://www.python.org/ftp/python/3.7.0/Python-3.7.0.tar.xz&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;p&gt;&lt;a class="link" href="https://i.loli.net/2018/08/19/5b792c501dafe.png" target="_blank" rel="noopener"&#10; &gt;&lt;img alt="ansible1.png" class="gallery-image" data-flex-basis="477px" data-flex-grow="198" height="467" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://i.loli.net/2018/08/19/5b792c501dafe.png" width="929"&gt;&lt;/a&gt;&#10;解压编译包&lt;/p&gt;&#10;&lt;pre&gt;&lt;code&gt;tar xf Python-3.7.0.tar.xz&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;p&gt;查看文件&lt;/p&gt;&#10;&lt;pre&gt;&lt;code&gt;[root@localhost ~]# ls&#10;anaconda-ks.cfg Python-3.7.0 Python-3.7.0.tar.xz&#10;[root@localhost ~]# cd Python-3.7.0&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;p&gt;安装OpenSSL依赖，否则使用pip3.7会报找不到SSL模块错误&lt;/p&gt;&#10;&lt;pre&gt;&lt;code&gt;yum install openssl-devel&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;p&gt;设定编译参数，/usr/local为安装位置，&amp;ndash;with-ensurepip=install指定安装包管理工具，&amp;ndash;enable-shared配置Python匹配系统参数&lt;/p&gt;&#10;&lt;pre&gt;&lt;code&gt;[root@localhost Python-3.7.0]# ./configure --prefix=/usr/local --with-ensurepip=install --enable-shared LDFLAGS=&amp;quot;-Wl,-rpath /usr/local/lib&amp;quot; --with-ssl&#10;checking build system type... x86_64-pc-linux-gnu&#10;checking host system type... x86_64-pc-linux-gnu&#10;checking for python3.7... no&#10;checking for python3... no&#10;checking for python... python&#10;checking for --enable-universalsdk... no&#10;checking for --with-universal-archs... no&#10;checking MACHDEP... checking for --without-gcc... no&#10;checking for --with-icc... no&#10;checking for gcc... no&#10;checking for cc... no&#10;checking for cl.exe... no&#10;configure: error: in `/root/Python-3.7.0':&#10;configure: error: no acceptable C compiler found in $PATH&#10;See `config.log' for more details&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;p&gt;报错为找不到C编译器，由于系统为最小化安装，没有自带gcc编译器&#10;安装gcc&lt;/p&gt;&#10;&lt;pre&gt;&lt;code&gt;yum install gcc&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;p&gt;&lt;a class="link" href="https://i.loli.net/2018/08/19/5b792c501d7ef.png" target="_blank" rel="noopener"&#10; &gt;&lt;img alt="ansible2.png" class="gallery-image" data-flex-basis="441px" data-flex-grow="184" height="466" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://i.loli.net/2018/08/19/5b792c501d7ef.png" width="858"&gt;&lt;/a&gt;&#10;再次编译，编译通过&#10;安装编译文件&lt;/p&gt;&#10;&lt;pre&gt;&lt;code&gt; make &amp;amp;&amp;amp; make altinstall&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;p&gt;&lt;a class="link" href="https://i.loli.net/2018/08/19/5b792c501ced6.png" target="_blank" rel="noopener"&#10; &gt;&lt;img alt="ansible3.png" class="gallery-image" data-flex-basis="402px" data-flex-grow="167" height="464" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://i.loli.net/2018/08/19/5b792c501ced6.png" width="779"&gt;&lt;/a&gt;&#10;日志如下&lt;/p&gt;&#10;&lt;pre&gt;&lt;code&gt;Traceback (most recent call last):&#10; File &amp;quot;/root/Python-3.7.0/Lib/runpy.py&amp;quot;, line 193, in _run_module_as_main&#10; &amp;quot;__main__&amp;quot;, mod_spec)&#10; File &amp;quot;/root/Python-3.7.0/Lib/runpy.py&amp;quot;, line 85, in _run_code&#10; exec(code, run_globals)&#10; File &amp;quot;/root/Python-3.7.0/Lib/ensurepip/__main__.py&amp;quot;, line 5, in &amp;lt;module&amp;gt;&#10; sys.exit(ensurepip._main())&#10; File &amp;quot;/root/Python-3.7.0/Lib/ensurepip/__init__.py&amp;quot;, line 204, in _main&#10; default_pip=args.default_pip,&#10; File &amp;quot;/root/Python-3.7.0/Lib/ensurepip/__init__.py&amp;quot;, line 117, in _bootstrap&#10; return _run_pip(args + [p[0] for p in _PROJECTS], additional_paths)&#10; File &amp;quot;/root/Python-3.7.0/Lib/ensurepip/__init__.py&amp;quot;, line 27, in _run_pip&#10; import pip._internal&#10;zipimport.ZipImportError: can't decompress data; zlib not available&#10;&#10;make: *** [altinstall] 错误 1&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;p&gt;编译报错，找不到zlib，同理，安装zlib&lt;/p&gt;&#10;&lt;pre&gt;&lt;code&gt;yum -y install zlib*&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;p&gt;另外，此时安装的是3.7版本，3.7版本需要一个新的包libffi-devel否则也会编译报错&lt;/p&gt;&#10;&lt;pre&gt;&lt;code&gt;yum install libffi-devel -y&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;p&gt;安装成功&lt;/p&gt;&#10;&lt;p&gt;&lt;a class="link" href="https://i.loli.net/2018/08/19/5b792c501d0bd.png" target="_blank" rel="noopener"&#10; &gt;&lt;img alt="ansible4.png" class="gallery-image" data-flex-basis="402px" data-flex-grow="167" height="466" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://i.loli.net/2018/08/19/5b792c501d0bd.png" width="781"&gt;&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;Python3.7对应的包管理工具pip版本也为3.7，查看其路径&lt;/p&gt;&#10;&lt;pre&gt;&lt;code&gt;[root@localhost Python-3.7.0]# which pip3.7&#10;/usr/local/bin/pip3.7&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;p&gt;设置软链接&lt;/p&gt;&#10;&lt;pre&gt;&lt;code&gt;ln -s /usr/local/bin/pip3.7 /usr/local/bin/pip&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;h2 id="安装virtualenv"&gt;&lt;a href="#%e5%ae%89%e8%a3%85virtualenv" class="header-anchor"&gt;&lt;/a&gt;安装virtualenv&#10;&lt;/h2&gt;&lt;p&gt;安装virtualenv，用于隔离Python环境&lt;/p&gt;&#10;&lt;pre&gt;&lt;code&gt;pip install virtualenv&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;p&gt;&lt;a class="link" href="https://i.loli.net/2018/08/19/5b792c5019c9d.png" target="_blank" rel="noopener"&#10; &gt;&lt;img alt="ansible5.png" class="gallery-image" data-flex-basis="1324px" data-flex-grow="552" height="146" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://i.loli.net/2018/08/19/5b792c5019c9d.png" width="806"&gt;&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;安装git工具及其依赖&lt;/p&gt;&#10;&lt;pre&gt;&lt;code&gt;yum -y install git nss curl&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;p&gt;创建ansible账户&lt;/p&gt;&#10;&lt;pre&gt;&lt;code&gt;useradd ansible&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;p&gt;切换用户&lt;/p&gt;&#10;&lt;pre&gt;&lt;code&gt;[root@localhost Python-3.7.0]# su - ansible&#10;[ansible@localhost ~]$&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;p&gt;在ansible用户下创建virtualenv实例，用于集成ansible2.5&lt;/p&gt;&#10;&lt;pre&gt;&lt;code&gt;virtualenv -p /usr/local/bin/python3.7 .py3-a2.5-env&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;p&gt;&lt;a class="link" href="https://i.loli.net/2018/08/19/5b792c5018bf5.png" target="_blank" rel="noopener"&#10; &gt;&lt;img alt="ansible6.png" class="gallery-image" data-flex-basis="1398px" data-flex-grow="582" height="104" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://i.loli.net/2018/08/19/5b792c5018bf5.png" width="606"&gt;&lt;/a&gt;&#10;源码安装git-ansible2.5&lt;/p&gt;&#10;&lt;pre&gt;&lt;code&gt;cd /home/ansible/.py3-a2.5-env&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;p&gt;下载源码&lt;/p&gt;&#10;&lt;pre&gt;&lt;code&gt;git clone https://github.com/ansible/ansible.git&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;p&gt;&lt;a class="link" href="https://i.loli.net/2018/08/19/5b792c5018b6c.png" target="_blank" rel="noopener"&#10; &gt;&lt;img alt="ansible7.png" class="gallery-image" data-flex-basis="1598px" data-flex-grow="666" height="109" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://i.loli.net/2018/08/19/5b792c5018b6c.png" width="726"&gt;&lt;/a&gt;&#10;加载virtualenv环境&lt;/p&gt;&#10;&lt;pre&gt;&lt;code&gt;[ansible@localhost .py3-a2.5-env]$ source /home/ansible/.py3-a2.5-env/bin/activate&#10;(.py3-a2.5-env) [ansible@localhost .py3-a2.5-env]$&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;p&gt;安装ansible依赖&lt;/p&gt;&#10;&lt;pre&gt;&lt;code&gt;pip install paramiko PyYAML jinja2&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;p&gt;&lt;a class="link" href="https://i.loli.net/2018/08/19/5b792c5018808.png" target="_blank" rel="noopener"&#10; &gt;&lt;img alt="ansible8.png" class="gallery-image" data-flex-basis="596px" data-flex-grow="248" height="359" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://i.loli.net/2018/08/19/5b792c5018808.png" width="893"&gt;&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;查看文件&lt;/p&gt;&#10;&lt;pre&gt;&lt;code&gt;(.py3-a2.5-env) [ansible@localhost .py3-a2.5-env]$ ll&#10;总用量 8&#10;drwxrwxr-x 14 ansible ansible 4096 8月 18 20:24 ansible&#10;drwxrwxr-x 2 ansible ansible 248 8月 18 20:16 bin&#10;drwxrwxr-x 2 ansible ansible 24 8月 18 20:13 include&#10;drwxrwxr-x 3 ansible ansible 23 8月 18 20:13 lib&#10;-rw-rw-r-- 1 ansible ansible 59 8月 18 20:16 pip-selfcheck.json&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;p&gt;移动源码至虚拟环境&lt;/p&gt;&#10;&lt;pre&gt;&lt;code&gt;mv ansible/ .py3-a2.5-env/&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;p&gt;进入虚拟环境源码目录&lt;/p&gt;&#10;&lt;pre&gt;&lt;code&gt;(.py3-a2.5-env) [ansible@localhost .py3-a2.5-env]$ cd .py3-a2.5-env/&#10;(.py3-a2.5-env) [ansible@localhost .py3-a2.5-env]$ ll&#10;总用量 108&#10;drwxrwxr-x 2 ansible ansible 223 8月 18 20:24 bin&#10;drwxrwxr-x 3 ansible ansible 63 8月 18 20:24 changelogs&#10;-rw-rw-r-- 1 ansible ansible 10591 8月 18 20:24 CODING_GUIDELINES.md&#10;drwxrwxr-x 4 ansible ansible 53 8月 18 20:24 contrib&#10;-rw-rw-r-- 1 ansible ansible 35148 8月 18 20:24 COPYING&#10;drwxrwxr-x 7 ansible ansible 71 8月 18 20:24 docs&#10;-rw-rw-r-- 1 ansible ansible 48 8月 18 20:24 docsite_requirements.txt&#10;drwxrwxr-x 4 ansible ansible 192 8月 18 20:24 examples&#10;drwxrwxr-x 5 ansible ansible 305 8月 18 20:24 hacking&#10;drwxrwxr-x 3 ansible ansible 21 8月 18 20:24 lib&#10;drwxrwxr-x 2 ansible ansible 78 8月 18 20:24 licenses&#10;-rw-rw-r-- 1 ansible ansible 13452 8月 18 20:24 Makefile&#10;-rw-rw-r-- 1 ansible ansible 557 8月 18 20:24 MANIFEST.in&#10;-rw-rw-r-- 1 ansible ansible 201 8月 18 20:24 MODULE_GUIDELINES.md&#10;drwxrwxr-x 10 ansible ansible 120 8月 18 20:24 packaging&#10;-rw-rw-r-- 1 ansible ansible 5265 8月 18 20:24 README.rst&#10;-rw-rw-r-- 1 ansible ansible 371 8月 18 20:24 requirements.txt&#10;-rw-rw-r-- 1 ansible ansible 10586 8月 18 20:24 setup.py&#10;-rw-rw-r-- 1 ansible ansible 3287 8月 18 20:24 shippable.yml&#10;drwxrwxr-x 10 ansible ansible 121 8月 18 20:24 test&#10;-rw-rw-r-- 1 ansible ansible 1103 8月 18 20:24 tox.ini&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;p&gt;切换版本&lt;/p&gt;&#10;&lt;pre&gt;&lt;code&gt;(.py3-a2.5-env) [ansible@localhost .py3-a2.5-env]$ git checkout stable-2.5&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;p&gt;分支 stable-2.5 设置为跟踪来自 origin 的远程分支 stable-2.5。&#10;切换到一个新分支 &amp;lsquo;stable-2.5&amp;rsquo;&lt;/p&gt;&#10;&lt;pre&gt;&lt;code&gt;(.py3-a2.5-env) [ansible@localhost ansible]$ git branch&#10; devel&#10;* stable-2.5&#10;&#10;(.py3-a2.5-env) [ansible@localhost ansible]$ pwd&#10;/home/ansible/.py3-a2.5-env/ansible&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;h2 id="加载ansible25版本"&gt;&lt;a href="#%e5%8a%a0%e8%bd%bdansible25%e7%89%88%e6%9c%ac" class="header-anchor"&gt;&lt;/a&gt;加载ansible2.5版本&#10;&lt;/h2&gt;&lt;pre&gt;&lt;code&gt;source /home/ansible/.py3-a2.5-env/ansible/hacking/env-setup -q&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;p&gt;验证版本&lt;/p&gt;&#10;&lt;pre&gt;&lt;code&gt;(.py3-a2.5-env) [ansible@localhost ansible]$ ansible --version&#10;ansible 2.5.8 (stable-2.5 b23b1c2ee0) last updated 2018/08/18 20:35:45 (GMT +800)&#10; config file = None&#10; configured module search path = ['/home/ansible/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules']&#10; ansible python module location = /home/ansible/.py3-a2.5-env/ansible/lib/ansible&#10; executable location = /home/ansible/.py3-a2.5-env/ansible/bin/ansible&#10; python version = 3.7.0 (default, Aug 18 2018, 20:09:08) [GCC 4.8.5 20150623 (Red Hat 4.8.5-28)]&#10;&lt;/code&gt;&lt;/pre&gt;&#10;</description></item></channel></rss>