尝试使用ansible
首先
我有一些现在才感觉到的迟来的感觉,我将记录使用Ansible时的感受以及使用方式。
或许,初次使用的人会有相似的经历。
如果对即将开始使用的人有所帮助,那将是我的幸运。
Ansible是什么?
在官方网站的文件开头中,如下所述。
Ansible 是一款IT自动化工具。它可以配置系统、部署软件,并协调更高级的IT任务,如持续部署或零停机滚动更新。
由于我认为已经有很多关于这方面的信息了,所以我会简略地说明一下。它是一种配置管理工具(系统自动管理工具?)。类似于Chef和Puppet,但不需要额外的代理或客户端,而是使用Linux上已经安装的SSH。
请参阅以下链接以查看详细信息。
-
- ANSIBLE
- Ansible Tutorial
环境
-
- AWS
- Amazon Linux AMI release 2014.09
安裝
请参考文档中按照Linux发行版列出的安装方法来进行安装。
- インストール方法
如果使用Amazon Linux,只需执行以下命令即可开始使用。
$ sudo yum --enablerepo=epel install ansible
$ ansible --version
ansible 1.7.2
确认初始动作
安装完成后,可以执行以下命令进行操作确认。确保它成功执行。
$ ansible localhost -m ping
localhost | success >> {
"changed": false,
"ping": "pong"
}
$ ansible localhost -a "/bin/echo hello"
localhost | success | rc=0 >>
hello
当涉及远程主机执行时,需要事先进行SSH连接配置。更多详细信息请参考文档。
- Getting Startted
目前为止已经准备好使用Ansible了。接下来简单说明一下如何使用…。
你是怎么使用过的?
最初1
因此,我根据以下文档参考创建了playbook并尝试使用。
- Intro to Playbooks
创建一个单一的yml文件,并将所有处理内容都写在其中。
创建并执行如下所示的文件。
创建用于Ansible的hosts文件
[server]
192.168.100.11
创建一个名为sample1.yml的文件,其中包含了处理的代码。
---
- hosts: server
vars:
httpd_pkgs:
- httpd
- httpd-devel
sudo: yes
tasks:
- name: ensure apache is at the latest version
yum: name={{ item }} state=latest
wiht_items:
- "{{ httpd_pkgs }}"
- name: ensure apache is running
service: name=httpd state=started
使用ansible-playbook命令,执行指定的sample1.yml文件。
$ cd /etc/ansible
$ ansible-playbook ./sample1.yml
<snip>
PLAY RECAP ********************************************************************
192.168.100.11 : ok=x changed=x unreachable=0 failed=0
如果处理工作不太多,那么这种方法没问题。
但是,如果要处理的工作变得更多,文件会变得越来越大,管理也会变得困难。
最初的两个阶段 de gè
Playbook可以引用外部文件,因此可以创建一个处理每个步骤的yml文件的方式。如下所示的示例:
建立一个名为main.yml的文件来调用处理函数。
---
- include: /etc/ansible/sample1.yml
- include: /etc/ansible/sample2.yml
我们将sample1.yml设定为先前的文件。
创建包含处理的sample2.yml文件。
---
- hosts: server
vars:
mysql_pkgs:
- mysql
- mysql-server
- mysql-devel
sudo: yes
tasks:
- name: ensure mysql is at the latest version
yum: name={{ item }} state=latest
with_items:
- "{{ mysql_pkgs }}"
使用ansible-playbook命令执行main.yml文件。
$ cd /etc/ansible
$ ansible-playbook ./main.yml
<snip>
PLAY RECAP ********************************************************************
192.168.100.11 : ok=x changed=x unreachable=0 failed=0
与其在一个yml文件中将所有内容都写下来,管理起来会更容易吗?然而,在文件中包含变量的var部分仍然保留着。
中期第一个选项
阅读文件时,您会意识到存在着所谓的最佳实践。
- Best Practices
这涉及到了角色的概念,并且通过目录结构的分割,可以实现对角色(处理)的划分。以下是一个类似的形象化描述。
production # inventory file for production servers
stage # inventory file for stage environment
group_vars/
group1 # here we assign variables to particular groups
group2 # ""
host_vars/
hostname1 # if systems need specific variables, put them here
hostname2 # ""
site.yml # master playbook
webservers.yml # playbook for webserver tier
dbservers.yml # playbook for dbserver tier
roles/
common/ # this hierarchy represents a "role"
tasks/ #
main.yml # <-- tasks file can include smaller files if warranted
handlers/ #
main.yml # <-- handlers file
templates/ # <-- files for use with the template resource
ntp.conf.j2 # <------- templates end in .j2
files/ #
bar.txt # <-- files for use with the copy resource
foo.sh # <-- script files for use with the script resource
vars/ #
main.yml # <-- variables associated with this role
defaults/ #
main.yml # <-- default lower priority variables for this role
meta/ #
main.yml # <-- role dependencies
webtier/ # same kind of structure as "common" was above, done for the webtier role
monitoring/ # ""
fooapp/ # ""
使用这个结构,大体上变得干净整洁了。
然而,在角色和变量方面,共享和个别的内容会混在一起。
第二阶段
我正在参考以下的结构。
- Ansible オレオレベストプラクティス
我觉得把想共享的文件夹放到外面创建目录树真是很实用!
印象
由于Ansible使用SSH,我认为学习成本不高且易于上手。几年前,我曾使用SSH和Shell脚本编写命令,以便远程操作主机,但我认为Ansible是一个更易用的工具。
另外,由于仍在试验和错误中,所以我们仅限于中期,没有后期。
如果还有其他方法,请告诉我!
我认为构成管理工具不需要一直运行,而且使用Docker进行管理可以增加可移植性,方便部署到其他环境。虽然建立ansible环境并不困难,但仅通过SVN或Git管理playbook的内容似乎也可以。