尝试使用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的内容似乎也可以。

bannerAds