ansible自动化
您想提高您的系统管理或Linux技能吗? 也许您的本地LAN上运行着一些东西,并且想让您的生活更轻松-从哪里开始? 在本文中,我将解释如何设置工具以简化多台计算机的管理。
对于远程管理工具,SaltStack,Puppet,Chef和Ansible是一些受欢迎的选择。 在整篇文章中,我将重点介绍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
这将在serverA , serverB和serverC上创建myuser ; 但是,无论用户是否存在,它都会在每次运行for循环时运行一次user add命令。 幂等系统将首先检查用户是否存在,如果不存在,该工具将创建该用户。 当然,这是一个简化的示例,但是随着时间的推移,幂等工具的优势将变得更加明显。
Ansible如何运作?
Ansible将Ansible剧本转换为通过SSH运行的命令,在管理类似Unix的环境时,它具有许多好处:
- 默认情况下,大多数(如果不是全部)类似Unix的计算机将运行SSH。
- 依靠SSH意味着远程主机上不需要任何代理。
- 在大多数情况下,不需要安装其他软件,因为Ansible需要Python 2.6才能运行。 大多数(如果不是全部)Linux发行版都默认安装了此版本(或更高版本)。
- Ansible不需要主节点。 它可以从安装了Ansible软件包且具有足够SSH访问权限的任何主机上运行。
- 尽管可以在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库存
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] )表示,是可以应用于一组服务器的任意组名。 一台服务器可以存在多个组而不会出现问题。 在这种情况下,我具有用于操作系统的组( arch , ubuntu , centos , fedora )以及服务器功能( ocp , Satellite )。 Ansible主机文件可以处理比我正在使用的功能更多的高级功能。 有关更多信息,请参见清单文档 。
运行临时命令
将SSH密钥复制到清单中的所有服务器之后,就可以开始使用Ansible了。 Ansible的基本功能是能够运行即席命令。 语法为:
ansible
-a "some command"
例如,如果要更新所有CentOS服务器,则可以运行:
ansible centos -a 'yum update -y'
注意:不必具有基于服务器操作系统的组名。 正如我将要讨论的, Ansible Facts可用于收集此信息。 但是,在尝试使用事实时,发出临时命令变得更加复杂,因此,为了方便起见,如果您管理异构环境,我建议根据操作系统创建一些组。
这将遍历组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浏览器中查看文档可能更方便。 authorized_key模块提供了很多很好的示例。 要在示例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提供的可能性。 在下一篇文章中,我将讨论Copy , systemd , service , apt , yum , virt和用户模块。 我们可以将它们结合起来以创建更新和安装剧本,并创建一个基本的Git服务器来存储所有可能创建的剧本。
翻译自: https://opensource.com/article/17/7/automate-sysadmin-ansible
ansible自动化