Ansible自动化所有事情:第一部分

总览

这是有关Ansible的两部分教程的一部分。 在这一部分中,您将学习什么是Ansible,如何安装和配置Ansible,以及如何安装本地Vagrant集群以对其进行测试。 然后,您将发现清单,模块,临时命令,剧本,运行策略,块和库。

什么是Ansible?

Ansible是一种配置管理和编排工具。 它与Puppet,Chef和Saltstack在同一域中运行。 这意味着,使用Ansible,您可以远程供应整个远程服务器,在其上安装和部署软件,以及对其进行远程跟踪。

Ansible是一个用Python实现的开源项目,具有可插拔的体系结构,其模块可以管理几乎所有的操作系​​统,云环境以及系统管理工具或框架。 如果您想做一些特别的事情,也可以使用自己的插件轻松扩展它。

Ansible的独特功能之一是它不会在托管计算机上安装任何软件。 它通过SSH远程管理计算机。 要管理远程计算机,只需确保您的公共SSH密钥在该计算机的authorized_keys文件中。

Ansible入门

Ansible可以在控制计算机上运行,​​并且可以管理运行任何操作系统的服务器,但目前该控制计算机不能为Windows计算机。 在本教程中,我将使用Mac OS X作为控制机。

安装

Ansible需要Python 2.6或2.7。 要安装它,请键入:

pip install ansible

在Mac OS X上,建议增加文件句柄的数量:

sudo launchctl limit maxfiles 1024 unlimited

如果看到类似“打开的文件太多”的错误,则可能需要这样做。

要验证Ansible是否已正确安装,请键入ansible --version 。 您应该看到:

ansible 2.0.0.2

  config file =

  configured module search path = Default w/o overrides

当然,版本号可能不同。

Ansible配置文件

Ansible的配置文件可让您控制许多选项。 搜索顺序为:

  • ANSIBLE_CONFIG(环境变量)
  • ansible.cfg(在当前目录中)
  • .ansible.cfg(在主目录中)
  • /etc/ansible/ansible.cfg

您还可以使用单个环境变量来覆盖特定设置,这些环境变量优先于配置文件。

查阅Ansible文档以了解所有选项。

设置流浪者集群

要真正了解Ansible的功能,您需要一堆服务器来进行管理。 就本教程而言,我将使用由3个VM组成的Vagrant集群,但就Ansible而言,这些只是它需要管理的一些主机。 要了解有关Vagrant的更多信息,请查看Vagrant简介

首先,安装VirtualBoxVagrant 。 然后将以下内容放入工作目录中名为“ Vagrantfile”的文件中

# -*- mode: ruby -*-

# vi: set ft=ruby :

hosts = {

  "larry" => "192.168.88.10",

  "curly" => "192.168.88.11",

  "moe" => "192.168.88.12"

}

Vagrant.configure("2") do |config|

  config.vm.box = "precise64"

  config.vm.box_url = "http://files.vagrantup.com/precise64.box"

 hosts.each do |name, ip|

    config.vm.define name do |machine|

      machine.vm.network :private_network, ip: ip

      machine.vm.provider "virtualbox" do |v|

        v.name = name

      end

    end

  end

end

然后输入vagrant up 。 Vagrant将为您创建三个虚拟机,分别是larry,curl和moe。 要验证,请输入“ vagrant status 。 您应该看到:

Current machine states:



larry                     running (virtualbox)

curly                     running (virtualbox)

moe                       running (virtualbox)



This environment represents multiple VMs. The VMs are all listed

above with their current state. For more information about a specific

VM, run `vagrant status NAME`.

要确保可以SSH进入群集主机,请输入: vagrant ssh-config >> ~/.ssh/config

现在,您可以使用主机名通过SSH进入任何虚拟服务器。 例如: ssh curly 。 这将使Ansible通过SSH连接到群集主机,而不会出现用户名,密码或密钥的任何问题。

库存

现在我们有了一个集群,我们需要告诉Ansible。 这是使用清单文件完成的。 清单文件是使用INI文件格式按组组织的主机名列表。 将以下内容放入工作目录中名为“ hosts”的文件中。

[funny]

 larry

 

 [funnier]

 curly

 moe

我将“ larry”放在“ funny”组中,其他主机放在“ funnier”组中。 该组织将使我们能够对这些小组采取行动。 您还可以在单​​个主机和所有主机上执行操作。

模组

Ansible具有非常模块化和可扩展的体系结构。 它的所有功能都组织在模块中。 有核心模块和额外模块。 每个模块代表一个命令,大多数模块带有参数。 您可以直接在即席命令或剧本中使用模块。 您可以阅读文档中的所有模块。

临时命令

现在该动手了。 使用Ansible的最简单方法是运行临时命令。 临时命令使用模块。 即席命令的格式为:

ansible <host group> -i <inventory file> -m <module> [-a <argument 1>, ... <argument N>]

例如,要查看清单中的所有主机是否都已启动,可以使用ping模块(不带参数):

ansible all -i hosts -m ping

curly | SUCCESS => {

    "changed": false,

    "ping": "pong"

}

larry | SUCCESS => {

    "changed": false,

    "ping": "pong"

}

moe | SUCCESS => {

    "changed": false,

    "ping": "pong"

}

Ansible有许多模块可用于所有常见的系统管理任务,例如文件管理,用户管理和软件包管理,以及许多不常见的任务。 但是,如果找不到所需的内容,或者只是对普通的shell命令感到更满意,则可以直接使用shell模块,包括管道。 以下命令提取所有主机的内部和外部IP地址:

ansible all -i hosts -m shell -a '/sbin/ifconfig | grep inet.*Bcast'"



larry | SUCCESS | rc=0 >>

          inet addr:10.0.2.15  Bcast:10.0.2.255  Mask:255.255.255.0

          inet addr:192.168.88.10  Bcast:192.168.88.255  Mask:255.255.255.0



curly | SUCCESS | rc=0 >>

          inet addr:10.0.2.15  Bcast:10.0.2.255  Mask:255.255.255.0

          inet addr:192.168.88.11  Bcast:192.168.88.255  Mask:255.255.255.0



moe | SUCCESS | rc=0 >>

          inet addr:10.0.2.15  Bcast:10.0.2.255  Mask:255.255.255.0

          inet addr:192.168.88.12  Bcast:192.168.88.255  Mask:255.255.255.0

剧本

当您想在一堆主机上快速执行某些操作时,临时命令非常有用,但是Ansible的真正功能在于它的剧本。 剧本是YAML文件,您可以在其中定义任务集合以实现诸如设置,配置,部署和编排基础结构之类的目标。

剧本范例

在深入了解细节之前,让我们看一看典型的剧本是什么样子。

---

- hosts: funnier

  tasks:

   - name: Install Nginx

     apt: pkg=nginx state=installed update_cache=true

     notify: Start Nginx

   - name: Install Python 3

     apt: pkg=python3-minimal state=installed

  handlers:

    - name: Start Nginx

      service: name=nginx state=started

该剧本有一个主机部分,您可以在其中从清单文件中指定主机。 在这种情况下,组名称为“ funnier”。 然后有一个任务部分,其中包含安装Nginx和Python 3的两个任务。最后,还有一个处理程序部分,其中Nginx在安装后启动。

运行剧本

您可以使用ansible-playbook命令运行剧本。 您仍然需要提供清单文件和要运行的剧本。 将工作簿保存到工作目录中名为“ playbook.yml”的文件中。 试一试吧:

ansible-playbook -i hosts playbook.yml



PLAY ***************************************************************************



TASK [setup] *******************************************************************

ok: [moe]

ok: [curly]



TASK [Install Nginx] ***********************************************************

fatal: [moe]: FAILED! => {"changed": false, "failed": true, "msg": "Failed to lock apt for exclusive operation"}

fatal: [curly]: FAILED! => {"changed": false, "failed": true, "msg": "Failed to lock apt for exclusive operation"}



PLAY RECAP *********************************************************************

curly                      : ok=1    changed=0    unreachable=0    failed=1

moe                        : ok=1    changed=0    unreachable=0    failed=1

不好了。 发生了什么? Ansible在此处给出了一个不错的错误消息:“无法锁定易于进行独占操作”。 许多剧本将需要sudo特权。 这本剧本也不例外。 要使用sudo特权运行剧本,只需添加--sudo标志:

ansible-playbook -i hosts playbook.yml --sudo



PLAY ***************************************************************************



TASK [setup] *******************************************************************

ok: [curly]

ok: [moe]



TASK [Install Nginx] ***********************************************************

changed: [moe]

changed: [curly]



TASK [Install Python 3] ********************************************************

changed: [moe]

changed: [curly]



RUNNING HANDLER [Start Nginx] **************************************************

changed: [moe]

changed: [curly]



PLAY RECAP *********************************************************************

curly                      : ok=4    changed=3    unreachable=0    failed=0

moe                        : ok=4    changed=3    unreachable=0    failed=0

Ansible是幂等的,这意味着如果某物已经处于所需状态,则Ansible将使其不理会。 在ansible-playbook的输出中,您可以查看成功或失败的任务以及更改的主机。

让我们再次运行同一本剧本。 什么都应该改变:

ansible-playbook -i hosts playbook.yml --sudo



PLAY ***************************************************************************



TASK [setup] *******************************************************************

ok: [moe]

ok: [curly]



TASK [Install Nginx] ***********************************************************

ok: [curly]

ok: [moe]



TASK [Install Python 3] ********************************************************

ok: [curly]

ok: [moe]



PLAY RECAP *********************************************************************

curly                      : ok=3    changed=0    unreachable=0    failed=0

moe                        : ok=3    changed=0    unreachable=0    failed=0

运行策略

在Ansible 2.0之前,按任务线性执行播放。 所有目标主机都执行了第一个任务。 只有当所有主机都完成了第一个任务后,它们才能开始第二个任务。

Ansible 2.0添加了运行策略的概念。 当前有两种策略:我上面介绍的“线性”策略(这是默认策略)和“免费”策略,在该策略中主机仍可以自由顺序执行剧本中的任务,但不能与其他主机同步进行。

如果数百个主机需要从某些FTP服务器下载多个文件,这可能会很有用。 第一个主机可能会完成第一个文件的下载并移至下一个文件,而其他主机仍在忙于下载第一个文件。 到其他主机下载下一个文件时,第一个主机已经完成,争用减少了。

在大多数情况下,免费策略似乎更为优越。 您只需添加一个strategy: free键值对添加到剧本。

- hosts: all

  strategy: free

  tasks:

  ...

积木

Ansible 2.0的另一个新功能是块。 块使您可以将任务分组在一起。 如果您有只需要在特定条件下执行的任务,这将非常有用。 以前,您必须分别为每个任务执行此操作。

---

- hosts: all

  tasks:

    - debug: msg='Task 1 here'

      when: ansible_distribution == 'Ubuntu'



    - debug: msg='Task 2 here'

      when: ansible_distribution == 'Ubuntu'



    - debug: msg='Task 3 here'

      when: ansible_distribution == 'Ubuntu'

使用块,您可以将所有这些调试任务组合在一起,并将“何时”条件置于块级别。

- hosts: all

  tasks:

    - block:

      - debug: msg='Task 1 here'

      - debug: msg='Task 2 here'

      - debug: msg='Task 3 here'

      when: ansible_distribution == 'Ubuntu'

避难所

Ansible通过SSH与远程计算机进行通信,但是剧本可能包含诸如用户名,密码和API密钥之类的机密。 由于您通常将剧本存储在git之类的源代码控制系统中,因此具有读取权限的任何人都可以看到此信息。

Ansible通过ansible-vault程序提供帮助,该程序使您可以创建,编辑和重新加密加密文件。 通过提供密码,可以在运行剧本时动态解密这些文件。 如果将--vault-ask-pass标志添加到--vault-ask-pass playbook,则它将提示您输入Vault密码。

或者,您可以添加--vault-password-file <password file> ,Ansible将从--vault-password-file <password file>读取密码。 如果使用密码文件,请不要将其存储在源代码管理中!

现在,您可以安全地将加密文件存储在源代码管理中,而不必担心有人发现您的秘密。 您需要仔细管理您的保险库密码。 如果丢失了该文件,则将无法解密该文件库中的文件。

结论

Ansible是一个很棒的工具。 它是轻量级的。 它可以与ad-hoc命令交互使用,并且可以很好地扩展到大型系统。 它也有很大的动力和强大的社区。 如果您管理或什至只使用远程服务器,则需要Ansible。

请继续关注第二部分。

翻译自: https://code.tutsplus.com/tutorials/automate-all-the-things-with-ansible-part-one--cms-25931

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值