在Ubuntu 20.04上安装和设置Ansible

在本教程中,我们将学习如何在Ubuntu 20.04上安装和设置Ansible。 Ansible 是一个简单的无代理IT自动化工具。它通过SSH协议处理配置管理,应用程序部署,云配置,临时任务执行,网络自动化和多节点编排。 Ansible使用负载平衡器轻松进行复杂的更改,例如零停机滚动更新。

在Ubuntu 20.04上安装和设置Ansible

由于使用Ansible通过SSH协议管理远程主机,因此在其上安装Ansible的节点(在本例中为Ubuntu 20.04系统)将成为控制节点。

运行系统更新

在继续之前,请确保您的系统程序包缓存是最新的;

sudo apt update

在Ubuntu 20.04上安装Ansible

Ubuntu 20.04默认存储库包含Ansible的最新稳定发行版。

sudo apt-cache policy ansible
ansible:
  Installed: (none)
  Candidate: 2.9.6+dfsg-1
  Version table:
     2.9.6+dfsg-1 500
        500 http://ke.archive.ubuntu.com/ubuntu focal/universe amd64 Packages
        500 http://ke.archive.ubuntu.com/ubuntu focal/universe i386 Package

因此,您只需执行以下命令即可安装ansible。

sudo apt install ansible

安装完成后,可以按以下方式检查安装Ansible的版本。

ansible --version
ansible 2.9.6
  config file = /etc/ansible/ansible.cfg
  configured module search path = ['/home/koromicha/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules']
  ansible python module location = /usr/lib/python3/dist-packages/ansible
  executable location = /usr/bin/ansible
  python version = 3.8.2 (default, Apr 27 2020, 15:53:34) [GCC 9.3.0]

在Ubuntu 20.04控制节点上设置Ansible

现在,Ansible已安装在Ubuntu 20.04控制节点上,是时候对其进行设置,以使您能够通过SSH协议在远程主机上自动部署任务。

设置Ansible库存

一个 Ansible库存 是列出或定义要通过Ansible管理的主机的文件。 /etc/ansible/hosts 是默认的Ansible库存文件。也可以将自定义文件定义为Ansible库存文件。使用非默认清单文件时,必须使用以下命令指定其路径 -i 运行ansible时选择。

库存文件还可以用于存储与库存中特定主机或组有关的变量值。

在清单文件中:

  • 您可以使用可解析的主机名或IP地址指定主机的详细信息,
  • 一组主机由 [header] 元素
  • 主机名/ IP地址可以是多个组的成员

请参阅以下示例,以创建具有未分组主机,分组主机和一系列主机的主机文件。

在本教程中,我将在主目录中创建清单。

mkdir $HOME/ansible
vim $HOME/ansible/hosts

注意:任何单个主机((未分组的主机))都应在任何组头之前指定。

# Ungrouped list of hosts
server01.kifarunix-demo.com
192.168.58.5

# Range of hosts
192.168.56.[111:112]

[webapps]
app[01:04].kifarunix-demo.com

# Grouped Hosts
[database]
db[01:03].kifarunix-demo.com
db05.kifarunix-demo.com
db07.kifarunix-demo.com

保存并退出文件。

您可以使用 ansible-inventory 命令。例如,以YAML格式显示上面的主机列表的内容;

ansible-inventory -i $HOME/ansible/hosts --list -y
all:
  children:
    database:
      hosts:
        db01.kifarunix-demo.com: {}
        db02.kifarunix-demo.com: {}
        db03.kifarunix-demo.com: {}
        db05.kifarunix-demo.com: {}
        db07.kifarunix-demo.com: {}
    ungrouped:
      hosts:
        192.168.56.111: {}
        192.168.56.112: {}
        192.168.58.5: {}
        server01.kifarunix-demo.com: {}
    webapps:
      hosts:
        app01.kifarunix-demo.com: {}
        app02.kifarunix-demo.com: {}
        app03.kifarunix-demo.com: {}
        app04.kifarunix-demo.com: {

阅读更多 如何建立可用的库存

设置Ansible SSH密钥身份验证

生成SSH密钥

默认情况下,使用无密码SSH密钥认证是Ansible用于管理远程主机的常用方法之一。因此,您需要生成无密码的SSH密钥,并将密钥复制到要使用Ansible管理的远程主机。

ssh-keygen

要生成无密码的SSH密钥,只需按ENTER键即可输入空密码。

Generating public/private rsa key pair.
Enter file in which to save the key (/home/koromicha/.ssh/id_rsa): 
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /home/koromicha/.ssh/id_rsa
Your public key has been saved in /home/koromicha/.ssh/id_rsa.pub
The key fingerprint is:
SHA256:Ba9LyP0epsCPIVN5nvIVT9zgnLCRL1P/dmgiAvWjbMc [email protected]
The key's randomart image is:
+---[RSA 3072]----+
|        .        |
|         o .     |
|        . * o    |
|     . = + X =   |
|      * S B B o  |
|     o * * B   o |
|    o = O E o o +|
|     o O B o o ..|
|      . + .      |
+----[SHA256]-----+

了解更多有关其他连接方法的信息 Ansible连接插件 页。

将密钥复制到远程主机

接下来,将密钥复制到远程主机。 使用具有sudo权限的远程用户。

for i in 192.168.58.5 192.168.56.111 192.168.56.112; do ssh-copy-id -o StrictHostKeyChecking=no [email protected]$i; done

在此演示中,我们将使用具有无密码sudo权限的用户。要使用户能够使用sudo运行命令而不提示输入密码,请在受管理的远程主机上运行以下命令。

echo "johndoe ALL=(ALL:ALL) NOPASSWD: ALL" > /etc/sudoers.d/johndoe

阅读更多 Ansible权限升级页面

测试与远程主机的安全连接

Ansible使用ping模块来验证清单文件中定义的远程主机的可访问性。以下是我们的测试清单;

ansible-inventory -i $HOME/ansible/demo --list -y
all:
  children:
    centos:
      hosts:
        192.168.56.111: {}
        192.168.56.112: {}
    ungrouped: {}

以用户身份测试连接 johndoe,我们在上面复制了其键;

ansible -i $HOME/ansible/demo -m ping -u johndoe all
192.168.56.111 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/libexec/platform-python"
    },
    "changed": false,
    "ping": "pong"
}
192.168.56.112 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/libexec/platform-python"
    },
    "changed": false,
    "ping": "pong"
}

192.168.56.111和192.168.56.112均为CentOS 8服务器。

运行Ansible临时命令

如果您有很少重复的任务,则临时命令非常方便。使用临时命令,您可以管理用户帐户,服务,程序包,运行临时系统命令(如检查可用RAM),收集系统事实。

要查看一些示例,请使用ping命令检查远程系统是否具有Internet连接;

 ansible -i $HOME/ansible/demo -a "ping 8.8.8.8 -c 3" all -u johndoe

检查可用内存;

ansible -i $HOME/ansible/demo -a "free -h" all -u johndoe
192.168.56.112 | CHANGED | rc=0 >>
              total        used        free      shared  buff/cache   available
Mem:          818Mi       234Mi       196Mi        10Mi       387Mi       444Mi
Swap:         819Mi          0B       819Mi
192.168.56.111 | CHANGED | rc=0 >>
              total        used        free      shared  buff/cache   available
Mem:          818Mi       230Mi       214Mi        10Mi       373Mi       452Mi
Swap:         819Mi          0B       819Mi

以用户身份安装软件包,例如vim编辑器 johndoe 具有sudo权限(--become);

ansible -i $HOME/ansible/demo -m apt -m yum -a "name=vim state=present" all -u johndoe --become

进一步了解ad-hoc命令 临时命令简介

使用Ansible剧本

剧本是Ansible的配置,部署和编排语言。它们定义了要在远程主机上执行的角色和任务(用于设置特定过程的一组步骤)。

在本演示中,我们将介绍两个简单的剧本示例。

  • 创建用户帐户
  • 安装软件包

因此,在继续之前,请创建Ansible角色目录。 Ansible Roles定义了变量,任务,文件,模板和任何其他ansible制品的集合。

对于我们的示例,我们将扮演两个角色, useraccountapache,用于定义要创建的用户帐户和要安装的软件包。

以下是我们的简单示例Roles目录结构;

myplaybooks
	site.yml
	roles/
	     useraccounts
		tasks/
                     main.yml
	     webserver/
		tasks/
                     main.yml

按照上述结构创建相关目录;

mkdir -p myplaybooks/roles/{useraccounts/tasks,webserver/tasks}

创建主要的剧本site.yml以定义适用于所有其他任务的值;

vim myplaybooks/site.yml
---
#
# A common Playbook to Create a user accounts.
#
- hosts: all 
  remote_user: johndoe
  become: yes
  roles:
  - { role: useraccounts }
  - { role: webserver }

Ansible Playbook创建用户帐户

按照上面我的角色目录结构,用于创建用户帐户的剧本。因此,创建一个文件,您将在其中定义要创建的用户的详细信息。

vim myplaybooks/roles/useraccounts/tasks/main.yml
---
#
# Create a user account
#
- name: Add User Jane Doe to the system
  user:
          name: janedoe
          password: "{{ 'strongpassword' | password_hash('sha512') }}"
          groups: wheel
          shell: /bin/bash
          comment: Jane Doe
          expires: 1584993090

Ansible Playbook安装Apache Web服务器

同样,创建任务文件以在Ubuntu 20.04和CentOS 8系统上安装Apache Web服务器。

vim myplaybooks/roles/webserver/tasks/main.yml
---
#
# Install Apache Web server on CentOS 8
#
- name: Install Apache on CentOS 8
  yum:
          name: httpd
          update_cache: yes
          state: latest

列出主要的Ansible Playbook任务;

ansible-playbook myplaybooks/site.yml --list-tasks -i demo
playbook: myplaybooks/site.yml

  play #1 (all): all	TAGS: []
    tasks:
      useraccounts : Add User Jane Doe to the system	TAGS: []
      webserver : Install Apache on CentOS 8	TAGS: []

运行Ansible Playbook空运行检查

要在不对远程主机进行任何更改的情况下检查您的剧本,请使用 --check 选项。

ansible-playbook myplaybooks/site.yml --check -i $HOME/ansible/demo
PLAY [all] *****************************************************************************************************************************************************************

TASK [Gathering Facts] *****************************************************************************************************************************************************
ok: [192.168.56.112]
ok: [192.168.56.111]

TASK [useraccounts : Add User Jane Doe to the system] **********************************************************************************************************************
changed: [192.168.56.112]
changed: [192.168.56.111]

TASK [webserver : Install Apache on CentOS 8] ******************************************************************************************************************************
changed: [192.168.56.111]
changed: [192.168.56.112]

PLAY RECAP *****************************************************************************************************************************************************************
192.168.56.111             : ok=3    changed=2    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
192.168.56.112             : ok=3    changed=2    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

执行Ansible Playbook

确认以上检查没有错误后,请继续执行剧本;

ansible-playbook myplaybooks/site.yml -i $HOME/ansible/demo
PLAY [all] *****************************************************************************************************************************************************************

TASK [Gathering Facts] *****************************************************************************************************************************************************
ok: [192.168.56.112]
ok: [192.168.56.111]

TASK [useraccounts : Add User Jane Doe to the system] **********************************************************************************************************************
changed: [192.168.56.111]
changed: [192.168.56.112]

TASK [webserver : Install Apache on CentOS 8] ******************************************************************************************************************************
changed: [192.168.56.111]
changed: [192.168.56.112]

PLAY RECAP *****************************************************************************************************************************************************************
192.168.56.111             : ok=3    changed=2    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
192.168.56.112             : ok=3    changed=2    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0 

验证使用Ansible创建的用户帐户和安装的软件包

您可以创建另一个主剧本来验证用户帐户是否 珍妮多 通过检查服务是否可用来创建和检查是否安装了Apache。这两个都可以使用检查 Ansible getent模块

vim myplaybooks/check.yml
---
- hosts: centos
  remote_user: johndoe
  become: yes
  gather_facts: no  # or it will fail on the setup step
  tasks:
          - name: Check if user Jane Doe (janedoe) is created.
            getent:
                  database: passwd
                  key: janedoe
          - name: Check if Apache service exists.
            getent:
                  database: services
                  key: http

执行剧本;

ansible-playbook myplaybooks/check.yml -i $HOME/ansible/demo
PLAY [centos] **************************************************************************************************************************************************************

TASK [Check if user Jane Doe (janedoe) is created.] ************************************************************************************************************************
ok: [192.168.56.112]
ok: [192.168.56.111]

TASK [Check if Apache service exists.] *************************************************************************************************************************************
ok: [192.168.56.112]
ok: [192.168.56.111]

PLAY RECAP *****************************************************************************************************************************************************************
192.168.56.111             : ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
192.168.56.112             : ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

然后你去。

这标志着我们教程的结尾,说明了如何在Ubuntu 20.04上安装和设置Ansible。我们希望这是有益的。请享用。

进一步阅读

Ansible入门

其他教程

在Ubuntu 20.04上安装和部署Kubernetes集群

在Ubuntu 20.04上安装Docker CE

在CentOS 8上设置GlusterFS分布式复制卷

Sidebar