<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>Ansible on 翟志军 Jack Zhai</title>
    <link>https://showme.codes/tags/ansible/</link>
    <description>Recent content in Ansible on 翟志军 Jack Zhai</description>
    <generator>Hugo</generator>
    <language>en-us</language>
    <copyright>showme.codes</copyright>
    <lastBuildDate>Thu, 19 Sep 2019 00:00:00 +0000</lastBuildDate>
    <atom:link href="https://showme.codes/tags/ansible/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>这样理解Ansible更容易</title>
      <link>https://showme.codes/zh-cn/2019-09-19-understand-ansible/</link>
      <pubDate>Thu, 19 Sep 2019 00:00:00 +0000</pubDate>
      <guid>https://showme.codes/zh-cn/2019-09-19-understand-ansible/</guid>
      <description>本文实际上写的是 Ansible 的概念模型，理解了一个东西的概念模型后，对它的使用会变得得心应手。同时对阅读它的源码也非常有帮助。</description>
    </item>
    <item>
      <title>如何设计 Ansible 的入门工作坊</title>
      <link>https://showme.codes/zh-cn/2019-07-19-ansible-workshop/</link>
      <pubDate>Fri, 19 Jul 2019 00:00:00 +0000</pubDate>
      <guid>https://showme.codes/zh-cn/2019-07-19-ansible-workshop/</guid>
      <description>&lt;p&gt;&lt;img alt=&#34;image.png&#34; loading=&#34;lazy&#34; src=&#34;https://showme.codes/assets/images/292372-28f3aed45a46631e.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;本月在公司内部做了一次 Ansible 的入门工作坊。本文即对这次工作坊的设计过程进行一次总结。其他技术类的工作坊也可以参考。&lt;/p&gt;
&lt;p&gt;设计过程大概过程如下文所述。&lt;/p&gt;
&lt;p&gt;首先，我们需要确定参加本次工作坊的受众。他们是否具有最基本的前提。本次工作坊的受众有开发、测试、运维，还有毕业生。但是他们都会使用 shell。这已经满足最基本的前提。同时，了解受众后了，也就可以因材施教。&lt;/p&gt;
&lt;p&gt;第二，分析工作坊的内容。Ansible 是一款上手非常容易的自动化运维工具。它的特点就是实操性非常强，不需要理解 Ansible 背后的概念就可以使用的工具。&lt;/p&gt;
&lt;p&gt;笔者根据受众和教学内容的特点，得出本次工作坊的目标（教学目标）：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;知道 Ansible 是什么，并知道它的作用。&lt;/li&gt;
&lt;li&gt;了解如何查文档。&lt;/li&gt;
&lt;li&gt;能部署一个 Spring Boot 应用。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;是不是很简单？其实不然。整个工作坊没有一个人能完成所有的任务。同时发现有运维和开发基础的同学会做得更快。&lt;/p&gt;
&lt;p&gt;那接下来怎么实现这个目标呢？笔者使用的是任务驱动的方法。也就是受众通过做一个个任务，在任务中完成学习。同时，教师可以任务过程穿插讲相关的知识点。&lt;/p&gt;
&lt;p&gt;以下为任务列表：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;执行 &lt;code&gt;ansible-playbook -i hosts playbook.yml&lt;/code&gt; 成功&lt;/li&gt;
&lt;li&gt;创建用户 apps 及用户组 apps：
&lt;ul&gt;
&lt;li&gt;user 模块: &lt;a href=&#34;https://docs.ansible.com/ansible/latest/modules/user_module.html&#34;&gt;https://docs.ansible.com/ansible/latest/modules/user_module.html&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;group 模块: &lt;a href=&#34;https://docs.ansible.com/ansible/latest/modules/group_module.html&#34;&gt;https://docs.ansible.com/ansible/latest/modules/group_module.html&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;创建以下文件夹，并设置文件夹的用户和组为 apps：
/apps，/apps/hello，/apps/hello/bin，/apps/hello/logs
&lt;ul&gt;
&lt;li&gt;file 模块: &lt;a href=&#34;https://docs.ansible.com/ansible/latest/modules/file_module.html&#34;&gt;https://docs.ansible.com/ansible/latest/modules/file_module.html&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;将 helloworld-0.0.2.jar copy 到 /apps/hello/bin 目录下，设置该 jar 文件的用户和用户组为 apps
&lt;ul&gt;
&lt;li&gt;copy 模块: &lt;a href=&#34;https://docs.ansible.com/ansible/latest/modules/copy_module.html&#34;&gt;https://docs.ansible.com/ansible/latest/modules/copy_module.html&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;使用 template 模块将 app.service copy 到目标服务器的 /etc/systemd/system 中，并重命名 hello.service :
&lt;ul&gt;
&lt;li&gt;template 模块: &lt;a href=&#34;https://docs.ansible.com/ansible/latest/modules/template_module.html&#34;&gt;https://docs.ansible.com/ansible/latest/modules/template_module.html&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;启动 hello 服务
&lt;ul&gt;
&lt;li&gt;service 模块: &lt;a href=&#34;https://docs.ansible.com/ansible/latest/modules/service_module.html&#34;&gt;https://docs.ansible.com/ansible/latest/modules/service_module.html&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;监听 hello 服务是否启动成功
&lt;ul&gt;
&lt;li&gt;wait_for 模块: &lt;a href=&#34;https://docs.ansible.com/ansible/latest/modules/wait_for_module.html&#34;&gt;https://docs.ansible.com/ansible/latest/modules/wait_for_module.html&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;为目标机器安装 JDK 1.8:
&lt;ol&gt;
&lt;li&gt;在本地仓库中创建 roles 目录&lt;/li&gt;
&lt;li&gt;clone 代码：https://github.com/geerlingguy/ansible-role-java 到 roles 目录中&lt;/li&gt;
&lt;li&gt;在 playbook.yml 文件中加入 ansible-role-java 的role&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;创建自定义 role: hello role
&lt;ol&gt;
&lt;li&gt;进入 roles 目录：cd roles&lt;/li&gt;
&lt;li&gt;使用命令生成 role 模板：&lt;code&gt;ansible-galaxy init hello&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;将 hello 的部署逻辑（在 playbook.yml 中）写入到 hello role 中&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;将 hello 部署到多台机器
&lt;ul&gt;
&lt;li&gt;需要修改 hosts 文件&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;多环境部署&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;任务的设计并不是随意的，而是有意的。比如：&lt;/p&gt;</description>
    </item>
    <item>
      <title>使用 Jenkins &#43; Ansible 实现 Springboot 自动化部署101</title>
      <link>https://showme.codes/zh-cn/2019-05-15-jenkins-ansible-springboot/</link>
      <pubDate>Wed, 15 May 2019 00:00:00 +0000</pubDate>
      <guid>https://showme.codes/zh-cn/2019-05-15-jenkins-ansible-springboot/</guid>
      <description>&lt;p&gt;&lt;img alt=&#34;image.png&#34; loading=&#34;lazy&#34; src=&#34;https://showme.codes/assets/images/292372-3d64f9fe7b80ed98.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;本文要点：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;设计一条 Springboot 最基本的流水线：包括构建、制品上传、部署。&lt;/li&gt;
&lt;li&gt;使用 Docker 容器运行构建逻辑。&lt;/li&gt;
&lt;li&gt;自动化整个实验环境：包括 Jenkins 的配置，Jenkins slave 的配置等。&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&#34;1-代码仓库安排&#34;&gt;1. 代码仓库安排&lt;/h3&gt;
&lt;p&gt;本次实验涉及以下多个代码仓库：&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;% tree -L 1
├── 1-cd-platform # 实验环境相关代码
├── 1-env-conf # 环境配置代码-实现配置独立
└── 1-springboot # Springboot 应用的代码及其部署代码
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;1-springboot 的目录结构如下：&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;% cd 1-springboot
% tree -L 1 
├── Jenkinsfile # 流水线代码
├── README.md
├── deploy # 部署代码
├── pom.xml 
└── src # 业务代码
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;所有代码，均放在 GitHub: &lt;a href=&#34;https://github.com/cd-in-practice&#34;&gt;https://github.com/cd-in-practice&lt;/a&gt;&lt;/p&gt;
&lt;h3 id=&#34;2-实验环境准备&#34;&gt;2. 实验环境准备&lt;/h3&gt;
&lt;p&gt;笔者使用 Docker Compose + Vagrant 进行实验。环境包括以下几个系统：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Jenkins * 1
Jenkins master，全自动安装插件、默认用户名密码：admin/admin。&lt;/li&gt;
&lt;li&gt;Jenkins agent * 2
Jenkins agent 运行在 Docker 容器中，共启动两个。&lt;/li&gt;
&lt;li&gt;Artifactory * 1
一个商业版的制品库。笔者申请了一个 30 天的商业版。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;使用 Vagrant  是为了启动虚拟机，用于部署 Springboot 应用。如果你的开发机器无法使用 Vagrant，使用 VirtualBox 也可以达到同样的效果。但是有一点需要注意，那就是网络。如果在虚拟机中要访问 Docker 容器内提供的服务，需要在 DNS 上或者 hosts 上做相应的调整。所有的虚拟机的镜像使用 Centos7。&lt;/p&gt;</description>
    </item>
    <item>
      <title>使用 Jenkins &#43; Ansible 实现自动化部署 Nginx</title>
      <link>https://showme.codes/zh-cn/2019-04-22-jenkins-ansible-nginx/</link>
      <pubDate>Mon, 22 Apr 2019 00:00:00 +0000</pubDate>
      <guid>https://showme.codes/zh-cn/2019-04-22-jenkins-ansible-nginx/</guid>
      <description>&lt;p&gt;本文介绍如何使用 Jenkins + Ansible 实现对 Nginx 的自动化部署。最终达到的效果有如下几点：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;只要你将 Nginx 的配置推送到 GitHub 中，Jenkins 就会自动执行部署，然后目标服务器的 Nginx 配置自动生效。这个过程是幂等（idempotent）的，只要代码不变，执行多少遍，最终效果不变。&lt;/li&gt;
&lt;li&gt;如果目标机器没有安装 Nginx，则会自动安装 Nginx。&lt;/li&gt;
&lt;li&gt;自动设置服务器防火墙规则。&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;1-实验环境介绍&#34;&gt;1. 实验环境介绍&lt;/h2&gt;
&lt;p&gt;本次实验使用 Docker Compose 搭建 Jenkins 及 Jenkins agent。使用 Vagrant 启动一台虚拟机，用于部署 Nginx。使用 Vagrant 是可选的，读者可以使用 VirtualBox 启动一个虚拟机。使用 Vagrant 完全是为了自动化搭建实验环境。&lt;/p&gt;
&lt;p&gt;以下是整个实验环境的架构图：
&lt;img alt=&#34;Jenkins Ansible Nginx&#34; loading=&#34;lazy&#34; src=&#34;https://showme.codes/assets/images/292372-ab578a7d0b27c4c6.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;注意，图中的 &lt;code&gt;5123 &amp;lt;-&amp;gt; 80&lt;/code&gt; 代表将宿主机的 5123 端口请求转发到虚拟机中的 80 端口。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Vagrant：虚拟机管理工具，通过它，我们可以使用文本来定义、管理虚拟机。&lt;/li&gt;
&lt;li&gt;Ansible：自动化运维工具&lt;/li&gt;
&lt;li&gt;Docker Compose：它是一个用于定义和运行多容器 Docker 应用程序的工具。可以使用YAML文件来配置应用程序的服务。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;2-启动实验环境&#34;&gt;2. 启动实验环境&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;克隆代码并进入文件夹&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;git clone https://github.com/zacker330/jenkins-ansible-nginx.git
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nb&#34;&gt;cd&lt;/span&gt; jenkins-ansible-nginx
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;构建 Jenkins agent 的镜像
需要自定义 Jenkins agent 镜像有两个原因：&lt;/p&gt;</description>
    </item>
    <item>
      <title>ChatOps实战</title>
      <link>https://showme.codes/zh-cn/2017-10-08-chatops-in-action/</link>
      <pubDate>Sun, 08 Oct 2017 00:00:00 +0000</pubDate>
      <guid>https://showme.codes/zh-cn/2017-10-08-chatops-in-action/</guid>
      <description>ChatOps没有那么神秘，也就是正则&#43;脚本</description>
    </item>
    <item>
      <title>简单易懂Ansible系列 —— 实现ssh key主机之间复制</title>
      <link>https://showme.codes/zh-cn/2017-8-19-ansible-manage-sshkey/</link>
      <pubDate>Sat, 19 Aug 2017 00:00:00 +0000</pubDate>
      <guid>https://showme.codes/zh-cn/2017-8-19-ansible-manage-sshkey/</guid>
      <description>&lt;p&gt;我们在搭建Hadoop完全分布式环境时，Hadoop的name node节点（理解为master节点）需要无密码登录到所有的data node节点。&lt;/p&gt;
&lt;p&gt;当然，我们使用手工的方式很容易就实现了：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;在name node节点上生成ssh key：ssh-keygen&lt;/li&gt;
&lt;li&gt;将public key copy到所有的data node节点上：ssh-copy-id slave1&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;同时，你还必须设置&lt;code&gt;~/.ssh/config&lt;/code&gt;，以防止登录时不停的问yes or no：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;```yml
Host *
    StrictHostKeyChecking no
```
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;完了，还要设置这个文件的权限为&lt;strong&gt;400&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;以上步骤当然可以手工一步步执行。但是，总有那么一些人：希望所有的操作都可以版本化，所有的操作都应该自动化。我属于这些人。&lt;/p&gt;
&lt;p&gt;再说了，我发现在搭建Jenkins环境时，也遇到了同样的问题：需要将Jenkins master的public key加入到Jenkins agent机器中。&lt;/p&gt;
&lt;p&gt;可以预见到将来我还会遇到类似的问题。于是，我找到一个方法来自动化以上操作。&lt;/p&gt;
&lt;h3 id=&#34;在name-node机器上执行task如下&#34;&gt;在name node机器上执行task如下&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;创建用户的时候生成ssh_key：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-yml&#34; data-lang=&#34;yml&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;- &lt;span class=&#34;nt&#34;&gt;name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;create hadoop user&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;user&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;{{hadoop_user}}&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;group&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;{{hadoop_group}}&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;createhome&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;yes&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;generate_ssh_key&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;yes&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;ssh_key_bits&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;m&#34;&gt;2048&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;ssh_key_file&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;.ssh/id_rsa&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;tags&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;hadoop&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;将id_rsa.pub拉取到ansible执行机器上&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-yml&#34; data-lang=&#34;yml&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;- &lt;span class=&#34;nt&#34;&gt;name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;fetch public key&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;fetch&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;src&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;/home/{{hadoop_user}}/.ssh/id_rsa.pub&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;dest&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;/tmp/&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;flat&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;yes&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;tags&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;hadoop&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;设置&lt;code&gt;StrictHostKeyChecking no&lt;/code&gt;
因为我们只想修改这个用户的ssh行为，所以我们的ssh的配置只是针对当前这个用户的：&lt;/p&gt;</description>
    </item>
    <item>
      <title>简单易懂Ansible系列 —— 解决了什么</title>
      <link>https://showme.codes/zh-cn/2017-06-12-ansible-introduce/</link>
      <pubDate>Mon, 12 Jun 2017 00:00:00 +0000</pubDate>
      <guid>https://showme.codes/zh-cn/2017-06-12-ansible-introduce/</guid>
      <description>&lt;p&gt;&lt;img alt=&#34;Ansible&#34; loading=&#34;lazy&#34; src=&#34;https://showme.codes/assets/images/292372-a504ab242c05db6a.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;不知什么时候，Ansible的slogan从“IT Automation Software for System Administrators”变成了“AUTOMATION FOR EVERYONE”。&lt;/p&gt;
&lt;p&gt;从一个给系统管理员使用的工具变成了给所有人使用的工具。&lt;/p&gt;
&lt;p&gt;但是，现实中，发现了解Ansible的人，还是太少了。同时，自己断断续续学习Ansible也有一段时间，希望拿出来和大家交流。所以就决定不定期写写一个关于Ansible的系列。如果你觉得我写得还可以，到文末扫码请我喝杯茶。&lt;/p&gt;
&lt;p&gt;此文为“简单易懂Ansible”系列文章的开篇 —— Ansible解决了什么&lt;/p&gt;
&lt;h2 id=&#34;ansible解决了什么&#34;&gt;Ansible解决了什么&lt;/h2&gt;
&lt;p&gt;首先，它是一个运维工具。当然要解决运维过程中遇到的问题了。运维过程遇到了什么问题？&lt;/p&gt;
&lt;p&gt;想像一下，你要在一台新的机器上安装Tomcat，你会怎么样呢，条件反射的：&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;ssh user@111.111.111.111

wget -c http://apache.fayea.com/tomcat/tomcat-8.5.15.tar.gz

tar -zxf apache-tomcat-8.5.15.tar.gz
.....省略
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;好，10分钟后你愉快地完成了老板给你的任务。但是现在你需要给100台机器安装Tomcat呢？手工的重复100次？&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;懵逼满屏&#34; loading=&#34;lazy&#34; src=&#34;https://showme.codes/assets/images/292372-b33ed81e9618ca8a.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;而Ansible能让我们只定义一次，理论上可以在无限台机器上执行。换句话：&lt;strong&gt;减少运维工作中的重复工作&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;同时，如果是人工执行100次，那么失误是难免的！自动化运维工具会严格根据我们所给指令来执行，而不会因为失恋而手抖执行了：&lt;code&gt;sudo rm -rf /&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;不少人反对自动化，认为那样太危险，因为一不小心就在上百台机器删错文件。显然，他们没有注意到：自动化实现的是&lt;strong&gt;准确地执行指令&lt;/strong&gt;，解决人类执行任务时存在的指令理解不正确、执行不严格的问题。而机器不会出现这些问题的概念几乎为零。&lt;/p&gt;
&lt;p&gt;没有达到预期效果，往往是我们人类下达的指令不正确。&lt;/p&gt;
&lt;p&gt;所以，Ansible还解决了&lt;strong&gt;人执行指令不准确&lt;/strong&gt;的问题。&lt;/p&gt;
&lt;p&gt;如果使用Ansible来实现上述的运维需求，怎么做呢？你需要做三件事情：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;定义目标机器的列表：一种被称为inventory的类ini文件&lt;/li&gt;
&lt;li&gt;定义这些机器的配置：使用&lt;a href=&#34;https://en.wikipedia.org/wiki/YAML&#34;&gt;YAML&lt;/a&gt;格式的文件来描述你机器的配置&lt;/li&gt;
&lt;li&gt;执行 &lt;code&gt;ansible-playbook -i inventory playbook.yml&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;以下是inventory文件：&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;[tomcat-servers]
111.111.111.111
112.112.112.112
....
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;而这些ip的配置写在一种被称为playbook的YAML文件中：&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;---
- hosts: tomcat-servers
  tasks:
    - name: download tomcat
      get_url:
          url: http://apache.fayea.com/tomcat/tomcat-8.5.15.tar.gz
          dest: /tmp
          
    - name: unarchive tomcat to /usr/local
      unarchive:
          src: /tmp/apache-tomcat-8.5.15.tar.gz
          dest: /usr/local/
          remote_src: true
.....省略
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;如果你想再添加100台机器，你需要做的，也只是在inventory文件里添加100个ip，再执行一遍ansible-playbook命令。&lt;/p&gt;</description>
    </item>
    <item>
      <title>如何在半小时搭建一个简单的日志分析平台？</title>
      <link>https://showme.codes/zh-cn/2016-9-10-how-to-setup-a-simple-log-analysis-platform-in-half-hour/</link>
      <pubDate>Sat, 10 Sep 2016 00:00:00 +0000</pubDate>
      <guid>https://showme.codes/zh-cn/2016-9-10-how-to-setup-a-simple-log-analysis-platform-in-half-hour/</guid>
      <description>最好了解下Ansible和Vagrant</description>
    </item>
    <item>
      <title>Puppet，Chef，Ansible的共性</title>
      <link>https://showme.codes/zh-cn/2016-1-2-the-nature-of-ansible-puppet-chef/</link>
      <pubDate>Sat, 02 Jan 2016 00:00:00 +0000</pubDate>
      <guid>https://showme.codes/zh-cn/2016-1-2-the-nature-of-ansible-puppet-chef/</guid>
      <description>曾经有人评我这篇博客：如果能说说它们的不同就好。我现在回答你：只有知道共性才能看到不同，否则它们所有的地方都是不同的。 同时，很多人只看到这篇博客的表象：技术方面的文章。鲜少人知道这篇博客的价值：教你一种发现事物共性的方式。</description>
    </item>
  </channel>
</rss>
