2021-10-14 linux学习-部署(二十一) 之ansible自动化运维

ansible的介绍

ansible是一款自动化运维工具,易上手、不需要安装客户端、服务端等优点。

ansible是基于ssh协议运行的,也是一款开源工具,可以运用Python进行二次开发。

ansible目前(RHEL8)也是RHCE考试的重点内容。

 Ansible服务专用术语对照表

术语	            中文叫法	    含义
Control node	控制节点    	指的是安装了Ansible服务的主机,也被称为Ansible控制端,主要是用来发布                            
                            运行任务、调用功能模块,对其他主机进行批量控制。
Managed nodes	受控节点	    指的是被Ansible服务所管理的主机,也被称为受控主机或客户端,是模块命令的被执行对象。
Inventory	    主机清单	    指的是受控节点的列表,可以是IP地址、主机名称或者域名。
Modules	        模块	        指的是上文提到的特定功能代码,默认自带有上千款功能模块,在Ansible 
                            Galaxy有超多可供选择。
Task	        任务	        指的是Ansible客户端上面要被执行的操作。
Playbook	    剧本	        指的是通过YAML语言编写的可重复执行的任务列表,把常做的操作写入到剧本 
                            文件中,下次可以直接重复执行一遍。
Roles	        角色	        从Ansible 1.2版本开始引入的新特性,用于结构化的组织Playbook,通过调 
                            用角色实现一连串的功能。

总的来说。ansible的用法是使用一台作为控制节点(Control node)的服务器对主机清单(Inventory)中作为受控节点(Managed nodes)的客户机通过调用各种功能模块(Modules)或者用户编写的剧本(Playbook)或者调用角色(Roles)来完成单个或多个一连串的任务(Task)。

百闻不如一见,接下来就开始我们的实验吧。

准备工作

1 在虚拟机设置中,将“网络适配器”的“网络连接”选项调整为“桥接模式”,进入系统后再设置为DHCP。

2 在原有软件仓库配置的下方,追加EPEL扩展软件包安装源的信息

vim /etc/yum.repos.d/rhel.repo
[EPEL]
name=EPEL
baseurl=https://dl.fedoraproject.org/pub/epel/8/Everything/x86_64/
enabled=1
gpgcheck=0

3 安装ansible

dnf install -y ansible

4 查看版本

ansible --version

5 部署五台主机作为受控节点

操作系统	    IP地址	    功能用途
RHEL 8	192.168.10.20	dev
RHEL 8	192.168.10.21	test
RHEL 8	192.168.10.22	prod
RHEL 8	192.168.10.23	prod
RHEL 8	192.168.10.24	balancers

登录账户:root   密码redhat

一 设置主机清单

编辑主机清单

vim /etc/ansible/hosts
[dev]
192.168.10.20
[test]
192.168.10.21
[prod]
192.168.10.22
192.168.10.23
[balancers]
192.168.10.24
[all:vars]
ansible_user=root
ansible_password=redhat

查看主机清单

ansible-inventory --graph
@all:
  |--@balancers:
  |  |--192.168.10.24
  |--@dev:
  |  |--192.168.10.20
  |--@prod:
  |  |--192.168.10.22
  |  |--192.168.10.23
  |--@test:
  |  |--192.168.10.21
  |--@ungrouped:

Ansible服务主配置文件优先级顺序

优先级	文件位置
高	    ./ansible.cfg
中	    ~/.ansible.cfg
低	    /etc/ansible/ansible.cfg

编辑配置文件

将Ansible主配置文件中的第71行设置成默认不需要SSH协议的指纹验证,以及将第107行设置成默认执行剧本时所使用的管理员名称为root

vim /etc/ansible/ansible.cfg
71 host_key_checking = False
107 remote_user = root

将虚拟机网卡改回仅主机模式

二 运行临时命令

重要命令  “  ansible-doc 模块名称  ”   查看模块用法,此命令在后续的剧本实验上,可以用来查询各个模块的示例。

ansibe-doc -l    列出所有的模块信息以供选择

Ansible服务常用模块名称及作用

模块名称	            模块作用
ping	        检查受管节点主机网络是否能够联通。
yum	            安装、更新及卸载软件包。
yum_repository	管理主机的软件仓库配置文件。
template	    复制模板文件到受管节点主机。
copy	        新建、修改及复制文件。
user	        创建、修改及删除用户。
group	        创建、修改及删除用户组。
service	        启动、关闭及查看服务状态。
get_url	        从网络中下载文件。
file	        设置文件权限及创建快捷方式。
cron	        添加、修改及删除计划任务。
command	        直接执行用户指定的命令。
shell	        直接执行用户指定的命令(支持特殊字符)。
debug	        输出调试或报错信息。
mount	        挂载硬盘设备文件。
filesystem	    格式化硬盘设备文件。
lineinfile	    通过正则表达式修改文件内容。
setup	        收集受管节点主机上的系统及变量信息。
firewalld	    添加、修改及删除防火墙策略。
lvg	            管理主机的物理卷及卷组设备。
lvol	        管理主机的逻辑卷设备。

ansible命令语法格式为“ansible受管主机节点 -m模块名称[-a模块参数]”

ansible命令常用参数

参数	        作用
-k	        手动输入SSH协议密码
-i	        指定主机清单文件
-m	        指定要使用的模块名
-M	        指定要使用的模块路径
-S	        使用su命令
-T	        设置SSH协议连接超时时间
-a	        设置传递给模块的参数
--version	查看版本信息
-h	        帮助信息

小试牛刀,检查一下受控主机的网络连通性

ansible all -m ping

小实验:配置受控主机的软件仓库

需求

新增软件仓库信息

仓库名称	    EX294_BASE
仓库描述	    EX294 base software
仓库地址	    file:///media/cdrom/BaseOS
GPG签名	    启用
GPG密钥文件	file:///media/cdrom/RPM-GPG-KEY-redhat-release
ansible all -m yum_repository -a 'name="EX294_BASE" description="EX294 base software" baseurl="file:///media/cdrom/BaseOS" gpgcheck=yes enabled=1 gpgkey="file:///media/cdrom/RPM-GPG-KEY-redhat-release"'

三 剧本文件实战

剧本就好像是批量化的脚本,采用YAML语言编写,具有强制性的格式规范

剧本文件的结构由4部分组成,分别是target、variable、task、handler

target:用于定义要执行剧本的主机范围。

variable:用于定义剧本执行时要用到的变量。

task:用于定义将在远程主机上执行的任务列表。

handler:用于定义执行完成后需要调用的后续任务。

小实验:安装软件包

需求:

编写一个剧本,要求在dev、test、prod组的主机下安装最新版本的mariadb,编写完成后执行

vim packages.yml
---
- name: 安装软件包
  hosts: dev,test,prod
  tasks:
          - name: one
            yum:
                    name: mariadb
                    state: latest
ansible-playbook packages.yml

四 创建及使用角色

Ansible服务的角色功能类似于编程中的封装技术—将具体的功能封装起来,用户不仅可以方便地调用它,而且甚至可以不用完全理解其中的原理。

加载系统内置角色

安装系统角色

dnf install -y rhel-system-roles

查看可用角色

ansible-galaxy list

ansible系统角色描述

角色名称                    	作用
rhel-system-roles.kdump    	配置kdump崩溃恢复服务
rhel-system-roles.network	配置网络接口
rhel-system-roles.selinux	配置SELinux策略及模式
rhel-system-roles.timesync	配置网络时间协议
rhel-system-roles.postfix	配置邮件传输服务
rhel-system-roles.firewall	配置防火墙服务
rhel-system-roles.tuned	    配置系统调优选项

小实验:创建用于同步时间的剧本文件

可以把rhel-system-roles.timesync角色的剧本复制过来修改使用

cp /usr/share/doc/rhel-system-roles/timesync/example-timesync-playbook.yml timesync.yml
vim timesync.yml
---
- hosts: all
  vars:
    timesync_ntp_servers:
      - hostname: pool.ntp.org
        iburst: yes
  roles:
    - rhel-system-roles.timesync

从外部获取角色

Ansible Galaxy是Ansible的一个官方社区,用于共享角色和功能代码,用户可以在网站自由地共享和下载Ansible角色。该社区是管理和使用角色的不二之选。

Ansible Galaxy 官网首页:https://galaxy.ansible.com

小实验:安装nginx角色

进入Ansible Galaxy 官网,搜索到nginx角色,进入详情页,在Installation字段可以看到相应的安装方式。

ansible-galaxy install nginxinc.nginx

小实验:安装第三方网页上的角色

vim nginx.yml
---
- src: https://www.linuxprobe.com/Software/nginxinc-nginx_core-0.3.0.tar.gz
  name: nginx-core
ansible-galaxy install -r nginx.yml

创建新的角色

查看默认角色位置

vim /etc/ansible/ansible.cfg
68 #roles_path    = /etc/ansible/roles

小实验:在默认角色目录下,创建apache的角色

需求

任务1:安装httpd网站服务。

任务2:运行httpd网站服务,并加入到开机启动项中。

任务3:配置防火墙,使其放行HTTP协议。

任务4:根据每台主机的变量值,生成不同的主页文件。

cd /etc/ansible/roles
ansible-galaxy init apache
cd apache
vim tasks/main.yml
---
- name: one
  yum:
          name: httpd
          state: latest
- name: two
  service:
          name: httpd
          state: started
          enabled: yes
- name: three
  firewalld:
          service: http
          permanent: yes
          state: enabled
          immediate: yes
- name: four
  template:
          src: index.html.j2
          dest: /var/www/html/index.html

重要命令 ansible all -m setup -a 'filter="*需要查询的内容*"' ,用于查询魔法变量

查询 FQDN(Fully Qualified Domain Name,完全限定域名)

ansible all -m setup -a 'filter="*fqdn*"'
192.168.10.20 | SUCCESS => {
    "ansible_facts": {
        "ansible_fqdn": "linuxprobe.com",
        "discovered_interpreter_python": "/usr/libexec/platform-python"
    },
    "changed": false
}

查询  ip地址

ansible all -m setup -a 'filter="*ip*"'
192.168.10.20 | SUCCESS => {
    "ansible_facts": {
        "ansible_all_ipv4_addresses": [
            "192.168.10.20",
            "192.168.122.1"
        ],

编辑主页文件

vim templates/index.html.j2
Welcome to {{ ansible_fqdn }} on {{ ansible_all_ipv4_addresses }}

编写一个用于调用apache角色的yml文件

cd ~
vim roles.yml
---
- name: 调用自建角色
  hosts: all
  roles:
          - apache

运行剧本

ansible-playbook roles.yml

五 创建和使用逻辑卷

准备工作

首先在prod组的两台主机上分别添加一块硬盘设备,大小为20GB,类型为SCSI,其余选项选择默认值

小实验:创建剧本

需求:在所有受控主机上创建research卷组,大小150M,在research卷组上创建date逻辑卷,大小150M,并且格式化 ,文件系统为ext4,如果创建失败,则输出信息"Could not create logical volume of that size"

vim lv.yml
---
- name: 创建和使用逻辑卷
  hosts: all
  tasks:
          - block:
                  - name: one
                    lvg:
                            vg: research
                            pvs: /dev/sdb
                            pesize: 150M
                  - name: two
                    lvol:
                            vg: research
                            lv: data
                            size: 150M
                  - name: three
                    filesystem:
                            fstype: ext4
                            dev: /dev/research/data
            rescue:
                    - debug:
                            msg: "Could not create logical volume of that size"

执行剧本

ansible-playbook lv.yml

六 判断主机组名

小实验:创建剧本

需求

若主机在dev分组中,则修改/etc/issue文件内容为Development;

若主机在test分组中,则修改/etc/issue文件内容为Test;

若主机在prod分组中,则修改/etc/issue文件内容为Production。

vim issue.yml
---
- name: 修改文件内容
  hosts: all
  tasks:
          - name: one
            copy:
                    content: 'Development'
                    dest: /etc/issue
            when: "inventory_hostname in groups.dev"
          - name: two
            copy:
                    content: 'Test'
                    dest: /etc/issue
            when: "inventory_hostname in groups.test"
          - name: three
            copy:
                    content: 'Production'
                    dest: /etc/issue
            when: "inventory_hostname in groups.prod"

执行剧本

ansible-playbook issue.yml

七 管理文件属性

小实验:创建剧本

需求:

请创建出一个名为/linuxprobe的新目录,所有者及所属组均为root管理员身份;

设置所有者和所属于组拥有对文件的完全控制权,而其他人则只有阅读和执行权限;

给予SGID特殊权限;

仅在dev主机组的主机上实施。

vim chmod.yml
---
- name: 管理文件属性
  hosts: dev
  tasks:
          - name: one
            file:
                    path: /linuxprobe
                    state: directory 
                    owner: root
                    group: root
                    mode: '2775'
          - name: two
            file:
                    src: /linuxprobe
                    dest: /linuxcool
                    state: link

执行剧本

ansible-playbook chmod.yml

八 管理密码库文件

实验:加密文件内容

需求:

创建一个配置文件,使用密码对其加密

1 创建出一个名为locker.yml的配置文件

vim locker.yml
---
pw_developer: Imadev
pw_manager: Imamgr

2 使用ansible-vault命令对文件进行加密

创建保存密码的文件

vim /root/secret.txt
whenyouwishuponastar

修改权限

chmod 600 /root/secret.txt

修改主配置文件中的密码路径

vim /etc/ansible/ansible.cfg
140 vault_password_file = /root/secret.txt

3 加密文件

ansible-vault encrypt locker.yml

查看下效果

cat locker.yml
$ANSIBLE_VAULT;1.1;AES256
38653234313839336138383931663837333533396161343730353530313038313631653439366335
3432346333346239386334663836643432353434373733310a306662303565633762313232663763
38366334316239376262656230643531656665376166663635656436363338626464333430343162
6664643035316133650a333331393538616130656136653630303239663561663237373733373638
62383234303061623865633466336636363961623039343236356336356361613736333739623961
6334303865663838623363333339396637363061626363383266

可以使用--ask-vault-pass参数进行修改密码

ansible-vault rekey --ask-vault-pass locker.yml
Vault password: 输入旧的密码
New Vault password: 输入新的密码
Confirm New Vault password: 再输入新的密码
Rekey successful

4 查看和修改加密文件的内容

查看内容

ansible-vault view locker.yml
Vault password: 输入密码后敲击回车确认

修改内容

ansible-vault edit locker.yml

你可能感兴趣的:(linux学习-部署,redhat,ansible)