总览
这是有关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简介 。
首先,安装VirtualBox和Vagrant 。 然后将以下内容放入工作目录中名为“ 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