从头开始创建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>