博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
ansible自动化_如何使用Ansible自动化系统管理任务
阅读量:2526 次
发布时间:2019-05-11

本文共 7351 字,大约阅读时间需要 24 分钟。

ansible自动化

您想提高您的系统管理或Linux技能吗? 也许您的本地LAN上运行着一些东西,并且想让您的生活更轻松-从哪里开始? 在本文中,我将解释如何设置工具以简化多台计算机的管理。

对于远程管理工具,SaltStack,Puppet,Chef和是一些受欢迎的选择。 在整篇文章中,我将重点介绍Ansible,并且无论您有5个虚拟机还是1000个虚拟机,它对您都有帮助。

我们的旅程始于对多台计算机(无论是虚拟机还是物理机)的基本管理。 我将假设您对要实现的目标有一个了解,并且具备基本的Linux管理技能(或者至少具有查找执行每个任务所需步骤的能力)。 我将向您展示如何使用这些工具,并由您决定如何使用它们。

什么是Ansible?

Ansible网站将该项目解释为“一个完全简单的IT自动化引擎,可自动执行云配置,配置管理,应用程序部署,服务内编排和许多其他IT需求。” Ansible可用于在集中位置的一组定义的服务器上执行相同的任务。

如果您熟悉Bash for循环,您会发现Ansible以类似的方式运行。 但是,区别在于Ansible是幂等的 。 用外行的话来说,这意味着通常Ansible仅在结果发生变化时才执行请求的操作。 例如,如果要执行Bash for循环以在所有计算机上创建用户,则它可能类似于以下内容:

for server in serverA serverB serverC; do ssh ${server} "useradd myuser"; done

这将在serverAserverBserverC上创建myuser ; 但是,无论用户是否存在,它都会在每次运行for循环时运行一次user add命令。 幂等系统将首先检查用户是否存在,如果不存在,该工具将创建该用户。 当然,这是一个简化的示例,但是随着时间的推移,幂等工具的优势将变得更加明显。

Ansible如何运作?

Ansible将Ansible剧本转换为通过SSH运行的命令,在管理类似Unix的环境时,它具有许多好处:

  1. 默认情况下,大多数(如果不是全部)类似Unix的计算机将运行SSH。
  2. 依靠SSH意味着远程主机上不需要任何代理。
  3. 在大多数情况下,不需要安装其他软件,因为Ansible需要Python 2.6才能运行。 大多数(如果不是全部)Linux发行版都默认安装了此版本(或更高版本)。
  4. Ansible不需要节点。 它可以从安装了Ansible软件包且具有足够SSH访问权限的任何主机上运行。
  5. 尽管可以在cron作业中运行Ansible,但默认情况下,Ansible仅在您告知时运行。

设置SSH密钥身份验证

使用Ansible的常用方法是设置无密码SSH密钥,以简化管理。 (可以使用Ansible Vault来输入密码和其他敏感信息,但这不在本文的讨论范围之内。)目前,只需使用以下命令生成SSH密钥即可,如示例1所示。

示例1:生成SSH密钥

[09:44 user ~]$ ssh-keygen      
Generating public/private rsa key pair.
Enter file in which to save the key (/home/user/.ssh/id_rsa):
Created directory '/home/user/.ssh'.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/user/.ssh/id_rsa.
Your public key has been saved in /home/user/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:TpMyzf4qGqXmx3aqZijVv7vO9zGnVXsh6dPbXAZ+LUQ user@user-fedora
The key's randomart image is:
+---[RSA 2048]----+
|                 |
|                 |
|              E  |
|       o .   ..  |
|   .  + S    o+. |
|  . .o * .  .+ooo|
| . .+o  o o oo+.*|
|. .ooo* o. *  .*+|
| . o+*BO.o+    .o|
+----[SHA256]-----+

在示例1中, Enter键用于接受默认值。 SSH密钥可由任何非特权用户生成,并安装在远程系统上任何用户的SSH authentic_keys文件中。 生成密钥后,需要将其复制到远程主机。 为此,请运行以下命令:

ssh-copy-id root@servera

注意:Ansible不需要root用户访问权限; 但是,如果选择使用非root用户,则必须为要完成的任务配置适当的sudo权限。

系统将提示您输入servera的根密码,该密码将允许您将SSH密钥安装在远程主机上。 初始安装SSH密钥后,通过SSH登录时,将不再提示您在远程主机上输入root密码。

安装Ansible

仅在示例1中生成SSH密钥的主机上才需要安装Ansible软件包。如果您正在运行Fedora,则可以发出以下命令:

sudo dnf install ansible -y

如果运行CentOS,则需要为Enterprise Linux(EPEL)存储库配置Extra Packages:

sudo yum install epel-release -y

然后,您可以使用yum安装Ansible:

sudo yum install ansible -y

对于基于Ubuntu的系统,可以从PPA安装Ansible:

sudo apt-get install software-properties-common -y      
sudo apt-add-repository ppa:ansible/ansible
sudo apt-get update
sudo apt-get install ansible -y

如果您使用的是macOS,建议的安装通过Python PIP完成:

sudo pip install ansible

有关其他发行版,请参见 。

使用Ansible库存

Ansible使用称为库存的INI样式文件来跟踪它可能管理的服务器。 默认情况下,该文件位于/ etc / ansible / hosts中 。 在本文中,我将使用示例2中所示的Ansible清单对所需的主机(为简便起见已配对)执行操作:

示例2:Ansible主机文件

[arch]     
nextcloud
prometheus
desktop1
desktop2
vm-host15
[fedora]
netflix
[centos]
conan
confluence
7-repo
vm-server1
gitlab
[ubuntu]
trusty-mirror
nwn
kids-tv
media-centre
nas
[satellite]
satellite
[ocp]
lb00
ocp_dns
master01
app01
infra01

每个组用方括号和组名(例如[group1] )表示,是可以应用于一组服务器的任意组名。 一台服务器可以存在多个组而不会出现问题。 在这种情况下,我具有用于操作系统的组( archubuntucentosfedora )以及服务器功能( ocpSatellite )。 Ansible主机文件可以处理比我正在使用的功能更多的高级功能。 有关更多信息,请参见 。

运行临时命令

将SSH密钥复制到清单中的所有服务器之后,就可以开始使用Ansible了。 Ansible的基本功能是能够运行即席命令。 语法为:

ansible         -a "some command"

例如,如果要更新所有CentOS服务器,则可以运行:

ansible centos -a 'yum update -y'

注意:不必具有基于服务器操作系统的组名。 正如我将要讨论的, 可用于收集此信息。 但是,在尝试使用事实时,发出临时命令变得更加复杂,因此,为了方便起见,如果您管理异构环境,我建议根据操作系统创建一些组。

这将遍历组centos中的每个服务器并安装所有更新。 一个更有用的临时命令是Ansible ping模块,该模块用于验证服务器已准备好接收命令:

ansible all -m ping

这将导致Ansible尝试通过SSH登录库存中的所有服务器。 在示例3中可以看到ping命令的输出被截断了。

示例3:Ansible ping命令输出

nwn | SUCCESS => {     
    "changed": false,
    "ping": "pong"
}
media-centre | SUCCESS => {
    "changed": false,
    "ping": "pong"
}
nas | SUCCESS => {
    "changed": false,
    "ping": "pong"
}
kids-tv | SUCCESS => {
    "changed": false,
    "ping": "pong"
}
...

运行临时命令的功能对于快速任务很有用,但是如果您希望以后能够以可重复的方式运行相同的任务怎么办? 为此,Ansible实现了 。

适用于复杂任务的Ansible剧本

Ansible剧本是一个YAML文件,其中包含Ansible在运行过程中应完成的所有指令。 出于本练习的目的,我不会涉及更高级的主题,例如角色和模板。 如果您想了解更多信息, 是一个很好的起点。

在上一节中,我鼓励您使用ssh-copy-id命令来传播SSH密钥。 但是,本文重点介绍如何以一致,可重复的方式完成任务。 示例4演示了一种以幂等方式确保目标主机上存在SSH密钥的方法。

示例4:Ansible剧本“ push_ssh_keys.yaml”

---     
- hosts: all
  gather_facts: false
  vars:
    ssh_key: '/root/playbooks/files/laptop_ssh_key'
  tasks:
    - name: copy ssh key
      authorized_key:
        key: "{
{ lookup('file', ssh_key) }}"
        user: root

在示例4的剧本中,突出显示了所有关键部分。

-主机:行指示该剧本应评估的主机组。 在这种情况下,它将检查清单中的所有主机。

collect_facts:行指示Ansible尝试查找有关每个主机的详细信息。 我将在以后更详细地研究。 现在,将collect_facts设置为false可以节省时间。

正如人们可能想象的那样, vars:部分用于定义可在整个剧本中使用的变量。 在如示例4中这样的短剧本中,它更多是方便而不是必要。

最后,主要部分由任务指示 。 这是大多数说明所在的位置。 每个任务应有一个名称: 。 这是Ansible正在执行run或playbook执行时显示的内容。

authorized_key:标题是剧本正在使用的Ansible模块的名称。 可以通过ansible-doc -a在命令行上访问有关Ansible模块的信息。 但是,在Web浏览器中查看可能更方便。 提供了很多很好的示例。 要在示例4中运行剧本,只需使用ansible-playbook命令:

ansible-playbook push_ssh_keys.yaml

如果这是第一次在该框中添加SSH密钥,则SSH会提示您输入root用户的密码。

现在,您的服务器已将SSH密钥传播给它,使它的时间变得更有趣了。

古怪的事实

Ansible有能力收集有关目标系统的各种事实。 如果您有大量主机,则可能会花费大量时间。 以我的经验,每台主机可能需要1-2秒,甚至更长的时间; 但是,事实收集有好处。 考虑以下剧本,该剧本用于关闭用户以root用户身份使用密码登录的功能:

示例5:锁定root SSH帐户

---     
- hosts: all
  gather_facts: true
  vars:
  tasks:
    - name: Enabling ssh-key only root access
      lineinfile:
        dest: /etc/ssh/sshd_config
        regexp: '^PermitRootLogin'
        line: 'PermitRootLogin without-password'
      notify:
        - restart_sshd
        - restart_ssh
  handlers:
    - name: restart_sshd
      service:
        name: sshd
        state: restarted
        enabled: true
      when: ansible_distribution == 'RedHat'
    - name: restart_ssh
      service:
        name: ssh
        state: restarted
        enabled: true
      when: ansible_distribution == 'Debian'

在示例5中,仅当发现分发匹配时才使用语句修改sshd_config文件。 在这种情况下,基于Red Hat的发行版将其SSH服务命名为与基于Debian的发行版不同,这是条件语句的目的。 尽管还有其他方法可以达到相同的效果,但该示例有助于说明Ansible事实。 如果要查看默认情况下Ansible收集的所有事实,可以在本地主机上运行安装程序模块:

ansible localhost -m setup |less

Ansible发现的任何事实都可以用来以与示例4中所示的vars:部分相同的方式来基于决策。 区别在于Ansible事实被认为是内置变量,因此不必由管理员定义。

下一步

现在,您具有开始调查Ansible并创建自己的剧本的工具。 Ansible是一种工具,具有如此深的深度,复杂性和灵活性,以致于不可能在一篇文章中涵盖所有内容。 本文应该足以引起您的兴趣并激发您探索Ansible提供的可能性。 在下一篇文章中,我将讨论Copysystemdserviceaptyumvirt用户模块。 我们可以将它们结合起来以创建更新和安装剧本,并创建一个基本的Git服务器来存储所有可能创建的剧本。

翻译自:

ansible自动化

转载地址:http://tgszd.baihongyu.com/

你可能感兴趣的文章
笛卡尔遗传规划Cartesian Genetic Programming (CGP)简单理解(1)
查看>>
mysql 日期时间运算函数(转)
查看>>
初识前端作业1
查看>>
为啥程序会有bug?
查看>>
跨域技术
查看>>
JS里的居民们7-对象和数组转换
查看>>
计算两个日期的时间间隔,返回的是时间间隔的日期差的绝对值.
查看>>
python初体验
查看>>
配置vue,vue脚手架的应用(老版本)
查看>>
linux下防火墙iptables原理及使用
查看>>
经典C面试真题精讲
查看>>
Remove Duplicates from Sorted List解题报告
查看>>
ffmpeg格式转换命令
查看>>
万方数据知识平台 TFHpple +Xpath解析
查看>>
Hive实现oracle的Minus函数
查看>>
秒杀多线程第四篇 一个经典的多线程同步问题
查看>>
RocketMQ配置
查看>>
vs code调试console程序报错--preLaunchTask“build”
查看>>
蚂蚁金服井贤栋:用技术联手金融机构,形成服务小微的生态合力
查看>>
手机通话记录统计分析
查看>>