部署配置实验
实验环境
虚拟机 3台 centos7.9
网卡NAT模式 数量 1
组件包 ansiblerepo
|----------|----------------|--------|
| 设备 | IP | 备注 |
| Centos01 | 192.168.161.11 | node01 |
| Centos02 | 192.168.161.12 | node02 |
| Centos03 | 192.168.161.13 | node03 |
14.2.1 Ansible安装
-
通过YUM安装Ansible 复制提供的ansiblerepo文件夹到Linux本地目录,并设置为yum仓库。然后安装软件。
[root@node01 ~]# yum -y install createrepo
[root@node01 ~]# mv ansiblerepo/ /usr/local/src/
[root@node01 ~]# cd /usr/local/src/ansiblerepo/
[root@node01 ansiblerepo]# createrepo ./
[root@node01 ansiblerepo]# ls
[root@node01 ansiblerepo]# cd
[root@node01 ~]# vim /etc/yum.repos.d/local.repo
[local]
name=CnetOS 7.3
baseurl=file:///mnt/
enabled=1
gpgcheck=0[ansiblerepo]
name=ansiblerepo
baseurl=file:///usr/local/src/ansiblerepo/
gpgcheck=0[root@node01 ~]# yum repolist //查看yum源是否可用
[root@node01 ~]# yum -y install ansible
[root@node01 ~]# ansible --version //验证安装结果
- 创建SSH免交互登录
Ansible通过SSH 对设备进行管理,而SSH包含两种认证方式:一种是通过密码认证,另一种是 通过密钥对认证。前者必须和系统交互,而后者是免交互登录。如果希望通过Ansible自动管理设备 应该配置为免交互登录被管理设备。
[root@node01 ~]# ssh-keygen -t rsa //生成密钥对,后面操作为默认路径,直接回车
[root@node01 ~]# ssh-copy-id root@192.168.161.12 //复制公钥到远端192.168.161.12
[root@node01 ~]# ssh-copy-id root@192.168.161.13 //复制公钥到远端
[root@node01 ~]# ssh 192.168.161.12 //可以免密码登录到192.168.161.12
[root@node02 ~]# exit
[root@node01 ~]# ssh 192.168.161.13
[root@node03 ~]# exit
到此,已经完成Ansible的部署,下面就可以通过Ansible对设备进行管理了。
14.2.2 Ansible配置
linventory 是 Ansible管理主机信息的配置文件,相当于系统Hosts 文件的功能,默认存放在 /etc/ansible/hosts。在hosts文件中,通过分组来组织设备,Ansible通过Inventory来定义主机和分 组,通过在ansible命令中使用选项-i或--inventory-file指定Inventory。
Ansible通过将设备列表以分组的方式添加到/etc/ansible/hosis文件来实现对设备的管理,所以 在正式管理之前,首先要编写 hosts 文件。hosts文件中,以]包含的部分代表组名,设备列表支持 主机名和IP地址,默认情况下。通过访问22端口(SSH)来管理设备。着目标主机使用了非默认的 SSH端口,还可以在主机名称之后使用雷号加端口号标明,以行为单位分隔配置。另外,hosts 文件 还支持通配符,
[root@node01 ~]# vim /etc/ansible/hosts
[web]
192.168.161.12
192.168.161.13
[test01]
www.bdqn.cn:222 //通过222端口管理设备
[mail]
zsl.kgc.cn
zs[2:5].kgc.cn
可以将同一个主机同时归置在多个不同的组中。
配置完成后,可以针对 hosts 定义的组进行远程操作,也可以针对组中指定的某一个或多个主机操作。下面介绍如何针对特定的服务器操作。
(1)只对 web组中192.168.161.12主机操作。通过--limit参数限定主机的变更。
[root@node01 ~]# ansible web -m command -a "systemctl status firewalld" --limit "192.168.161.12"
(3) 只对192.168.161.0网段主机操作。通过通配符限定主机的变更。
14.2.5 playbook 配置文件
1、执行配置文件
playbook 配置文件使用YAML语法,具有简洁明了、结构清晰等特点。playbook配置文件类似于Shell 脚本,是一个YAM_ 格式的文件,用于保存针对特定需求的任务列表。前面介绍的ansible命令 虽然可以完成各种任务。但是当配置一些复杂任务时,逐条输入命令就显得效率非常低下。更有效 的方案是在playbook配置文件中放置所有的任务代码,利用 ansible-playbook命令执行该文件,可以 实现自动化运维。YAM_文件的扩展名通常为 yeml 或 yml。
YAML语法和其他高级语言类似,其结构通过缩进来展示,通过"-"来代表项,通过冒号 ":" 来分隔键和值,整个文件以"---"开始并以"..."结束,如下所示。
[root@node01 ~]# vim /etc/ansible/hosts
[web1]
192.168.161.12
[web2]
192.168.161.13
[root@node01 ~]# vim /etc/ansible/a.yml
---
- hosts: web1
remote_user: root
tasks:
- name: adduser
user: name=user2 state=present
tags:
- aaa
- name: addgroup
group: name=root system=yes
tags:
- bbb
- hosts: web2
remote_user: root
tasks:
- name: copy file to web
copy: src=/etc/passwd dest=/home
tags:
- ccc
所有的 "-" 和 ":" 后面均有空格,而且要注意缩进和对齐。
playbook 的核心元素包含:
> hosts:任务的目标主机,多个主机用冒号分隔,一般调用/etc/ansible/hosts 中的分组信息。
> rernote_user:远程主机上,运行此任务的身份默认为root 。
> tasks:任务,即定义的具体任务,由模块定义的操作列表。
> handlers:触发器,类似tasks,只是在特定的条件下才会触发的任务。某任务的状态在运行 后为changed时,可通过 "notify" 通知给相应的 handlers进行触发执行。
> roles:角色。将hosts剥离出去,由tasks、handlers等所组成的一种特定的结构集合。
执行pleybook的示例如下。
[root@node01 ~]# ansible-playbook --syntax-check /etc/ansible/a.yml
[root@node01 ~]# ansible-playbook -C /etc/ansible/a.yml //预测试
[root@node01 ~]# ansible-playbook --list-hosts /etc/ansible/a.yml //列出主机
[root@node01 ~]# ansible-playbook --list-tasks /etc/ansible/a.yml //列出任务
[root@node01 ~]# ansible-playbook --list-tags /etc/ansible/a.yml //列出标签
[root@node01 ~]# ansible-playbook /etc/ansible/a.yml //执行任务
预测试结果
列出主机
执行任务结果
确认结果
[root@node01 ~]# ssh 192.168.161.12 tail -2 /etc/passwd
[root@node01 ~]# ssh 192.168.161.13 ls -1 /home/passwd
- 触发器
需要触发才能执行的任务,当之前定义在tasks中的任务执行成功后,若希望在此基础上触发其他的任务,这时就需要定义handlers。例如,当通过 ansible 的模块对目标主机的配置文件进行修改之 后,如果任务执行成功,可以触发一个触发器,在触发器中定义目标主机的服务重启操作,以使配置文件生效。handlers触发器具有以下特点。
> handlers是Ansible提供的条件机制之一。handlers 和 task 很类似,但是它只在被task通知的时候才会触发执行。
> handlers 只会在所有任务执行完后执行。而且即使被通知了多次,它也只会执行一次,handlers 按照定义的顺序依次执行。
handlers触发器的使用示例如下。
[root@node01 ~]# ssh 192.168.161.12 netstat -lnupt | grep 80
[root@node01 ~]# vim /etc/ansible/httpd.yml
---
- hosts: web1
remote_user: root
tasks:
- name: change port //修改端口
command: sed -i 's/Listen\ 80/Listen\ 8080/g' /etc/httpd/conf/httpd.conf
notify: //配置触发条件
- restart httpd server //完成该任务后调用名为 restart httpd server 的触发器
handlers: //配置触发器
- name: restart httpd server //指定触发器名字
service: name=httpd state=restarted //触发任务为重启httpd服务
...
[root@node01 ~]# ansible-playbook /etc/ansible/httpd.yml //执行yml文件