从头开始创建ansible角色| Ansible角色示例

时间:2020-01-09 10:37:51  来源:igfitidea点击:

让我们一步一步地学习这个ansible角色教程,从头开始创建ansible剧本角色。
我将在本文中分享"两个有趣的角色示例"

  • 使用ansible剧本角色更新/etc/motd

  • 使用ansible剧本角色为apache服务器配置虚拟主机

Ansible将默认在以下目录中查找角色

  • 当前项目目录

  • ~/.ansible/roles

  • /etc/ansible/roles

  • /usr/share/ansible/roles

安装Ansible并设置环境

由于我已经在我的CentOS 8环境中安装并配置了Ansible,因此在此不再赘述。

建立项目

一旦我们准备好Ansible环境,接下来就创建一个项目。

我将创建一个新的项目base来演示Ansible角色示例:

[ansible@controller ~]$mkdir base

示例1:Ansible角色示例,用于更新/etc/motd

第1步:创建ansible角色-motd

  • 要创建ansible角色,请使用ansible-galaxy init <role_name>创建角色目录结构。

  • 我们将在 <project>/roles目录中创建角色,即~/base/roles/motd

  • 不要在角色中放置敏感信息,而要在本地剧本或者Ansible Vault中放置

[ansible@controller ~]$mkdir roles
[ansible@controller ~]$cd roles

接下来使用" ansible-galaxy init"命令来创建ansible角色。
我们将创建motd角色:

[ansible@controller roles]$ansible-galaxy init motd
- motd was created successfully

创建ansible角色命令成功。
我们可以使用tree命令列出motd的ansible角色目录结构:

[ansible@controller roles]$tree motd
motd
├── defaults
│   └── main.yml
├── files
├── handlers
│   └── main.yml
├── meta
│   └── main.yml
├── README.md
├── tasks
│   └── main.yml
├── templates
├── tests
│   ├── inventory
│   └── test.yml
└── vars
    └── main.yml
8 directories, 8 files

如我们所见,所有我们在上一篇文章中讨论的用于ansible角色的目录都已创建

第2步:创建任务

现在我们知道我们想使用ansible剧本角色更新/etc/motd文件,因此我们必须创建任务,因此我们将使用tasks文件夹中的main.yml文件

[ansible@controller motd]$cat tasks/main.yml
--
# tasks file for motd
- name: copy motd file
  template:
     src: templates/motd.j2
     dest: /etc/motd
     owner: root
     group: root
     mode: 0444

我们已经定义了模板路径和目标详细信息来更新/etc/motd

步骤3:建立Ansible范本

接下来,我们将创建模板内容,该模板内容将在我们的角色示例中用于更新/etc/motd
我将使用一些变量在templates目录下创建一个新的模板文件:

[ansible@controller motd]$cat templates/motd.j2
Welcome to {{ ansible_hostname }}
This file was created on {{ ansible_date_time.date }}
Go away if you have no business being here
Contact {{ system_manager }} if anything is wrong

步骤4:建立ansible变数

我们将使用" defaults"文件夹定义自定义变量,该自定义变量将在模板文件" templates/motd.j2"中使用。

[ansible@controller motd]$cat defaults/main.yml
--
# defaults file for motd
system_manager: [email protected]

步骤5:删除不需要的目录(可选)

此步骤是完全可选的。
在这个烦人的角色示例中,我们将不使用其他目录,因此我们将其删除。

删除其他目录后,可以使用tree命令列出motd角色的目录结构

[ansible@controller motd]$rm -rf handlers tests vars
[ansible@controller motd]$tree
.
├── defaults
│   └── main.yml
├── files
├── meta
│   └── main.yml
├── README.md
├── tasks
│   └── main.yml
└── templates
    └── motd.j2
5 directories, 5 files

第6步:创建Ansible角色剧本

现在,在我们创建了一个角色角色结构之后,我们需要一个剧本文件,该文件将角色部署到我们的托管主机上。

我将在" base"项目目录下创建我的剧本文件" motd-role.yml"。

[ansible@controller base]$cat motd-role.yml
--
- name: use motd role playbook
  hosts: server1.example.com
  user: ansible
  become: true
  roles:
    - role: motd
      system_manager: [email protected]

如我们所见,我仅提供了"角色"信息,并且在剧本文件中未指定其他任何任务。

步骤7:部署ansible剧本角色

从头开始创建剧本角色和剧本文件之后,我们接下来将部署剧本角色,以在托管主机上执行" motd"角色。

[ansible@controller base]$ansible-playbook motd-role.yml
PLAY [use motd role playbook] ** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** *****
TASK [Gathering Facts] ** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
ok: [server1.example.com]
TASK [motd : copy motd file] ** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **
changed: [server1.example.com]
PLAY RECAP ** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
server1.example.com        : ok=2    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

在ansible角色示例中,我们的ansible部署成功。

步骤8:验证

部署完好剧本后,请验证托管主机上的任务状态,对于我们来说,托管状态为server1.example.com

[root@server1 ~]# cat /etc/motd
Welcome to server1
This file was created on 2017-02-01
Go away if you have no business being here
Contact [email protected] if anything is wrong

因此,来自motd文件的内容已在/etc.motdserver1上正确更新。

示例2:配置具有Ansible角色的虚拟主机

这是我们第二个烦人的角色示例。
本剧将在server2.example.com上进行操作,我们将使用vhost角色进行操作。

步骤1:创建Ansible角色-vhost

我们将使用现有的~/base/roles/<rolename>项目,通过vhost角色来创建ansible角色目录结构。

[ansible@controller base]$cd roles/

要创建ansible角色vhost',请使用ansible-galaxy init <rolename>`命令,如下所示:

[ansible@controller roles]$ansible-galaxy init vhost
- vhost was created successfully

我们可以使用tree命令来检查vhost目录的结构:

[ansible@controller roles]$tree
.
└── vhost
    ├── defaults
    │   └── main.yml
    ├── files
    ├── handlers
    │   └── main.yml
    ├── meta
    │   └── main.yml
    ├── README.md
    ├── tasks
    │   └── main.yml
    ├── templates
    ├── tests
    │   ├── inventory
    │   └── test.yml
    └── vars
        └── main.yml
9 directories, 8 files

第2步:创建任务

  • 在任务文件夹中的" main.yml"中,我们定义要执行的任务

  • 使用yum模块安装httpd

  • 使用服务模块启动并启用httpd服务

  • 接下来使用模板目录下可用的模板模块将vhost.conf.j2文件源到目标

[ansible@controller base]$cat roles/vhost/tasks/main.yml
--
# tasks file for vhost
- name: install http
  yum:
    name: httpd
    state: latest
- name: start and enable httpd
  service:
    name: httpd
    state: started
    enabled: true
- name: install vhost config file
  template:
    src: vhost.conf.j2
    dest: /etc/httpd/conf.d/vhost.conf
    owner: root
    group: root
    mode: 0644

步骤3:建立Ansible处理常式

在角色中,我们将"任务"与ansible处理程序分开。

因此,在" handlers/main.yml"中的这个ansible角色示例中,我们指示ansible一旦完成"任务"就重新启动" httpd"

[ansible@controller base]$cat roles/vhost/handlers/main.yml
--
# handlers file for vhost
- name: restart httpd
  service:
     name: httpd
     state: restarted

步骤4:建立ansible范本

以下是我们在`templates'文件夹下使用变量的虚拟主机配置。
变量将自动填充到目标名称上。

[ansible@controller base]$cat roles/vhost/templates/vhost.conf.j2
# {{ ansible_managed }}
<VirtualHost *:80>
        ServerAdmin webmaster@{{ ansible_fqdn }}
        ServerName {{ ansible_fqdn }}
        ErrorLog logs/{{ ansible_hostname }}-error.log
        CustomLog logs/{{ansible_hostname }}-common.log common
        DocumentRoot /var/www/vhosts/{{ ansible_hostname }}/
        <Directory /var/www/vhosts/{{ ansible_hostname }}>        
                Options +Indexes +FollowSymlinks +Includes
                Order allow,deny
                Allow from all
        </Directory>
</VirtualHost>

步骤5:删除不需要的目录(可选)

现在类似于我们的motd角色示例,我们将删除不需要的目录。

[ansible@controller vhost]$rm -rf defaults files tests vars

接下来,我们可以使用" tree"命令列出" vhost"角色的其余目录。

[ansible@controller vhost]$tree
.
├── handlers
│   └── main.yml
├── meta
│   └── main.yml
├── README.md
├── tasks
│   └── main.yml
└── templates
4 directories, 4 files

我们还添加了post_tasks将index.html从localhost复制到托管主机(server2.example.com)的目标,位于/var/www/html/<hostname> /下,因此我们将创建我们要通过我们的剧本将" localhost"上的" index.html"复制到目标:

[ansible@controller base]$mkdir -p files/html
[ansible@controller base]$echo "Welcome to this host" >> files/html/index.html
[ansible@controller base]$cat files/html/index.html
Welcome to this host

第6步:创建Ansible角色剧本

现在,在我们创建了一个角色角色结构之后,我们需要一个剧本文件,该文件将角色部署到我们的托管主机上。

我将在" base"项目目录下创建" apache-vhost.yml"剧本文件。

[ansible@controller base]$cat apache-vhost.yml
--
- name: create apache vhost
  hosts: server2.example.com
  roles:
     - vhost
  post_tasks:
     - name: install contents from local file
       copy:
         src: files/html/
         dest: "/var/www/vhosts/{{ ansible_hostname }}"

步骤7:部署ansible剧本角色

在从头开始创建Play角色和Playbook文件之后,接下来我们将部署Ansible脚本角色,以在托管主机上执行vhost角色。

[ansible@controller base]$ansible-playbook apache-vhost.yml
PLAY [create apache vhost] ** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
TASK [Gathering Facts] ** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
ok: [server2.example.com]
TASK [vhost : install http] ** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ***
ok: [server2.example.com]
TASK [vhost : start and enable httpd] ** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** *****
ok: [server2.example.com]
TASK [vhost : install vhost config file] ** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **
changed: [server2.example.com]
TASK [install contents from local file] ** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ***
changed: [server2.example.com]
PLAY RECAP ** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
server2.example.com        : ok=5    changed=2    unreachable=0    failed=0    skipped=0    rescued=0 ignored=0

这样看来,我们烦人的剧本角色已成功执行。

我们可以通过运行" ansible ad-hoc"命令来验证相同的内容

步骤8:验证

要检查" httpd"服务是否在我们的托管主机" server2.example.com"上处于活动状态

[ansible@controller base]$ansible server2.example.com -a 'systemctl is-active httpd'
server2.example.com | CHANGED | rc=0 >>
active

当我们看到服务active时,我们还可以检查我们填充的vhost.conf的输出。
使用控制器节点执行以下命令

[ansible@controller base]$ansible server2.example.com -a 'cat /etc/httpd/conf.d/vhost.conf'
server2.example.com | CHANGED | rc=0 >>
# Ansible managed
<VirtualHost *:80>
        ServerAdmin [email protected]
        ServerName server2.example.com
        ErrorLog logs/server2-error.log
        CustomLog logs/server2-common.log common
        DocumentRoot /var/www/vhosts/server2/
        <Directory /var/www/vhosts/server2>        
                Options +Indexes +FollowSymlinks +Includes
                Order allow,deny
                Allow from all
        </Directory>
</VirtualHost>