前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >学习如何安装Ansible和运行Playbooks

学习如何安装Ansible和运行Playbooks

作者头像
GongAo啊_
发布2018-09-10 12:24:04
4.8K0
发布2018-09-10 12:24:04
举报
文章被收录于专栏:Maroon1105Maroon1105

考虑管理服务器机队的单调; 让它们全部更新,将更改推送给它们,复制文件等。事情可能会很快变得复杂和耗时,但它不一定是这样。

Ansible是一个有用的工具,允许您创建计算机组,描述应如何配置这些计算机或应对其执行哪些操作,并从中心位置发出所有这些命令。它使用SSH,因此无需在您要定位的计算机上安装任何内容。Ansible只能在你的主控制器上运行,甚至可以是你的笔记本电脑!它是解决复杂问题的简单方法。

本指南将向您介绍Ansible的基础知识。在本指南的最后,您将拥有将全新的Linode转换为简单的Web服务器(Apache,MySQL,PHP),易于复制和调整所需的工具。

注意本指南是为非root用户编写的。需要提升权限的命令带有前缀sudo。如果您不熟悉该sudo命令,可以查看我们的“ 用户和组”指南。某些系统可能要求您以root身份运行Ansible命令。如果是这样,请ansible在本指南中使用前缀命令sudo

安装Ansible

只需要在控制机器或运行命令的机器上安装Ansible 。这可能是您经常访问服务器的笔记本电脑或其他计算机,或者它可能是更复杂的设置中的中央服务器。

确保控制计算机上有Python 2(版本2.6或2.7)或Python 3(版本3.5和更高版本)。请注意,不支持Windows作为控制计算机。您可以从源代码构建Ansible,也可以使用下面的正确命令安装最新的稳定软件包。

MacOS

代码语言:javascript
复制
sudo easy_install pip
sudo pip install ansible

CentOS / Fedora

代码语言:javascript
复制
sudo yum install ansible

注意可能需要在某些版本的CentOS,RHEL和Scientific Linux上添加EPEL-Release存储库。

Ubuntu

代码语言:javascript
复制
sudo apt-get install software-properties-common
sudo apt-add-repository ppa:ansible/ansible
sudo apt-get update
sudo apt-get install ansible

配置Ansible 第一步

现在你已经安装了Ansible,让我们在已知的服务器上测试它。所有Ansible命令都通过命令行执行(或在脚本中批处理),并遵循以下模式:

代码语言:javascript
复制
ansible server_or_group -m module_name -a arguments

我们将在短时间内访问组,但是现在,让我们尝试与使用ping模块的现有服务器建立简单连接。代替server_or_group,使用密钥身份验证键入您当前可以从计算机SSH进入的服务器的名称。如果您使用的是非标准SSH端口,请在同一行(myserver.com:2222)上的冒号后包含该端口。

默认情况下,Ansible将使用与当前计算机用户名相同的用户名。如果这不匹配,请使用-u username参数传递正确的用户名。

注意如果您不想使用SSH密钥,可以添加--ask-pass交换机。

要在没有任何其他设置的情况下尝试Ansible命令,我们现在将添加一些额外的参数。格式化测试命令,如下所示:

代码语言:javascript
复制
ansible all -i myserver.com, -m ping

注意额外指令是all -i服务器名称后的逗号和逗号。这是暂时的,只是告诉Ansible尝试在没有库存文件的情况下直接连接到服务器,我们将在稍后了解。

如果您成功,您应该看到类似于以下内容的输出:

代码语言:javascript
复制
myserver.com | success >> {
    "changed": false,
    "ping": "pong"
}

您只能通过Ansible获得与服务器的有效连接!

使用Ansible的库存文件

您针对一个客户端执行了Ansible命令,但是每次都必须键入主机的地址会很麻烦,如果您想要将相同的配置应用到多个服务器,该怎么办?这是Ansible的库存文件发挥作用的地方。

默认情况下,库存文件应该是/etc/ansible/hosts。如果该路径和文件尚不存在,请创建该路径和文件。 如果您正在运行OS X,您可能想在其他地方创建自己的Ansible目录,然后在Ansible配置文件中设置路径: mkdir ~/Path/To/ansible touch ~/Path/To/ansible/hosts touch ~/.ansible.cfg 打开~/.ansible.cfg文件并添加以下行: 〜/ .ansible.cfg1 2 3 [defaults] inventory = ~/Path/To/ansible/hosts

在hosts文件中添加一个条目,指向上一节中连接到的服务器。您可以使用域或IP地址在此文件中包含多个服务器,甚至可以对它们进行分组: 〜/路径/要/ ansible /主机1 2 3 4 5 6 mainserver.com myserver.net:2222 [mailservers] mail1.mainserver.com mail2.mainserver.com

使用该all指令hosts通过Ansible ping 文件中的所有服务器: ansible all -m ping

对于hosts文件中的每个服务器,您应该收到与以前相同的输出。请注意all,您可以mailservers从示例文件中替换它,而不是仅针对这些服务器运行。

您可以大量自定义库存文件,因此如果您有兴趣,请查看相关文档

通过Playbooks 进行Ansible配置

Ansible中的Playbooks定义了一系列要运行的操作,并解决了特定的服务器集。重要的是要注意,与其他配置工具不同,剧本不描述机器的状态,Ansible确定需要自己进行的所有更改。但是,剧本应该被设计为幂等的,这意味着它们可以不止一次地运行而没有负面影响。例如,一个playbook可能有一个任务,它为服务器设置一个配置文件并注入一些变量。应编写剧本,以便Ansible可以获取模板配置文件,将其与实际文件进行比较,并仅在必要时创建/更新它。幸运的是,许多Ansible模块可以解决繁重的问题。

您可以编写playbooks来执行初始服务器配置,添加用户和目录,确保安装或卸载某些软件包,移动文件等。一个playbook也可以在一组机器上运行一些命令,切换到另一组运行不同的命令,然后切换回原始或不同的一组机器。它是程序性的,任务按顺序从上到下运行。

playbook是一个YAML文件,通常遵循以下结构:

示例Playbook YAML文件

1 2 3 4 5 6

--- - hosts: [target hosts] remote_user: [yourname] tasks: - [task 1] - [task 2]

例如,以下playbook将登录到marketingservers组中的所有服务器并确保Apache已启动。

样品服务检查手册

1 2 3 4 5 6 7 8

--- - hosts: [marketingservers] remote_user: webadmin tasks: - name: Ensure the Apache daemon has started service: name=httpd state=started become: yes become_method: sudo

在上面的剧本中是一个任务的例子:

Playbook任务

1 2 3 4 5

tasks: - name: Ensure the Apache daemon has started service: name=httpd state=started become: yes become_method: sudo

每个任务都应该有一个名称,该名称已记录,可以帮助您跟踪进度。名称行后面是将运行的模块(在本例中为服务模块),其他属性提供了更多选项,在这种情况下,指示Ansible使用sudo权限(稍后我们将配置)。

运行Playbooks 永久链接

执行一个playbook比运行像我们之前做的ad-hoc命令更容易。假设您与playbook文件位于同一目录中,请运行以下命令:

代码语言:javascript
复制
ansible-playbook myplaybook.yml

如果你想看看这个剧本会影响哪些主持人而不必打开YAML文件,你可以运行:

代码语言:javascript
复制
ansible-playbook myplaybook.yml --list-hosts

您可以运行固定链接的任务类型

Ansible附带了大量模块,您可以将这些模块作为任务运行或通过ad-hoc命令运行。要查看所有可用模块的列表,请运行:

代码语言:javascript
复制
ansible-doc -l

您可能有兴趣首先学习的一些常见核心模块包括:

通过Ansible Playbooks 基本Web服务器设置

例如,我们将使用Ansible将新创建的Linode服务器转换为Web服务器,配置Apache,MySQL和PHP,准备提供动态站点并配置适当的用户和权限。为简洁起见,我们不会处理通常可能涉及的所有功能和配置,但会覆盖足以让您入门。

警告以下播放手册仅用于学习目的,不会产生强化或安全的服务器。使用它们来学习,但不要将它们用于生产实例!

先决条件

  • 这个例子假设一个全新的Ubuntu 14.04 LTS服务器,没有任何其他配置已经完成。第一项业务是添加我们的公共加密密钥,以便我们可以在不提供密码的情况下进行连接。
  • 由于Ansible playbooks是幂等的并且可以无错误地重复运行,因此该user任务会检查用户是否存在以及文件上的密码(系统存储的哈希值)与您提供的哈希匹配。因此,您不能(也不应该)只输入明文密码,您必须预先对其进行哈希处理。
  • 为Ansible创建密码哈希,以便在与服务器通信时使用。一个简单的方法是使用Python的PassLib库,可以安装sudo pip install passlib

安装后,运行以下命令,替换plaintextpassword为您的实际密码:

代码语言:javascript
复制
  python -c "from passlib.hash import sha512_crypt; print sha512_crypt.encrypt('plaintextpassword')"

创建系统用户

  1. 将新服务器的IP地址添加到Ansible hosts文件中,以便我们可以解决它。删除您在上面的测试部分中添加的所有先前条目。为新服务器提供组名,以便以后更容易引用。在我们的示例中,组名称是linode。 的/ etc / ansible /主机1 2 [linode] 123.123.123.123
  2. 编写一个创建新普通用户的剧本,添加我们的公钥,并将新用户添加到sudoers文件中。 我们在这里介绍Ansible的一个新方面:变量。注意vars:条目和NORMAL_USER_NAME行。您会注意到它在文件中重复使用了两次,因此我们只需要更改一次。替换yourusername为您选择的用户名,localusername路径authorized_key和密码哈希。 initialize_basic_user.yml 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 --- - hosts: linode remote_user: root vars: NORMAL_USER_NAME: 'yourusername' tasks: - name: "Create a secondary, non-root user" user: name={{ NORMAL_USER_NAME }} password='$6$rounds=656000$W.dSlhtSxE2HdSc1$4WbCFM6zQV1hTQYTCqmcddnKrSXIZ9LfWRAjJBervBFG.rH953lTa7rMeZNrN65zPzEONntMtYt9Bw74PvAei0' shell=/bin/bash - name: Add remote authorized key to allow future passwordless logins authorized_key: user={{ NORMAL_USER_NAME }} key="{{ lookup('file', '/Users/localusername/.ssh/id_rsa.pub') }}" - name: Add normal user to sudoers lineinfile: dest=/etc/sudoers regexp="{{ NORMAL_USER_NAME }} ALL" line="{{ NORMAL_USER_NAME }} ALL=(ALL) ALL" state=present
  3. 将playbook文件另存为,initialize_basic_user.yml并使用以下命令运行playbook。注意我们如何指定使用特定用户(-u root)并强制Ansible提示我们输入密码(-ask-pass),因为我们还没有设置密钥身份验证: ansible-playbook --ask-pass -u root initialize_basic_user.yml

您应该看到Ansible的输出报告三个任务都已成功完成,状态为“已更改”。我们现在可以使用普通用户帐户和密钥处理新的剧本。

配置基本系统

让我们来处理一些常见的服务器设置任务,例如设置时区,更新hosts文件和更新包。这是一本涵盖这些步骤的剧本:

common_server_setup.yml

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22

--- - hosts: linode remote_user: yourusername become: yes become_method: sudo vars: LOCAL_HOSTNAME: 'web01' LOCAL_FQDN_NAME: 'www.example.com' tasks: - name: Set the timezone for the server to be UTC command: ln -sf /usr/share/zoneinfo/UTC /etc/localtime - name: Set up a unique hostname hostname: name={{ LOCAL_HOSTNAME }} - name: Add the server's domain to the hosts file lineinfile: dest=/etc/hosts regexp='.*{{ item }}$' line="{{ hostvars[item].ansible_default_ipv4.address }} {{ LOCAL_FQDN_NAME }} {{ LOCAL_HOSTNAME }}" state=present when: hostvars[item].ansible_default_ipv4.address is defined with_items: "{{ groups['linode'] }}" - name: Update packages apt: update_cache=yes upgrade=dist

运行此剧本:

代码语言:javascript
复制
ansible-playbook common_server_setup.yml --ask-become-pass

当您运行此剧本时,您将再次看到“已更改”所遇到的步骤。更新程序包可能需要几分钟,因此如果不立即返回,请不要担心。

安装堆栈

最后,让我们使用Apache和PHP设置一个非常基本的服务器,并使用测试MySQL数据库。

以下playbook下载相应的包,打开Apache和MySQL服务,并创建基本数据库和用户。 setup_webserver.yml 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 --- - hosts: linode remote_user: yourusername become: yes become_method: sudo tasks: - name: "Install Apache, MySQL, and PHP5" apt: name={{ item }} state=present with_items: - apache2 - mysql-server - python-mysqldb - php5 - php-pear - php5-mysql - name: "Turn on Apache and MySQL and set them to run on boot" service: name={{ item }} state=started enabled=yes with_items: - apache2 - mysql - name: Create a test database mysql_db: name=testDb state=present - name: Create a new user for connections mysql_user: name=webapp password=mypassword priv=*.*:ALL state=present

使用以下命令从控制计算机运行playbook: ansible-playbook setup_webserver.yml --ask-become-pass 当这个剧本完成后,访问您的Linode的IP地址或FQDN以查看默认的Ubuntu Apache索引页面。

通过SSH登录并检查testDb确实已创建: mysql -u root -p show databases; 您甚至可以创建一个示例PHP页面并将其放入/var/www/html以测试PHP在服务器上是否处于活动状态。Ansible按照我们的指示完成,安装适当的软件包并根据需要进行设置。

探索Ansible进一步

这只是学习Ansible的开始,随着您不断学习和探索,您会发现它是一个真正强大而灵活的工具。看一下公司自己提供的一些Ansible剧本示例。

以下是一些需要探索的主题,这些主题在您创建任何复杂的剧本时变得非常重要,并且您将在其他人的剧本中经常看到。

更多信息

有关此主题的其他信息,您可能需要参考以下资源。虽然提供这些是希望它们有用,但请注意,我们无法保证外部托管材料的准确性或及时性。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 安装Ansible
    • MacOS
      • CentOS / Fedora
        • Ubuntu
        • 配置Ansible 第一步
        • 使用Ansible的库存文件
        • 通过Playbooks 进行Ansible配置
          • 运行Playbooks 永久链接
            • 您可以运行固定链接的任务类型
            • 通过Ansible Playbooks 基本Web服务器设置
              • 先决条件
                • 创建系统用户
                  • 配置基本系统
                    • 安装堆栈
                    • 探索Ansible进一步
                    • 更多信息
                    相关产品与服务
                    云数据库 MySQL
                    腾讯云数据库 MySQL(TencentDB for MySQL)为用户提供安全可靠,性能卓越、易于维护的企业级云数据库服务。其具备6大企业级特性,包括企业级定制内核、企业级高可用、企业级高可靠、企业级安全、企业级扩展以及企业级智能运维。通过使用腾讯云数据库 MySQL,可实现分钟级别的数据库部署、弹性扩展以及全自动化的运维管理,不仅经济实惠,而且稳定可靠,易于运维。
                    领券
                    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档