考虑管理服务器机队的单调; 让它们全部更新,将更改推送给它们,复制文件等。事情可能会很快变得复杂和耗时,但它不一定是这样。
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
为您的实际密码:
python -c "from passlib.hash import sha512_crypt; print sha512_crypt.encrypt('plaintextpassword')"
创建系统用户
- 将新服务器的IP地址添加到Ansible
hosts
文件中,以便我们可以解决它。删除您在上面的测试部分中添加的所有先前条目。为新服务器提供组名,以便以后更容易引用。在我们的示例中,组名称是linode
。 的/ etc / ansible /主机1 2 [linode] 123.123.123.123 - 编写一个创建新普通用户的剧本,添加我们的公钥,并将新用户添加到
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 - 将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)