|
|
51CTO旗下网站
|
|
挪动端

运用Ansible让你的零碎办理主动化

精进你的零碎办理才能和 通博8888官网 技艺,学习怎样设置东西来简化办理多台呆板。近程办理东西有许多,SaltStack、Puppet、Chef,以及 Ansible 都是很盛行的选择。在本文中,我将重点放在 Ansible 上并会表明它是怎样帮到你的,不论你是有 5 台照旧 1000 台假造机。

作者:Steve Ovens泉源:通博8888官网中国|2018-02-10 18:35

运用Ansible让你的零碎办理主动化

精进你的零碎办理才能和 通博8888官网 技艺,学习怎样设置东西来简化办理多台呆板。

你能否想精进你的零碎办理才能和 通博8888官网 技艺?大概你的当地局域网上跑了一些工具,而你又想让生存更轻松一点--那该怎样办呢?在本文中,我会向你演示怎样设置东西来简化办理多台呆板。

近程办理东西有许多,SaltStack、Puppet、Chef,以及 Ansible 都是很盛行的选择。在本文中,我将重点放在 Ansible 上并会表明它是怎样帮到你的,不论你是有 5 台照旧 1000 台假造机。

让我们从多机(不论这些呆板是假造的照旧物理的)的根本办理开端。我假定你晓得要做什么,有根底的 通博8888官网 办理技艺(至多要有能找出实行每个义务详细步调的才能)。我会向你演示怎样运用这一东西,而能否运用它由你本人决议。

什么是 Ansible?

Ansible 的网站大将之表明为 “一个超等复杂的 IT 主动化引擎,可以主动停止云供应、设置装备摆设办理、使用摆设、效劳外部编排,以及其他许多 IT 需求。” 经过在一个会合的地位界说好效劳器聚集,Ansible 可以在多个效劳器上实行相反的义务。

假如你对 Bash 的 for 循环很熟习,你会发明 Ansible 操纵跟这很相似。区别在于 Ansible 是幕等的idempotent。浅显来说便是 Ansible 普通只要在的确会发作改动时才实行所恳求的举措。比方,假定你实行一个 Bash 的 for 循环来为多个呆板创立用户,像如许子:

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

这会在 serverA、serverB,以及 serverC 上创立 myuser 用户;但是不论这个用户能否存在,每次运转这个 for 循环时都市实行 useradd 下令。一个幕等的零碎会起首反省用户能否存在,只要在不存在的状况下才会去创立它。固然,这个例子很复杂,但是幕等东西的益处将会随着工夫的推移变得越创造显。

Ansible 是怎样任务的?

Ansible 会将 Ansible playbooks 转换成经过 SSH 运转的下令,这在办理类 UNIX 情况时有许多劣势:

  1. 绝大少数类 UNIX 呆板默许都开了 SSH。
  2. 依赖 SSH 意味着近程主机不需求有署理。
  3. 大少数状况下都无需装置额定的软件,Ansible 需求 2.6 或更新版本的 Python。而绝大少数 通博8888官网 刊行版默许都装置了这一版本(或许更新版本)的 Python。
  4. Ansible 无需主节点。他可以在任何装置有 Ansible 并能经过 SSH 拜访的主机上运转。
  5. 固然可以在 cron 中运转 Ansible,但默许状况下,Ansible 只会在你明白要求的状况下运转。 

设置装备摆设 SSH 密钥认证

运用 Ansible 的一种常用办法是设置装备摆设无需暗码的 SSH 密钥登录以方便办理。(可以运用 Ansible Vault 来为暗码等敏感信息提供维护,但这不在本文的讨论范畴之内)。如今只需求运用上面下令来天生一个 SSH 密钥,如示例 1 所示。

  1. [09:44 user ~]$ ssh-keygen
  2. Generating public/private rsa key pair
  3. Enter file in which to save the key (/home/user/.ssh/id_rsa):
  4. Created directory '/home/user/.ssh'
  5. Enter passphrase (empty for no passphrase):
  6. Enter same passphrase again:
  7. Your identification has been saved in /home/user/.ssh/id_rsa
  8. Your public key has been saved in /home/user/.ssh/id_rsa.pub
  9. The key fingerprint is:
  10. SHA256:TpMyzf4qGqXmx3aqZijVv7vO9zGnVXsh6dPbXAZ+LUQ user@user-fedora
  11. The key's randomart image is:
  12. +---[RSA 2048]----+
  13. | |
  14. | |
  15. | E |
  16. | o . .。|
  17. | . + S o+。|
  18. | . .o * . .+ooo|
  19. | . .+o o o oo+。*|
  20. |。.ooo* o。* .*+|
  21. | . o+*BO.o+ .o|
  22. +----[SHA256]-----+

示例 1 :天生一个 SSH 密钥

在示例 1 中,间接按下回车键来承受默许值。任何非特权用户都能天生 SSH 密钥,也能装置到近程零碎中任何用户的 SSH 的 authorized_keys 文件中。天生密钥后,还需求将之拷贝到近程主机上去,运转上面下令:

  1. ssh-copy-id root@servera

留意:运转 Ansible 自身无需 root 权限;但是假如你运用非 root 用户,你需求为要实行的义务设置装备摆设适宜的 sudo 权限。

输出 servera 的 root 暗码,这条下令会将你的 SSH 密钥装置到近程主机上去。装置好 SSH 密钥后,再经过 SSH 登录近程主机就不再需求输出 root 暗码了。

装置 Ansible

只需求在示例 1 中天生 SSH 密钥的那台主机上装置 Ansible。若你运用的是 Fedora,输出上面下令:

  1. sudo dnf install ansible -y

若运转的是 CentOS,你需求为 EPEL 堆栈设置装备摆设额定的包:

  1. sudo yum install epel-release -y

然后再运用 yum 来装置 Ansible:

  1. sudo yum install ansible -y

关于基于 Ubuntu 的零碎,可以从 PPA 上装置 Ansible:

  1. sudo apt-get install software-properties-common -y
  2. sudo apt-add-repository ppa:ansible/ansible
  3. sudo apt-get update
  4. sudo apt-get install ansible -y

若你运用的是 macOS,那么引荐经过 Python PIP 来装置:

  1. sudo pip install ansible

关于其他刊行版,请拜见 Ansible 装置文档

Ansible Inventory

Ansible 运用一个 INI 作风的文件来追踪要办理的效劳器,这种文件被称之为库存清单Inventory。默许状况下该文件位于 /etc/ansible/hosts。本文中,我运用示例 2 中所示的 Ansible 库存清单来对所需的主机停止操纵(为了简便起见曾经停止了裁剪):

  1. [arch]
  2. nextcloud
  3. prometheus
  4. desktop1
  5. desktop2
  6. vm-host15
  7.  
  8. [fedora]
  9. netflix
  10.  
  11. [centos]
  12. conan
  13. confluence
  14. 7-repo
  15. vm-server1
  16. gitlab
  17.  
  18. [ubuntu]
  19. trusty-mirror
  20. nwn
  21. kids-tv
  22. media-centre
  23. nas
  24.  
  25. [satellite]
  26. satellite
  27.  
  28. [ocp]
  29. lb00
  30. ocp_dns
  31. master01
  32. app01
  33. infra01

示例 2 : Ansible 主机文件

每个分组由中括号和组名标识(像如许 [group1] ),是使用于一组效劳器的恣意组名。一台效劳器可以存在于多个组中,没有任何题目。在这个案例中,我有依据操纵零碎停止的分组(archubuntucentosfedora),也有依据效劳器功用停止的分组(ocpsatellite)。Ansible 主机文件可以处置比这庞大的多的状况。细致内容,请参阅 库存清单文档

运转下令

将你的 SSH 密钥拷贝到库存清单中一切效劳器上后,你就可以开端运用 Ansible 了。Ansible 的一项根本功用便是运转特定数令。语法为:

  1. ansible -a "some command"

比方,假定你想晋级一切的 CentOS 效劳器,可以运转:

  1. ansible centos -a 'yum update -y'

留意:不是必需要依据效劳器操纵零碎来停止分组的。我上面会提到,Ansible Facts 可以用来搜集这一信息;但是,若运用 Facts 的话,则运转特定数令会变得很庞大,因而,假如你在办理异构情况的话,那么为了方便起见,我引荐创立一些依据操纵零碎来分别的组。

这会遍历 centos 组中的一切效劳器并装置一切的更新。一个愈加有效的下令应该是 Ansible 的 ping 模块了,可以用来验证效劳器能否预备好承受下令了:

  1. ansible all -m ping

这会让 Ansible 实验经过 SSH 登录库存清单中的一切效劳器。在示例 3 中可以看到 ping 下令的局部输入后果。

  1. nwn | SUCCESS => {
  2. "changed":false
  3. "ping":"pong"
  4. }
  5. media-centre | SUCCESS => {
  6. "changed":false
  7. "ping":"pong"
  8. }
  9. nas | SUCCESS => {
  10. "changed":false
  11. "ping":"pong"
  12. }
  13. kids-tv | SUCCESS => {
  14. "changed":false
  15. "ping":"pong"
  16. }
  17. ...

示例 3 :Ansible ping 下令输入

运转指定数令的才能有助于完成疾速义务(LCTT 译注:应该指的那种一次性义务),但是假如我想在当前也能以异样的方法运转异样的义务那该怎样办呢?Ansible playbooks 便是用来做这个的。

庞大义务运用 Ansible playbooks

Ansible 脚本playbook 便是包括 Ansible 指令的 YAML 款式的文件。我这里不计划解说相似 Roles 和 Templates 这些比拟深邃的内容。有兴味的话,请阅读 Ansible 文档

在前一章节,我引荐你运用 ssh-copy-id 下令来通报你的 SSH 密钥;但是,本文存眷于怎样以一种分歧的、可反复性的方法来完成义务。示例 4 演示了一种以冥等的方法,即便 SSH 密钥曾经存在于目的主机上也能包管准确性的完成办法。

  1. ---
  2. - hosts:all
  3. gather_facts:false
  4. vars:
  5. ssh_key:'/root/playbooks/files/laptop_ssh_key'
  6. tasks:
  7. - name:copy ssh key
  8. authorized_key:
  9. key:"{{ lookup('file',ssh_key) }}"
  10. user:root

示例 4:Ansible 脚本 “pushsshkeys.yaml”

- hosts: 行标识了这个脚本应该在谁人主机组上实行。在这个例子中,它会反省库存清单里的一切主机。

gather_facts: 行指明 Ansible 能否去搜刮每个主机的细致信息。我稍后会做一次更细致的反省。如今为了节流工夫,我们设置 gather_factsfalse

vars: 局部,望文生义,便是用来界说脚本中所用变量的。在示例 4 的这个冗长脚本中实在不是须要的,但是按常规我们照旧设置了一个变量。

最初由 tasks: 标注的这个局部,是寄存主体指令的中央。每个义务都有一个 -name:。Ansbile 在运转脚本时会表现这个名字。

authorized_key: 是脚本所运用 Ansible 模块的名字。可以经过下令 ansible-doc -a 来盘问 Ansible 模块的相干信息; 不外经过网络阅读器检查 文档 能够更方便一些。authorized_key 模块 有许多很好的例子可以参考。要运转示例 4 中的脚本,只需运转 ansible-playbook 下令就行了:

  1. ansible-playbook push_ssh_keys.yaml

假如是第一次添加 SSH 密钥,SSH 会提示你输出 root 用户的暗码。

如今 SSH 密钥曾经传输到效劳器中去了,可以来做点风趣的事了。

运用 Ansible 搜集信息

Ansible 可以搜集目的零碎的种种信息。假如你的主机数目许多,那它会特殊的耗时。按我的经历,每台主机大约要花个 1 到 2 秒钟,乃至更永劫间;但是偶然搜集信息是有益处的。思索上面这个脚本,它会制止 root 用户经过暗码近程登录零碎:

  1. ---
  2. - hosts:all
  3. gather_facts:true
  4. vars:
  5. tasks:
  6. - name:Enabling ssh-key only root access
  7. lineinfile:
  8. dest:/etc/ssh/sshd_config
  9. regexp:'^PermitRootLogin'
  10. line:'PermitRootLogin without-password'
  11. notify:
  12. - restart_sshd
  13. - restart_ssh
  14.  
  15. handlers:
  16. - name:restart_sshd
  17. service:
  18. name:sshd
  19. state:restarted
  20. enabled:true
  21. when:ansible_distribution == 'RedHat'
  22. - name:restart_ssh
  23. service:
  24. name:ssh
  25. state:restarted
  26. enabled:true
  27. when:ansible_distribution == 'Debian'

示例 5:锁定 root 的 SSH 拜访

在示例 5 中 sshd_config 文件的修正是有条件 的,只要在找到婚配的刊行版的状况下才会实行。在这个案例中,基于 Red Hat 的刊行版与基于 Debian 的刊行版对 SSH 效劳的定名是纷歧样的,这也是运用条件语句的目标地点。固然也有其他的办法可以到达相反的结果,但这个例子很好演示了 Ansible 信息的作用。若你想检查 Ansible 默许搜集的一切信息,可以在当地运转 setup 模块:

  1. ansible localhost -m setup |less

Ansible 搜集的一切信息都能用来做判别,就跟示例 4 中 vars: 局部所演示的一样。所差别的是,Ansible 信息被当作是内置 变量,无需由零碎办理员界说。

更近一步

如今可以开端探究 Ansible 并创立本人的根本了。Ansible 是一个富有深度、庞大性和灵敏性的东西,只靠一篇文章不行能就把它讲透。盼望本文可以激起你的兴味,鼓舞你去探究 Ansible 的功用。在下一篇文章中,我会再聊聊 Copysystemdserviceaptyumvirt,以及 user 模块。我们可以在脚本中组合运用这些模块,还可以创立一个复杂的 Git 效劳器来存储这些一切脚本。

【编辑引荐】

  1. 【理论】怎样定制嵌入式通博8888官网刊行版
  2. 神不知鬼不晓,运用Shell剧本掩饰笼罩通博8888官网效劳器上的操纵陈迹
  3. Gerg:关于Meltdown和Spectre影响下的通博8888官网内核情况
  4. 为通博8888官网初学者解说wc下令
  5. 怎样启动进入通博8888官网下令行
【责任编辑:庞桂玉 TEL:(010)68476606】

点赞 0
各人都在看
猜你喜好

读 书 +更多

通博8888官网指令速查手册

通博8888官网是一款开源的操纵零碎,失掉了广阔开辟者的喜爱。掌握通博8888官网零碎的指令及其用法是学习通博8888官网零碎的根底。本书细致地引见了常用通博8888官网指令...

订阅51CTO邮刊

点击这里检查样刊

订阅51CTO邮刊