84、Ansible自动化部署与管理指南

Ansible自动化部署与管理全解析

Ansible自动化部署与管理指南

1. 准备工作

在开始使用Ansible之前,需要进行一系列的准备工作。首先,创建四台虚拟机,分别命名为:
- ansible :作为Ansible控制节点
- host01 :第一个目标节点
- host02 :第二个目标节点
- host03 :第三个目标节点

接下来,执行以下步骤来准备使用这些主机与Ansible配合:
1. 在每台虚拟机上安装Fedora(RHEL也适用)。
2. 对于三个目标节点( host01 host02 host03 ),确保完成以下操作:
- 确保SSH服务正在运行,并且可以从Ansible控制节点访问(必要时打开TCP端口22)。
- 创建一个非root用户账户。在使用playbook时,添加 --ask-become-pass 选项,以便在提升权限时提示输入密码。
- 为该用户设置密码。

在运行Ansible时,使用普通用户账户连接到每个系统,然后使用 sudo 提升到root权限。

2. 设置SSH密钥

登录到控制节点( ansible ),确保它可以访问正在配置的其他三个节点。可以通过DNS服务器访问主机,或者将它们添加到控制节点的 /etc/hosts 文件中。然后设置密钥以访问这些节点,具体步骤如下:
1. 以root用户身份,将想要部署Ansible playbook的每个节点的IP地址和名称添加到 /etc/hosts 文件中,示例如下:

192.168.122.154   host01
192.168.122.94    host02
192.168.122.189   host03
  1. ansible 系统上,生成SSH密钥,以便与每个主机进行无密码通信。可以作为 ansible 主机系统上的普通用户运行此命令和后续的Ansible命令:
$ ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/home/joe/.ssh/id_rsa): <ENTER>
Created directory '/home/joe/.ssh'.
Enter passphrase (empty for no passphrase): <ENTER>
Enter same passphrase again:
Your identification has been saved in /home/joe/.ssh/id_rsa.
Your public key has been saved in /home/joe/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:Wz63Ax1UdZnX+qKDmefSAZc3zoKS791hfaHy+usRP7g joe@ansible
The key's randomart image is:
+---[RSA 3072]----+
|             ...*|
|            .  o+|
|           . . ..|
|          . + +  |
|        S..= * + |
|        o+o + O.o|
|        .ooB.Bo+o|
|          *+O+o.o|
|         ..=BEo  |
+----[SHA256]-----+
  1. 使用 ssh-copy-id 将公钥复制到每个主机的root账户。以下for循环将用户的密码复制到所有三个主机:
$ for i in 1 2 3; do ssh-copy-id joe@host0$i; done
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed:
 "/home/joe/.ssh/id_rsa.pub"
/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
joe@host01's password: <password>

Number of key(s) added: 1
Now try logging into the machine, with:   "ssh 'joe@host01'"
and check to make sure that only the key(s) you wanted were added.

/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed:
 "/home/joe/.ssh/id_rsa.pub"
/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

joe@host02's password: <password> ...
3. 安装Ansible

Ansible软件包可用于RHEL、Fedora、Ubuntu和其他Linux发行版。由于Ansible playbook是从控制节点运行的,因此无需在其目标节点上安装Ansible软件。可以在想要用作控制节点的RHEL、Fedora、Ubuntu或其他Linux系统上安装 ansible 软件包,该控制节点只需能够连接到想要部署的主机节点上运行的SSH服务即可。安装 ansible 软件包的方法如下:
| 系统 | 安装命令 |
| ---- | ---- |
| RHEL 8 | bash<br># subscription-manager repos \<br> --enable ansible-2.9-for-rhel-8-x86_64-rpms<br># dnf install ansible -y<br> |
| Fedora | bash<br># dnf install ansible -y<br> |
| Ubuntu | bash<br>$ sudo apt update<br>$ sudo apt install software-properties-common<br>$ sudo apt-add-repository --yes --update ppa:ansible/ansible<br>$ sudo apt install ansible<br> |

4. 创建清单

简单的清单可以由代表playbook目标的名称和与该名称关联的主机系统组成。以下是一个包含三组静态主机的清单示例:

[ws]
host01
host02
host03

[newyork]
host01

[houston]
host02
host03

将这些条目添加到 /etc/ansible/hosts 文件中,在运行Ansible命令和playbook时即可使用。

5. 主机认证

为确保可以从Ansible系统访问每个主机,使用 ssh 连接到每个主机,应该无需输入密码:

$ ssh joe@host01
Last login: Wed Feb  5 19:28:39 2020 from 192.168.122.208
$ exit

对每个主机重复此操作。

6. 创建playbook

创建一个名为 simple_web.yaml 的playbook,用于在之前定义的 ws 组中的主机上安装和启动Web服务器软件,并检查防火墙软件是否安装和运行,以及防火墙是否打开了端口80(HTTP端口)以访问Web服务器。内容如下:

---
- name: Create web server
  hosts: ws
  remote_user: joe
  become_method: sudo
  become: yes 
  tasks:
  - name: Install httpd
    yum:
      name: httpd
      state: present
  - name: Check that httpd has started
    service:
      name: httpd
      state: started
  - name: Install firewalld
    yum:
      name: firewalld
      state: present
  - name: Firewall access to https
    firewalld:
      service: http
      permanent: yes
      state: enabled
  - name: Restart the firewalld service to load in the firewall 
changes
    service:
      name: firewalld
      state: restarted

以下是对该playbook文件内容的详细解释:
- name :该play被标识为“Create web server”。
- hosts :将此清单应用于 ws 组中的主机。
- remote_user :用于对每个远程系统进行身份验证的普通用户。不允许直接以root身份登录到远程系统是一种良好的安全实践。
- become :启用此功能( yes )告诉Ansible以不同于 remote_user 的用户身份运行任务中的模块。
- become_method :用于提升权限的功能( sudo )。
- become_user :要进行身份验证的用户( root )。
- tasks :开始包含任务的部分。
- 每个任务都有一个 name 作为标题,后面跟着模块名称(如 yum service firewalld 等)。
- yum :检查 httpd 软件包是否存在,如果不存在则安装。
- service :检查 httpd 守护进程是否正在运行( started ),如果未运行则启动它。
- firewalld :使HTTP服务(TCP端口80)的端口立即可用( enabled )并永久设置( permanent: yes )。
- service :重启 firewalld 服务以启用对新HTTP服务防火墙端口的访问。

7. 运行playbook

使用 ansible-playbook 命令运行playbook。在实际运行之前,可以使用 -C 选项测试playbook,使用 -v 选项查看详细输出。需要注意的是,使用 -C 选项运行playbook不能完全测试其正确性,因为后续步骤可能需要先完成前面的步骤。以下是一个以详细模式运行Ansible playbook的示例:

$ ansible-playbook -v simple_web.yaml
Using /etc/ansible/ansible.cfg as config file

PLAY [Create web server] ***************************************

TASK [Gathering Facts] *****************************************
ok: [host03]
ok: [host02]
ok: [host01]

TASK [Install httpd]  
****************************************************************
changed: [host01] => {"changed": true, "msg": "", "rc": 0,
    "results": ["Installed: httpd", ...
changed: [host02] => {"changed": true, "msg": "", "rc": 0,
    "results": ["Installed: httpd", ...
changed: [host03] => {"changed": true, "msg": "", "rc": 0,
    "results": ["Installed: httpd", ...

TASK [Check that httpd has started]  
****************************************************************
changed: [host03] => {"changed": true, "name": "httpd",
    "state": "started", "status":
changed: [host02] => {"changed": true, "name": "httpd",
    "state": "started", "status": ...
changed: [host01] => {"changed": true, "name": "httpd",
    "state": "started", "status": ...
...
TASK [Install firewalld]****************************************
changed: [host03] => {"changed": true, "msg": "", "rc": 0, "results":
    ["Installed: firewalld", "Installed: python3-decorator...
changed: [host02] => {"changed": true, "msg": "", "rc": 0, "results":
    ["Installed: firewalld", "Installed: python3-decorator...
changed: [host01] => {"changed": true, "msg": "", "rc": 0, "results": 
  ["Installed: firewalld"...


TASK [Firewall access to https]*************************************
****
ok: [host03] => {"changed": false, "msg": "Permanent operation,
    (offline operation: only on-disk configs were altered)"}
ok: [host02] => {"changed": false, "msg": "Permanent operation,
    (offline operation: only on-disk configs were altered)"}
ok: [host01] => {"changed": false, "msg": "Permanent operation,
    (offline operation: only on-disk configs were altered)"}

PLAY RECAP *****************************************************
host01: ok=6 changed=4 unreachable=0 failed=0 skipped=0 rescued=0 
ignored=0
host02: ok=6 changed=4 unreachable=0 failed=0 skipped=0 rescued=0 
ignored=0
host03: ok=6 changed=4 unreachable=0 failed=0 skipped=0 rescued=0  
ignored=0

ansible-playbook 的输出会逐步显示每个任务。第一个任务( Gathering Facts )显示 ws 清单中的所有三个主机系统都可以访问。“Install httpd”任务检查每个主机上是否已安装 httpd 软件包,如果未安装则安装。接着检查 httpd 服务的状态,如果未运行则启动它。然后检查每个主机上的 firewalld 软件包是否安装,如果未安装则安装,并添加防火墙规则以允许访问HTTP服务(TCP端口80)并使其永久生效。 PLAY RECAP 显示所有任务的结果。

8. 运行临时Ansible命令

有时可能需要在Ansible管理的节点上执行一次性任务,可以使用临时命令。临时命令可以直接从Ansible命令行调用模块并作用于清单。以下是一些临时命令的示例:
1. 检查清单是否正常运行:

$ ansible ws -u joe -m ping
host03 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    },
    "changed": false,
    "ping": "pong"
}
host02 | SUCCESS => { ...
host01 | SUCCESS => { ...
  1. 检查 ws 清单中主机上的 httpd 服务是否正在运行:
$ ansible ws -u joe -m service \
     -a "name=httpd state=started" --check
host02 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    },
    "changed": false,
    "name": "httpd",
    "state": "started",
    "status": { ...
host 01 | SUCCESS => { ...
  1. ws 清单中的所有主机添加一个 index.html 文件:
$ echo "Hello from your web server!" > index.html
$ ansible ws -m copy -a \
    "src=./index.html dest=/var/www/html/ \
    owner=apache group=apache mode=0644" \
    -b --user joe --become --ask-become-pass
BECOME password: *********
host01 | CHANGED => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    },
    "changed": true,
    "checksum": "213ae4bb07e9b1e96fbc7fe94de372945a202bee",
    "dest": "/var/www/html/index.html",
    "gid": 48,
    "group": "apache",
    "md5sum": "495feb8ad508648cfafcf69681d94f97",
    "mode": "0644",
    "owner": "apache",
    "secontext": "system_u:object_r:httpd_sys_content_t:s0",
    "size": 52,
    "src": "/home/joe/.ansible/tmp/ansible-tmp-1581027374.649223-
29961128730253/source",
    "state": "file",
    "uid": 48
host02 | CHANGED => { ...
host03 | CHANGED => { ...

可以使用 curl 命令从 ansible 主机通过Web服务器访问该文件:

$ curl host01
Hello from your web server!
9. 使用Ansible Tower自动化框架

虽然运行Ansible playbook和命令可以很好地自动化和修改主机集,但对于完全管理的企业,可以使用Ansible Tower添加更大的框架。Ansible Tower提供了一个基于Web的界面,用于使用Ansible playbook和其他组件管理整个IT基础设施。通过将Ansible资产集中在一个地方,可以在一个地方接收通知,并管理企业内的不同管理角色。Ansible Tower界面使持续更新已配置的资产变得容易,无需记住命令行选项,只需点击即可配置和启动Ansible任务。其库存管理是图形化的,作业调度可以通过直观的可视化方式完成。此外,Ansible Tower还提供了REST API,可以帮助将现有的基础设施工具集成到Ansible中。可以从 Ansible Tower网站 了解更多信息。

10. 练习

以下练习可以测试你安装Ansible、创建第一个Ansible playbook和运行一些临时Ansible命令的能力。这些任务假设你正在运行Fedora或Red Hat Enterprise Linux系统(某些任务也适用于其他Linux系统)。
1. 在Fedora或RHEL系统上安装Ansible。
2. 为想要用于这些练习的用户添加sudo权限。
3. 创建一个Ansible playbook(命名为 my_playbook.yaml ),包含以下内容:

---
- name: Create web server
  hosts: localhost
  tasks:
  - name: Install httpd
    yum:
      name: httpd
      state: present
  1. 以检查模式运行 ansible-playbook ,查看完成playbook是否有问题。
  2. 修改 my_playbook.yaml 以提升权限,使任务以root用户身份运行。
  3. 再次运行 ansible-playbook ,直到 httpd 软件包成功安装在系统上。
  4. 再次修改 my_playbook.yaml 以启动 httpd 服务,并设置为系统启动时自动启动。
  5. 运行一个Ansible命令,检查本地主机上的 httpd 服务是否正在运行。
  6. 创建一个包含文本“Web server is up”的 index.html 文件,并使用Ansible命令将该文件复制到本地主机的 /var/www/html 目录。
  7. 使用 curl 命令查看刚刚复制到Web服务器的文件内容。

通过以上步骤,你可以逐步掌握Ansible的使用,实现对多个主机的自动化部署和管理。无论是使用playbook批量执行任务,还是使用临时命令进行即时操作,Ansible都能帮助你提高工作效率,减少手动操作的错误。同时,Ansible Tower为企业级的自动化管理提供了更强大的功能和更友好的界面。希望这些内容对你有所帮助,让你在自动化运维的道路上更进一步。

以下是一个简单的mermaid流程图,展示了使用Ansible部署Web服务器的主要步骤:

graph LR
    A[准备工作] --> B[设置SSH密钥]
    B --> C[安装Ansible]
    C --> D[创建清单]
    D --> E[主机认证]
    E --> F[创建playbook]
    F --> G[运行playbook]
    G --> H[运行临时命令]
    H --> I[使用Ansible Tower]

这个流程图清晰地展示了从准备工作到最终使用Ansible Tower进行企业级管理的整个过程。每个步骤都是后续步骤的基础,按照这个流程操作可以顺利完成Web服务器的自动化部署和管理。

Ansible自动化部署与管理指南(续)

11. 临时命令的应用场景与优势

临时Ansible命令在实际运维中有诸多应用场景和显著优势。

11.1 应用场景
  • 软件安装与更新 :当需要在多个节点上快速安装或更新特定软件包时,临时命令能高效完成。例如,要在 ws 组的所有主机上安装 nginx ,可以使用以下命令:
$ ansible ws -u joe -m yum -a "name=nginx state=present" -b --user joe --become --ask-become-pass
  • 系统配置调整 :对节点的系统配置进行临时修改。比如,修改 hosts 文件以添加域名解析,可使用以下命令:
$ ansible ws -u joe -m lineinfile -a "path=/etc/hosts line='192.168.1.100 test.example.com'" -b --user joe --become --ask-become-pass
  • 故障排查 :在出现问题时,快速检查节点的状态。如检查节点的磁盘使用情况:
$ ansible ws -u joe -m shell -a "df -h"
11.2 优势
  • 灵活性 :无需编写完整的playbook,可根据即时需求直接调用模块执行任务。
  • 高效性 :能迅速对多个节点执行相同操作,节省时间和精力。
  • 针对性 :可以针对特定的主机组或单个主机执行任务,精准解决问题。
12. Ansible Tower的深入应用

Ansible Tower不仅提供了便捷的Web界面,还在多个方面提升了Ansible的管理能力。

12.1 角色与权限管理

Ansible Tower允许创建不同的角色,并为每个角色分配特定的权限。例如,可以创建以下角色:
| 角色 | 权限 |
| ---- | ---- |
| 管理员 | 拥有对所有资产、任务和用户的完全控制权 |
| 运维人员 | 可以查看和执行部分任务,但不能进行系统级的配置更改 |
| 审计人员 | 仅能查看任务执行记录和系统状态 |

通过角色与权限管理,可以确保不同人员只能访问和操作其职责范围内的内容,提高系统的安全性。

12.2 作业模板与调度

作业模板是Ansible Tower的核心功能之一。可以创建作业模板来定义Ansible任务的执行方式,包括目标主机、playbook、参数等。例如,创建一个用于部署Web服务器的作业模板:
1. 登录Ansible Tower的Web界面。
2. 导航到“Templates”(模板)页面,点击“Add”(添加)按钮。
3. 填写模板信息:
- Name (名称):Web Server Deployment
- Job Type (作业类型):Run
- Inventory (清单):选择包含目标主机的清单
- Project (项目):选择包含Web服务器部署playbook的项目
- Playbook :选择相应的playbook文件
- Credentials (凭证):选择用于认证的凭证
4. 点击“Save”(保存)。

作业调度功能允许按照预定的时间或事件触发作业模板的执行。例如,设置每周日凌晨2点执行Web服务器的更新任务:
1. 在作业模板页面,点击作业模板名称进入详情页。
2. 点击“Schedule”(调度)选项卡,点击“Add”(添加)按钮。
3. 配置调度信息:
- Name (名称):Weekly Web Server Update
- Type (类型):Recurring
- Frequency (频率):Weekly
- Start Date/Time (开始日期/时间):设置为每周日凌晨2点
4. 点击“Save”(保存)。

12.3 REST API的使用

Ansible Tower的REST API可以与现有的自动化工具集成。以下是一个使用Python脚本调用Ansible Tower REST API启动作业模板的示例:

import requests
import json

# 配置Ansible Tower信息
tower_url = "https://your-tower-server/api/v2/job_templates/1/launch/"
headers = {
    "Content-Type": "application/json",
    "Authorization": "Bearer your-access-token"
}

# 发送请求启动作业模板
response = requests.post(tower_url, headers=headers)

# 处理响应
if response.status_code == 201:
    print("Job template launched successfully.")
    job_info = json.loads(response.text)
    print(f"Job ID: {job_info['id']}")
else:
    print(f"Failed to launch job template. Status code: {response.status_code}")
    print(response.text)
13. Ansible的最佳实践

为了更好地使用Ansible,以下是一些最佳实践:

13.1 模块化设计

将playbook拆分成多个小的、可复用的模块。例如,将安装Web服务器、配置防火墙等功能分别封装成独立的任务文件,然后在主playbook中引用这些任务文件。这样可以提高代码的可维护性和复用性。

# main.yaml
---
- name: Deploy Web Server
  hosts: ws
  remote_user: joe
  become: yes
  become_method: sudo
  tasks:
    - include_tasks: install_httpd.yaml
    - include_tasks: configure_firewall.yaml

# install_httpd.yaml
---
- name: Install httpd
  yum:
    name: httpd
    state: present
  - name: Start httpd service
    service:
      name: httpd
      state: started
      enabled: yes

# configure_firewall.yaml
---
- name: Install firewalld
  yum:
    name: firewalld
    state: present
  - name: Configure firewall for http
    firewalld:
      service: http
      permanent: yes
      state: enabled
  - name: Restart firewalld service
    service:
      name: firewalld
      state: restarted
13.2 变量管理

使用变量来存储和管理配置信息。可以在playbook中定义变量,也可以使用外部变量文件。例如,在 vars.yaml 文件中定义Web服务器的端口:

# vars.yaml
web_port: 80

在playbook中引用该变量:

---
- name: Configure Web Server
  hosts: ws
  remote_user: joe
  become: yes
  become_method: sudo
  vars_files:
    - vars.yaml
  tasks:
    - name: Configure httpd port
      lineinfile:
        path: /etc/httpd/conf/httpd.conf
        line: "Listen {{ web_port }}"
        state: present
13.3 错误处理与回滚

在playbook中添加错误处理机制,确保在任务失败时能够进行回滚操作。可以使用 rescue always 模块来实现。例如:

---
- name: Deploy Web Server
  hosts: ws
  remote_user: joe
  become: yes
  become_method: sudo
  tasks:
    - name: Install httpd
      yum:
        name: httpd
        state: present
      register: httpd_install_result
      ignore_errors: yes
    - name: Check httpd installation result
      fail:
        msg: "Failed to install httpd."
      when: httpd_install_result.failed
    - name: Rollback if installation failed
      yum:
        name: httpd
        state: absent
      when: httpd_install_result.failed
14. 总结

Ansible是一款强大的自动化工具,通过playbook和临时命令可以高效地完成多个主机的配置管理、软件部署等任务。Ansible Tower进一步提升了Ansible在企业级环境中的管理能力,提供了便捷的Web界面、角色与权限管理、作业调度等功能。

在使用Ansible时,遵循最佳实践可以提高代码的可维护性、复用性和可靠性。无论是小型项目还是大型企业级系统,Ansible都能帮助运维人员减少手动操作,提高工作效率,实现自动化运维的目标。

希望本文能帮助你更好地理解和使用Ansible,在实际工作中发挥其最大的价值。

以下是一个mermaid流程图,展示了Ansible Tower的作业执行流程:

graph LR
    A[创建作业模板] --> B[配置作业参数]
    B --> C[设置调度规则]
    C --> D[触发作业执行]
    D --> E[Ansible Tower调用Ansible执行任务]
    E --> F[任务执行结果反馈]
    F --> G[记录日志与统计信息]

这个流程图清晰地展示了从创建作业模板到最终记录任务执行结果的整个过程,体现了Ansible Tower在作业管理方面的高效性和自动化程度。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值