从头开始创建ansible角色| Ansible角色示例
让我们一步一步地学习这个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.motd的server1上正确更新。
示例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>

