如何在 Ubuntu 18.04 上安装和配置 Chef

介绍

在本文中,我们将回顾 Chef 软件、它的工作原理以及它为何有用。 我们还将探讨它如何在 DevOps 中发挥作用。 然后,我们将在 Ubuntu 18.04 上安装 Chef。

什么是厨师?

Chef 是一个用 Ruby 和 Erlang 编写的配置管理系统,使用面向对象的语言进行配置描述。 它用于简化配置和维护多个服务器的任务。 它可以集成到云平台中,例如新的 Liquid Web Managed Cloud 和 VMWare 平台来管理服务器的配置过程。

必须记住,有两种类型的配置管理:

  1. 推送配置 – 当中央服务器向其他服务器发送配置时,例如,Ansible 使用这种方案。 当有设备并且您不确定它们此时是否可用时,这可能很有用。
  2. 拉取配置 – 当节点不时检查服务器并提取信息和配置时,例如,Chef 使用此方案。

此外,必须记住它使用基础设施即代码方法。 这种方法使用软件通过配置文件而不是手动管理来管理基础设施描述和管理。

DevOps 与其他内部部门一起,通过确定哪些任务应该自动化来开始使用它。 食谱和食谱描述了这些过程。 然后使用其他工具对它们进行测试,例如 ChefSpec(作为模拟运行的一部分检查资源和配方的平台)。 当一切都按预期工作时,食谱和食谱将放在 Chef 服务器上并使用 Knife 工具运行。 该工具允许用户更无缝地使用该软件。

组件

Chef 由三个主要组件组成:

  • Chef Workstation – 启动所有更改、创建更新和保存记录的中央服务器。 来自工作站的信息也被发送到中央服务器。
  • Chef ServerInfra – 这是在所有设备之间提供连接的组件。 在 Master 上创建的食谱、食谱和策略被发送到服务器,由工作节点存储和提取它们。
  • Chef Worker Nodes – 软件服务器管理这些设备。 需要时,内部机制允许工作节点使用客户端连接到主服务器以获取更新、新策略和其他更改。

工具

Chef 使用以下工具:

  • 配方 – 这是一个配置文件,其中包含一组用于管理基础架构的属性。 它们在客户端启动期间加载,并与节点的现有特征进行比较。
  • Cookbook – 这是食谱的集合,是上传到服务器的主要构建块。 当软件运行时,它确保保存在其中的配方将使给定的基础设施处于配方中指定的状态。

大厨的优势

  • 它完全自动化部署。
  • 它可以很好地与数千个节点一起工作。
  • 它可以快速更新和安装更改。
  • Chef 不断检查和监控整个系统,因此所有故障都会被记录和监控。
  • 使用 Ruby 语言。

厨师的缺点

  • 一个显着的缺点是食谱管理。 这些需要不断地检查、编辑和维护。
  • 为该工具编写脚本需要扎实的代码知识,这会使工作变得更加复杂。

Chef 如何集成到 DevOps 中?

首先,让我们定义我们在本文中经常遇到的术语“DevOps”。 DevOps 是一组实践和方法论,旨在以使用自动化工具的各种专家的持续集成和交互为代价来提高开发过程和软件运行的效率。

必须了解,DevOps 不仅仅是自动化工具的集成,还包括方法论和哲学,它们为测试、开发和利用等各个部门和团队的协作铺平了道路。 简而言之,DevOps 的主要任务是自动化公司中的大多数职责和流程。 DevOps 中的 Chef 用于配置管理的服务器自动化,它可以自动化许多服务器和其他公司设备上的流程和任务。

以下是 DevOps 使用 Chef 作为服务器自动化工具的一些优势:

  • 顺序和可扩展性——所有设备不断获得相同的安装、更新和软件部署,为设备提供相同的状态并代表稳定性。
  • 快速部署 – 速度和准确性是任何项目的关键特性。 该软件提供了一个配置良好的系统,降低了手动配置的必要性,降低了出错的风险。
  • 它与多个系统和云技术集成。
  • 该软件还充当基础架构存储库。 它可用于从头开始重新创建存储库。
  • 没有必要从一开始就描述所有的食谱; 许多现成的模板已经过检查,可以让您节省时间。

安装和配置 Chef

我们将使用三台 Ubuntu 18.04 服务器进行安装。

厨师 主要的 服务器

  • 主机名:服务器厨师
  • IP地址:192.168.1.101

厨师工作站

  • 主机名:工作站
  • IP地址:192.168.1.102

托管节点

  • 主机名:客户端节点
  • IP地址:192.168.1.103

如果您不知道如何查找 IP,请运行以下命令查找 IP 地址。

root@server-chef:~# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether 08:00:27:54:1c:ed brd ff:ff:ff:ff:ff:ff
    inet 10.0.2.15/24 brd 10.0.2.255 scope global dynamic eth0
       valid_lft 86363sec preferred_lft 86363sec
    inet6 fe80::a00:27ff:fe54:1ced/64 scope link
       valid_lft forever preferred_lft forever
3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether 08:00:27:61:75:dc brd ff:ff:ff:ff:ff:ff
    inet 192.168.1.101/24 brd 192.168.1.255 scope global eth1
       valid_lft forever preferred_lft forever
    inet6 fe80::a00:27ff:fe61:75dc/64 scope link
       valid_lft forever preferred_lft forever
root@server-chef:~#

配置主机文件

掌握

接下来,我们需要将 IP 添加到 /etc/hosts 每个服务器上的文件。 为此,请运行以下命令。

root@server-chef:~# tee -a /etc/hosts<<EOF
e> 192.168.1.101 server-chef
> 192.168.1.102 workstation
> 192.168.1.103 client-node
> EOF
192.168.1.101 server-chef
192.168.1.102 workstation
192.168.1.103 client-node
root@server-chef:~#

验证和复制

让我们检查一下我们是否成功了。

root@server-chef:~# cat /etc/hosts
127.0.0.1 localhost
127.0.1.1 server-chef server-chef

# The following lines are desirable for IPv6 capable hosts
::1 localhost ip6-localhost ip6-loopback
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters

192.168.1.101 server-chef
192.168.1.102 workstation
192.168.1.103 client-node
root@server-chef:~#

工作站

现在让我们在其他服务器上运行相同的命令。

root@workstation:~# tee -a /etc/hosts<<EOF
> 192.168.1.101 server-chef
> 192.168.1.102 workstation
> 192.168.1.103 client-node
E> EOF
192.168.1.101 server-chef
192.168.1.102 workstation
192.168.1.103 client-node
root@workstation:~#

客户节点

root@client-node:~# tee -a /etc/hosts<<EOF
> 192.168.1.101 server-chef
> 192.168.1.102 workstation
> 192.168.1.103 client-node
> EOF
192.168.1.101 server-chef
192.168.1.102 workstation
192.168.1.103 client-node
root@client-node:~#

检查更改是否已使用命令,就像我们在 server-chef 上做的一样。 要更新三台服务器上的系统,请运行以下命令。

root@server-chef:~# apt update && apt -y upgrade
0 upgraded, 0 newly installed, 0 to remove, and 0 not upgraded.
root@server-chef:~#

厨师服务器安装

中央服务器充当工作站和节点之间的主要连接点。 在工作站上更改和编辑配置时,会将它们发送到主服务器,然后所有节点从该服务器提取更改。

下载并安装厨师

root@server-chef:~# wget https://packages.chef.io/files/stable/chef-server/13.1.13/ubuntu/18.04/chef-server-core_13.1.13-1_amd64.deb

之后,我们将把软件安装到系统上。

root@server-chef:~# dpkg -i chef-server-core_*.deb
Selecting previously unselected package chef-server-core.
(Reading database ... 105623 files and directories currently installed.)
Preparing to unpack chef-server-core_13.1.13-1_amd64.deb ...
Unpacking chef-server-core (13.1.13-1) ...
Setting up chef-server-core (13.1.13-1) ...
root@server-chef:~#

要使用命令行运行 Chef 服务,我们将使用 厨师-服务器-ctl 效用。 类型 是的 在配置期间接受许可。

root@server-chef:~# chef-server-ctl reconfigure
+---------------------------------------------+
            Chef License Acceptance

Before you can continue, 3 product licenses
must be accepted. View the license at
https://www.chef.io/end-user-license-agreement/

Licenses that need accepting:
  * Chef Infra Server  * Chef Infra Client  * Chef InSpec

Do you accept the 3 product licenses (yes/no)?

> yes  
...
Running handlers:
Running handlers complete
Chef Infra Client finished, 482/1032 resources updated in 02 minutes 29 seconds
Chef Server Reconfigured!
root@server-chef:~#

现在我们检查正在运行的服务的状态。

root@server-chef:~# chef-server-ctl status
run: bookshelf: (pid 24765) 182s; run: log: (pid 18093) 272s
run: nginx: (pid 24591) 185s; run: log: (pid 18742) 214s
run: oc_bifrost: (pid 24467) 187s; run: log: (pid 17831) 294s
run: oc_id: (pid 24584) 186s; run: log: (pid 17858) 289s
run: opscode-erchef: (pid 24779) 183s; run: log: (pid 18237) 269s
run: opscode-expander: (pid 24649) 184s; run: log: (pid 17960) 277s
run: opscode-solr4: (pid 24624) 184s; run: log: (pid 17896) 283s
run: postgresql: (pid 24443) 187s; run: log: (pid 17312) 306s
run: rabbitmq: (pid 25526) 165s; run: log: (pid 19009) 211s
run: redis_lb: (pid 18311) 263s; run: log: (pid 18310) 263s
root@server-chef:~#

设置 SSH 密钥

接下来,我们将使用 SSH 私钥创建管理员和组织。 首先,让我们开始一个目录。

root@server-chef:~# mkdir .chef
root@server-chef:~#

要创建管理用户,我们使用 厨师-服务器-ctl 再次命令。 对变量 USER_NAME 和 FIRST_NAME ‘PASSWORD’ 使用您的特定值,例如 example 以下。

chef-server-ctluser-createUSER_NAMEFIRST_NAMELAST_NAMEEMAIL'PASSWORD'--filenameFILE_NAME

需要注意的是,我们应该使用类似于 chefadmin.pem 的名称,其中 .pem 是 FILE_NAME 变量中的 RSA 密钥。 使用你的价值观:

root@server-chef:~# chef-server-ctl user-create chefadmin Katherine Liquidweb [email protected] 'BYNSS' --filename ~/.chef/chefadmin.pem
root@server-chef:~#

让我们检查服务器上的用户列表。

root@server-chef:~# chef-server-ctl user-list
chefadmin
pivotal
root@server-chef:~#

现在我们将使用 chef-server-ctl 命令创建一个组织文件。

chef-server-ctl org-create chef-org "YOUR ORGANIZATION" --association_user USER_NAME --filename FILE_NAME

在这里也使用你的价值观。

root@server-chef:~# chef-server-ctl org-create chef-org "Liquid Web Chef Infrastructure" --association_user chefadmin --filename ~/.chef/chef-org.pem
root@server-chef:~#

现在让我们检查服务器上的组织。

root@server-chef:~# chef-server-ctl org-list
chef-org
root@server-chef:~#

我们已经安装并配置了 Chef 服务器。

工作站安装和配置

Chef 工作站是用户创建食谱的地方。 食谱是配置设置的块,用于创建用于完成各种任务的食谱。 让我们下载并安装 Workstation 软件。

安装工作站

root@workstation:~# wget https://packages.chef.io/files/stable/chef-workstation/0.2.43/ubuntu/18.04/chef-workstation_0.2.43-1_amd64.deb

root@workstation:~# dpkg -i chef-workstation_*.deb

设置存储库

接下来,运行命令以创建存储 Cookbook 的存储库。

root@workstation:~# chef generate repo chef-repo

创建目录

现在,要创建存储 Knife 配置和 RSA 密钥的目录,请运行此命令。

root@workstation:~# mkdir ~/chef-repo/.chef
root@workstation:~#

让我们进入目录:

root@workstation:~# cd chef-repo/
root@workstation:~/chef-repo#

生成 SSH 密钥

现在我们将为工作站身份验证生成 SSH 密钥,以获得对 Chef 服务器的访问权限。

root@workstation:~/chef-repo# ssh-keygen -b 4096
Generating public/private rsa key pair.
Enter file in which to save the key (/home/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/.ssh/id_rsa.
Your public key has been saved in /home/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:QY5TxH+NJnsNYSR7Ai8Gixu9LmNnAxY6HuxaO6MpXwI root@workstation
The key's randomart image is:
+---[RSA 4096]----+
| .o= ... |
| o B.o oo |
| + = =.+..+ |
| . . + + ooo= . |
|E = + . S = o |
| + + o . . . |
| = = = . |
|.+o= = . |
|=ooo |
+----[SHA256]-----+
root@workstation:~/chef-repo#

接下来,将密钥复制到带有 Workstation 的 Chef 服务器。

root@workstation:~/chef-repo# ssh-copy-id [email protected]

/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/home/.ssh/id_rsa.pub"
The authenticity of host '192.168.1.101 (192.168.1.101)' can't be established.
ECDSA key fingerprint is SHA256:yEsdeqtMxrUnxc67qj0v15wIgXbSELQQg2qRc2+j0s4.
Are you sure you want to continue connecting (yes/no)? yes
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
Password:

Number of key(s) added: 1

验证和共享 SSH 密钥

现在,使用此命令登录以确保密钥存在。

root@workstation:~/chef-repo# ssh '[email protected]'

现在我们要复制chefadmin.pem。 和 chef-org.pem 从 Chef 服务器到工作站。 文件必须有 .pem 延期。

root@workstation:~/chef-repo# scp [email protected]:~/.chef/*.pem ~/chef-repo/.chef/
The authenticity of host '192.168.1.101 (192.168.1.101)' can't be established.
ECDSA key fingerprint is SHA256:yEsdeqtMxrUnxc67qj0v15wIgXbSELQQg2qRc2+j0s4.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '192.168.1.101' (ECDSA) to the list of known hosts.
chefadmin.pem 100% 1678 2.4MB/s 00:00
chef-org.pem 100% 1674 4.4MB/s 00:00
root@workstation:~/chef-repo#

要验证文件是否已复制,请在 .chef 文件夹上运行 ls。

root@workstation:~/chef-repo# ls ~/chef-repo/.chef
chefadmin.pem chef-org.pem
root@workstation:~/chef-repo#

添加版本控制

在 Workstation 上工作时,对 Cookbooks 进行了许多更改。 为了跟踪这些更改,我们使用 chef-repo 目录中的 create git repositories 命令创建了一个版本控制系统。 首先,我们需要退出目录。

root@workstation:~/chef-repo# cd ..

设置 Git

现在我们将添加一个用户名和电子邮件地址来设置 git。

root@workstation:~# git config --global user.name BYNSS
root@workstation:~# git config --global user.email [email protected]
root@workstation:~#

将文件添加到 .Gitignore

接下来,我们将目录 .chef 添加到 .gitignore,因为 Chef 需要系统文件才能正常工作。 为此,请运行以下命令。

root@workstation:~# echo ".chef" /chef-repo/.gitignore
.chef /chef-repo/.gitignore
root@workstation:~#
root@workstation:~# cd chef-repo/
root@workstation:~/chef-repo#

Git 添加/提交

现在让我们运行 混帐添加git 提交.

root@workstation:~/chef-repo# git add .
root@workstation:~/chef-repo#
root@workstation:~/chef-repo# git commit -m "first commit"
root@workstation:~/chef-repo#

检查 Git 状态

root@workstation:~/chef-repo# git status
On branch master
nothing to commit, working tree clean
root@workstation:~/chef-repo#

Chef Workstation 的安装和配置完成。 现在我们可以开始创建食谱了。

创建食谱

首先,我们需要离开目录来创建 Cookbook。

root@workstation:~/chef-repo# cd ..
root@workstation:~#
root@workstation:~# chef generate cookbook BYNSS_cookbook
Generating cookbook BYNSS_cookbook
- Ensuring correct cookbook file content
- Committing cookbook files to git
- Ensuring delivery configuration
- Ensuring correct delivery build cookbook content
- Adding delivery configuration to feature branch
- Adding build cookbook to feature branch
- Merging delivery content feature branch to master
Your cookbook is ready. Type `cd BYNSS_cookbook` to enter it.

有几个命令可以运行以开始在本地开发和测试你的说明书。 输入 `delivery local –help` 以查看完整列表。

我们还可以查看存储在 test/integration/default/default_test.rb 中的默认测试说明书。 可以在此处找到默认配方。

recipes/default.rb

生成食谱

现在我们将使用 Chef 为应用程序创建一个 chef-repo。 这也将初始化目录。

root@workstation:~# chef generate app chef-repo

配置刀

Knife 是 Chef 的命令行工具,用于管理节点、Cookbook 和食谱。 要配置它,我们需要创建一个配置文件 配置文件 并添加以下行。

root@workstation:~# nano chef-repo/.chef/config.rb

current_dir = File.dirname(__FILE__)
log_level :info
log_location STDOUT
node_name 'chefadmin'
client_key "chefadmin.pem"
validation_client_name 'chef-org-validator'
validation_key "chef-org-validator.pem"
chef_server_url 'https://server-chef/organizations/chef-org'
cache_type 'BasicFile'
cache_options( :path => "#{ENV['HOME']}/.chef/checksums" )
cookbook_path ["#{current_dir}/../cookbooks"]

在这个参数中,我们需要添加我们的 URL。

chef_server_url ‘https://server-chef/organizations/chef-org’

接下来,进入 chef-repo 目录。

root@workstation:~# cd chef-repo/
root@workstation:~/chef-repo#

复制 SSL

现在使用 Knife 命令行工具复制 SSL 证书。 需要注意的是,Knife 没有办法验证证书是否正确。 因此,我们应该在下载后验证这些证书的真实性。

root@workstation:~/chef-repo# knife ssl fetch
WARNING: Certificates from server-chef will be fetched and placed in your trusted_cert
directory (/home/chef-repo/.chef/trusted_certs).
Adding certificate for server-chef in /home/chef-repo/.chef/trusted_certs/server-chef.crt
root@workstation:~/chef-repo#

验证配置

现在,验证配置文件是否已正确安装和配置。

root@workstation:~/chef-repo# knife client list
chef-org-validator
root@workstation:~/chef-repo#

为节点安装和配置引导程序

Bootstrap 在 Workstation 上安装 Chef 客户端以配置节点与 Chef 主服务器通信。 节点可以在初始运行时使用客户端节点的用户名和密码从 Chef 主服务器读取配置。 使用的用户名和密码是在服务器上配置的。 您可以创建和配置一个将预先运行 Chef 命令的特殊用户。

我们将使用以下命令连接到节点。

knife bootstrap YOUR_IP_NODES -x NAME_USER -P PASSWORD --node-name NAME_NODE --sudo

Values: 
YOUR_IP_NODES - your IP which Node has;
NAME_USER - user for work of Node;
PASSWORD - for connection; 
NAME_NODE - Node name.

这就是它的样子。

root@workstation:~/chef-repo# knife bootstrap 192.168.1.103 -x BYNSS -P BYNSS.com --node-name client-node-1 --sudo
192.168.1.103 Chef Client finished, 0/0 resources updated in 01 seconds
root@workstation:~/chef-repo#

现在,让我们检查找到了哪些节点。

root@workstation:~/chef-repo# knife node list
client-node-1
root@workstation:~/chef-repo#

要获取有关节点的更多信息,请运行此命令。

root@workstation:~/chef-repo# knife node show client-node
Node Name: client-node-1
Environment: _default
FQDN: client-node
IP: 192.168.1.103
Run List:
Roles:
Recipes:
Platform: ubuntu 18.04
Tags:
root@workstation:~/chef-repo#

到此阶段,安装和配置就完成了。

结论

在本文中,我们更详细地安装和研究了 Chef,并了解了它的功能。 我们还发现了如何安装 Master Chef 服务器、Chef Workstation、Chef 客户端、Knife、Cookbooks,以及如何为 Chef 使用 Git 存储库。 我们应该注意到,要掌握这个工具需要持续的工作,但我们已经为您开始与 Chef 合作的旅程提供了坚实的基础。