学习如何安装Ansible和运行Playbooks

2018-09-10 12:24:04 浏览数 (1)

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

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

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

  • command - 在远程节点上执行命令
  • script - 传输后在远程节点上运行本地脚本
  • shell - 在节点中执行命令
  • mysql_db - 从远程主机添加或删除MySQL数据库
  • mysql_user - 在MySQL数据库中添加或删除用户
  • postgresql_db - 从远程主机添加或删除PostgreSQL数据库
  • postgresql_user - 从PostgreSQL数据库添加或删除用户(角色)
  • fetch - 从远程节点获取文件
  • template - 将文件模板发送到远程服务器
  • yum - 使用yum包管理器管理包
  • apt - 管理apt-packages
  • git - 从git checkout部署软件(或文件)
  • 服务 - 管理服务

通过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剧本示例。

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

  • Ansible示例手册(GitHub)
    • WordPress nginx PHP-FPM
    • 简单的灯泡堆栈
    • 精简,生产就绪的MongoDB集群
  • Ansible文档
  • 重要下一主题:
    • 用户,切换用户和权限提升
    • 处理程序:在变更时运行操作
    • 角色
    • 变量
    • Playbook最佳实践

更多信息

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

  • Ansible主页
  • Ansible文档
  • Ansible示例手册(GitHub)
bashbash 指令apacheDevOps 解决方案unixbashbash 指令apacheDevOps 解决方案unix

0 人点赞