Automating Configuration and Remediation with Ansible —— 使用 Ansible 自动化配置和修复
本文是 RHCSS 培训课程第二节课的内容,博主结合红帽官方英文教材《RH415-RHEL7.5 Automating Configuration and Remediation with Ansible》和红帽讲师翻译的中文教材《第二章 使用 Ansible 自动化配置和修复》整理了如下笔记。
几行代码
vim -O2 xxx.yaml abc.ini # 将 xxx.yaml 和 abc.ini 两个文件平行分屏展示
vim -o2 xxx.yaml abc.ini # 将 xxx.yaml 和 abc.ini 两个文件垂直分屏展示
man 5 ssh_config # 查看 SSH 配置帮助,其中“StrictHostKeyChecking”项控制 SSH 连接是否打印出提示信息
cat > ~/.ssh/config << EOF
> Host * # 此行可省略
> StrictHostKeyChecking no
> EOF 写入该配置,并运行 chmod 0600 ~/.ssh/config 后,可以去除连接 SSH 时的前面提示部分并默认接受主机公钥
chmod 0600 ~/.ssh/config # 输入上一条命令后一定要输入该命令设置 ~/.ssh/config 权限,否则在连接 SSH 时会报权限错:Bad owner or permissions on /root/.ssh/config
vim ~/.vimrc # 设置 vim 编辑格式
autocmd FileType yaml setlocal ai ts=2 sw=2 et # 当编辑 yaml 格式文件时的空格、Tab 键对齐宽度等等
set tabstop = 2 # 设置 Tab 键对应两个字符
set cursorcolumn # 设置光标垂直对齐
set cursorline # 设置光标水平对齐
sudo yum provides httpd # 查看 yum 源里 httpd 提供的版本
几个知识点
- 命令式声明:shell 脚本使用,告诉你怎么做就必须怎么做
- 陈述式声明:大多数编程语言使用,广泛应用于 DevOps 和云原生等,通过无限地调整最终符合预定目标的行为
- 幂等性:只要达到预期目标,无论如何更改指令都不做相应的状态修改
fondation 中 /etc/hosts 有对应的主机和 IP
Ansible(使用 Python 开发)
- Inventory 清单:主机清单,要操作的机器。Ansible 默认 inventory 为 /etc/ansible/hosts,调用优先级最低,用户自定义优先级最高
- Modules 模块:下发执行任务,分为 Core Modules 核心模块和 Custom Modules 自定义模块
- Plugins 插件:控制节点与受管主机之间的连接,默认使用 SSH
- Playbooks 剧本:要做什么
- control node 控制节点:Ansible 装在此处,通过 SSH 免密登录的方式登录到受管主机并下发执行任务
- managed nodes 受管主机
graph LR;
A[控制节点的普通用户devops] -->|SSH免密登录| B[受管主机的登陆用户devops]
B -->|特权升级sudo| C[受管主机的root]
安装并配置
sudo yum install -y ansible # 在控制节点安装 Ansible
sudo useradd devops # 创建用户 devops 作为配置和运行 Ansible 的用户
passwd devops # 设置 devops 用户密码为 redhat
su - devops # 切换至 devops 用户
mkdir ansible # 创建 ansible 目录作为存放 Ansible 相关配置目录
cd ansible # 进入 ansible 配置目录,并新建 ansible.cfg、inventory 和 provision-nodes.yaml 文件,具体内容如下所示
ansible.cfg
Ansible 配置文件 ansible.cfg 的编写格式为 ini
ansible.cfg 默认配置文件位于 /etc/ansible/ansible.cfg
,编写自定义配置文件时可参考
在 ansible.cfg 中使用注释必须为行间注释,否则运行 Ansible 时会报错
[defaults]
# 通用配置
inventory = ./inventory
# 自定义主机清单文件,名字可自定义
remote_user = devops
# ansible 受管主机登陆用户
ask_pass = False
# 免密登录
log_path = ./ansible-running.log
# 名字可自定义
[privilege_escalation]
# 提权配置
become = True
# 允许提权
become_method = sudo
# 提权使用命令
become_user = root
# 提权至 root
become_ask_pass = False
# sudo 免密提权
inventory
inventory 默认配置文件位于 /etc/ansible/hosts
,编写自定义主机清单时可参考
在 inventory 中使用注释必须为行内注释,否则运行 Ansible 时会报错
[workstation] # 主机组
workstation.lab.example.com # 受管主机
[webservers] # webservers 主机组
servera.lab.example.com # 受管主机
serverb.lab.example.com # 受管主机
[dbservers] # dbservers 主机组
server[c:d].lab.example.com # 受管主机
[prod:children] # 嵌套组
webservers # webservers 主机组
dbservers # dbservers 主机组
provision-nodes.yaml(playbook 剧本)
- name: Play one # 剧本名
hosts: webservers # 针对主机组 webservers
tasks: # 任务
- name: Install associated packages # 任务名
yum: # 调用 yum 模块
name:
- httpd-2.4.6-80.el7.x86_64
- mariadb-5.5.56-2.el7.x86_64
- php-5.4.16-45.el7.x86_64
state: present # 查看是否已安装上述包
- name: Create group
group: # 调用 group 模块
name: appgrp1
state: present # 查看是否存在上述组 appgrp1
- name: Create user
user: # 调用 user 模块
name: appuser1
state: present # 查看是否存在上述用户 appuser1
append: true # 判断是否已加入 appuser1 组
配置受管主机
for i in workstation server{a..d}; do ssh root@$i 'id devops'; done # 判断 server 主机组是否有 devops 用户
useradd devops; echo redhat | passwd --stdin devops; echo "devops ALL=(ALL) NOPASSWD:ALL" > /etc/sudoers.d/devops # 创建用户 devops,设置密码为 redhat,并配置免密提权
ssh-keygen # devops 用户生成 ssh
for i in workstation server{a..d}; do ssh-copy-id devops@${i}.lab.example.com; done # 批量推送 ssh key
第一次测试
ansible webservers -m ping # 测试 webserver 主机组连通性
ansible --version # 查看 Ansible 使用的是否是自定义配置文件
ansible all -m command -a 'id' -b # 测试是否能提权至 root
运行剧本
ansible-playbook provision-nodes.yaml # 编写完剧本并通过上述各种测试后,可尝试运行剧本以完成相应任务
playbook 运行后显示的绿色结果代表无任何变化,黄色结果为有变更,红色结果为失败。
Ansible 一些用法
ansible dbservers -m copy -a "src=ansible.cfg dest=/tmp/ansible.cfg" # copy 文件或整个目录到 dbservers 主机组
ansible-doc -l # 列举已安装的模块
ansible-doc group # 查看 group 模块如何使用,可通过检索 EXAMPLES 参考编写剧本任务中调用 group 模块的相关参数