Automating Configuration and Remediation with Ansible —— 使用 Ansible 自动化配置和修复

2023-03-14
2023-03-14
4 min read
Hits

  本文是 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 模块的相关参数
Avatar

Hui.Ke

❤ Cyber Security | Safety is a priority.