Ansible Roles-解开Playbook的终极方式
Ansible使我们能够自动化系统的配置管理,并根据需要添加任意数量的客户端。
我们是否想过这会变得多么复杂?
我们是否想过这些剧本能花多长时间和令人困惑?
Ansible仍然如何使它看起来像微风?
它使用Ansible Roles概念,这就是我们将在此教程 中讨论的内容。
Ansible角色简介
Ansible Role是一个处理想法而不是事件的概念。
它基本上是用于组织剧本的另一种抽象层次。
它们为独立,可重用的变量,任务,模板,文件和模块的集合提供了框架,这些变量,任务,模板,文件和模块可以自动加载到剧本中。
剧本是角色的集合。
每个角色都有特定的功能。
让我用一个例子来解释一下。
假设我们希望自己的剧本在5个不同的系统上执行10个不同的任务,那么我们会为此使用一个剧本吗?
不,使用一本剧本可能会使书本混乱,并容易出错。
相反,我们可以创建10个不同的角色,其中每个角色将执行一个任务。
然后,我们所要做的就是在剧本中提及角色的名称以对其进行调用。
我们将在此教程 中进一步学习如何使用角色。
可重复使用的角色
Ansible角色彼此独立。
一个角色的执行不依赖于其他角色,因此可以重复使用。
我们甚至可以根据需要修改和个性化这些角色。
这减少了我们每次需要时重写整个代码部分的任务,从而简化了我们的工作。
让我们回到前面的例子。
我们已经编写了10个角色,现在需要将其中5个角色用于另一组配置。
我们会再次写完整的剧本吗?
不,我们只需在这本新的Playbook中调用这5个角色,即可重复使用这些角色。
如果需要,我们还可以进行修改,但最终仍可以节省大量时间。
假设我们需要写一部剧本来设置LAMP堆栈。
我们必须创建4个角色,每个角色分别用于创建Linux,Apache,MongoDB和PHP。
将来,如果我们想要另一本用于设置LAMP堆栈和WordPress的手册,是否会再次为LAMP堆栈和WordPress创建新角色?
不!我们可以简单地重用旧角色(用于LAMP堆栈),并另外为WordPress创建一个新角色。
角色目录结构
使用Ansible Roles,期望文件处于特定的文件结构中。
使用角色最令人困惑的部分是了解文件层次结构。
Ansible提供了称为Ansible Galaxy的功能,可扮演角色。
我们已经知道我们的Ansible在Ubuntu(/etc/ansible)上的位置。
我们是否曾在/etc/ansible下看到一个名为Roles的目录?
正是由于这个原因,该目录存在。
我们在此目录中创建不同的角色。
该目录将如下所示:
我们可以在/etc/ansible/roles中使用ansible-galaxy init命令创建角色。 $sudo ansible-galaxy init <role-name>
我们会看到其他角色目录也已创建。
这些目录是任务,处理程序,默认值,vars,文件,模板,元数据和README.md文件。
任务包含角色要执行的任务的主要列表。
它包含该特定角色的main.yml文件。
处理程序包含可由该角色甚至此角色之外的任何地方使用的处理程序。
默认值包含此角色将使用的默认变量。
Vars此目录包含角色将要使用的其他变量。
这些变量可以在剧本中定义,但是在本节中定义它们是一个好习惯。
文件包含此角色可以部署的文件。
它包含在配置角色时需要发送到主机的文件。
元为该角色定义元数据。
基本上,它包含建立角色依赖关系的文件。
每个任务目录必须包含一个main.yml文件,其中写入了该特定角色的实际代码。
现在,让我们通过安装MEAN Stack的演示来了解其工作或者角色。
演示:使用Ansible角色安装MEAN Stack
我将通过仅执行一个剧本来演示如何使用Ansible Roles安装MEAN Stack。
我们将扮演三个角色:1)安装必备组件,2)安装MongoDB和3)安装NodeJS。
我假设我们已经安装了Ansible,并在Ubuntu上建立了服务器-客户端连接。
让我们开始使用Ansible Roles。
步骤1导航到/etc/ansible/roles目录,并为必备组件MongoDB和NodeJS创建角色。
$cd /etc/ansible/roles $sudo ansible-galaxy init prerequisites $sudo ansible-galaxy init mongodb $sudo ansible-galaxy init nodejs
现在,我们应该在"角色"目录中看到三个角色。
步骤2编写main.yml以获得安装Git的准备工作。
$cd prerequisites/tasks/main.yml -- - name: Install git apt: name: git state: present update_cache: yes
步骤3为maingo.yml编写MongoDB角色
$cd /mongodb/tasks/main.yml -- - name: MongoDB - Import public key apt_key: keyserver: hkp://keyserver.ubuntu.com:80 id: EA312927 - name: MongoDB - Add repository apt_repository: filename: '/etc/apt/sources.list.d/mongodb-org-3.2.list' repo: 'deb http://repo.mongodb.org/apt/ubuntu trusty/mongodb-org/3.2 multiverse' state: present update_cache: yes - name: MongoDB - Install MongoDB apt: name: mongodb-org state: present update_cache: yes - name: Start mongod shell: "mongod &"
步骤4为node.js角色编写main.yml
$cd nodejs/tasks/main.yml -- - name: Node.js - Get script get_url: url: "http://deb.nodesource.com/setup_6.x" dest: "{{ var_node }}/nodejs.sh" - name: Node.js - Set execution permission to script file: path: "{{ var_node }}/nodejs.sh" mode: "u+x" - name: Node.js - Execute installation script shell: "{{ var_node }}/nodejs.sh" - name: Node.js - Remove installation script file: path: "{{ var_node}}/nodejs.sh" state: absent - name: Node.js - Install Node.js apt: name={{ item }} state=present update_cache=yes with_items: - build-essential - nodejs - name: Node.js - Install bower and gulp globally npm: name={{ item }} state=present global=yes with_items: - bower - gulp
步骤5编写主要剧本
$cd /etc/ansible/mean.yml -- - hosts: nodes remote_user: ansible become: yes become_method: sudo vars: #variable needed during node installation var_node: /tmp roles: - prerequisites - mongodb - nodejs
现在,我们已经定义了用于安装必备组件MongoDB和NodeJ的角色,让我们对其进行部署。
使用以下命令执行剧本。 $sudo ansible-playbook /etc/ansible/mean.yml -K
如我们所见,所有任务均已执行且其状态已更改。
这意味着剧本更改已应用于服务器和主机。
设置MEAN Stack只是一个示例。
我们可以使用Ansible Roles设置几乎所有内容。