Skip to content

ansible安装配置文档

Ansible 入门指南

一、概述


二、环境要求

  • 操作系统:

    • Ubuntu 18.04
    • CentOS 7(或其他支持的系统)
  • 工具:

    • Ansible

三、安装 Ansible

1. 在 Ubuntu 上安装 Ansible

Terminal window
sudo apt-get update
sudo apt-get install software-properties-common -y
sudo apt-add-repository ppa:ansible/ansible
sudo apt-get update
sudo apt-get install ansible -y

2. 在 CentOS 上安装 Ansible

Terminal window
# 安装 EPEL 仓库(适用于 CentOS/RHEL/Scientific Linux)
sudo yum install https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm -y
# 安装 Ansible
sudo yum install ansible -y

四、Ansible 配置

1. 修改配置文件

编辑 Ansible 的主配置文件 /etc/ansible/ansible.cfg,禁用公钥认证检查:

Terminal window
sudo vi /etc/ansible/ansible.cfg

添加或修改以下内容:

[defaults]
host_key_checking = False

2. 配置主机清单 (inventory)

编辑 /etc/ansible/hosts 文件,定义主机组和变量:

Terminal window
sudo vi /etc/ansible/hosts

示例内容:

[weball:children]
web21x
web20x
web19x
web18x
web17x
web16x
[weball:vars]
ansible_ssh_port=25680
ansible_ssh_user=root
[web21x]
web21[0:5]
[web20x]
web20[0:9]
[web19x]
web19[0:9]
[web18x]
web18[0:9]
[web17x]
web17[0:9]
[web16x]
web16[0:9]
web159

五、Ansible 基本命令

1. 测试连接

向所有主机发送简单命令:

Terminal window
ansible all -a "/bin/echo hello"

2. 执行远程命令

在所有主机上执行 yum update

Terminal window
ansible all -a "yum update -y"

3. 针对特定主机组执行命令

web17x 组的主机上执行 yum update

Terminal window
ansible web17x -a "yum update -y"

六、处理 Python 版本问题

1. 默认 Python 版本

Ansible 默认使用目标主机的 Python 2.7。如果目标主机仅安装了 Python 3,需要在命令中指定解释器:

Terminal window
ansible all -a "your_command" -e 'ansible_python_interpreter=/usr/bin/python3'

2. 全局配置 Python 解释器

在 Playbook 或 Inventory 中设置默认的 Python 解释器:

[weball:vars]
ansible_python_interpreter=/usr/bin/python3

七、Ansible Playbook 使用

1. 第一次部署(通过密码登录 SSH)

使用 -k 参数提示输入 SSH 密码:

Terminal window
cd /etc/ansible
ansible-playbook -k -i hosts html.yml -e 'ansible_python_interpreter=/usr/bin/python3'

2. 后续部署(SSH 免密码登录)

确保目标主机已配置 SSH 公钥认证后,直接运行 Playbook:

Terminal window
ansible-playbook -i hosts html.yml -e 'ansible_python_interpreter=/usr/bin/python3'

八、Playbook 常用命令

1. 列出所有主机

查看 Playbook 将作用于哪些主机:

Terminal window
ansible-playbook -i hosts all.yml --list-hosts

2. 列出所有标签

查看 Playbook 中定义的标签:

Terminal window
ansible-playbook -i hosts all.yml --list-tags

3. 指定标签运行任务

仅执行标记为 new 的任务:

Terminal window
ansible-playbook -i hosts all.yml --tags new

4. 限制执行的主机组

仅对 mariadb_c 组的主机执行特定任务:

Terminal window
ansible-playbook -i hosts all.yml --tags mariadb_c --limit mariadb_c

使用 Ansible 根据操作系统类型安装相应软件

一、概述

  • 目标: 使用 Ansible 自动化安装软件包并根据操作系统类型(Debian/RedHat)执行不同的配置。
  • 环境:
    • Ansible 版本: 2.10.8
    • 目标主机:
      • Ubuntu 22.04/20.04
      • CentOS 7.9

二、配置主机组和变量

1. 编辑 /etc/hosts

在控制节点上编辑 /etc/hosts 文件,添加目标主机:

Terminal window
sudo vi /etc/hosts

内容:

202.91.33.232 web1.gaojinbo.com
23.105.216.108 web2.gaojinbo.com

2. 配置 Ansible 主配置文件

编辑 /etc/ansible/ansible.cfg,设置默认参数:

Terminal window
sudo vi /etc/ansible/ansible.cfg

内容:

[defaults]
forks = 8
host_key_checking = False
[ssh_connection]
scp_if_ssh=True

3. 定义主机清单

创建并编辑 /etc/ansible/hosts 文件,定义主机组和变量:

Terminal window
sudo vi /etc/ansible/hosts

内容:

[new]
#23.105.216.108
#202.91.33.232
#web[3:4].gaojinbo.com
[webservers]
web[1:4].gaojinbo.com
[dbs]
db[01:02].gaojinbo.com
[allservers:children]
webservers
dbs
[webservers:vars]
ansible_ssh_port=25680
ansible_ssh_user=root
[new:vars]
ansible_ssh_port=22
ansible_ssh_user=root

三、配置 SSH 免密登录

1. 生成 SSH 密钥

在控制节点上生成 RSA 密钥对:

Terminal window
ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa

2. 添加公钥到目标主机

将公钥添加到 new 组主机的 authorized_keys 文件中:

Terminal window
ansible new -k -m shell -a 'echo "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQCoTeyWnEidc2nc6wOiDJEIizN6mBFqxJPWEilhB/JO2Y66VmwgBWw2pjn+RLml36142CRfuw70eJ0PH2n0XplJbm0aZl++DWTaEeswK8VMJW7cXTgxEx+AmzlODhWCl/wzcBnPZyGLC+P9pUFejsgJ5xTgWq0uDs5f0LKifcbK29YqOmz1ryvNazJimY477r6vGhL86O+wYeWKDorYd0o3DDxwJ2bLLJGaE1I+1vWOttDZj1WzxR5bUzQNALcGLjrU7CnrvBZv+FrZg7jrX7KMBgZjF/hg/p/5V15y0VUDlFqkpyG99hobR5yiY3mpfyuRWvvolUghl7f2+bT9K2YLP67PQV+6z5rmu6lhPbwXxLarLrWK4u1SuoIUNURpEBKLcamblukVPNkEEEO5YlfI+aO7cd7aF+AhFVMn+alKu1JO5iPXp+IMAbG07zX3fqN39b9gc4enyNNuwJZYORh/gY1z8+Ptb27UdU1YAuYp1MioVxB2dRNP7StXdps2YfU= root@hy" >> ~/.ssh/authorized_keys'

3. 测试连接

  • Ping 测试:
    Terminal window
    ansible new -m ping
  • 执行命令测试:
    Terminal window
    ansible new -m shell -a 'ip r'

四、编写 Playbook

1. 创建目录结构

Terminal window
mkdir -p roles/common/files/
mkdir -p roles/common/tasks/
cp ~/.ssh/id_rsa.pub roles/common/files/

2. 定义 Playbook 文件

common.yml

适用于所有主机的通用任务:

---
- name: Install all server common
hosts: all
remote_user: root
tags: common
roles:
- common

new.yml

适用于 new 组主机的任务:

---
- name: Install all server common for new servers
hosts: new
remote_user: root
tags: new
roles:
- common

3. 定义角色任务

roles/common/tasks/main.yml

主任务文件,根据操作系统类型包含不同的子任务:

- include: debian.yml
when: ansible_os_family == 'Debian'
- include: redhat.yml
when: ansible_os_family == 'RedHat'
- name: Create SSH public key directory
file:
path: /root/.ssh
owner: root
group: root
mode: '0600'
state: directory
- name: Copy the SSH public key
copy:
src: id_rsa.pub
dest: /root/.ssh/authorized_keys
- name: Copy additional configuration files
copy:
src: "{{ item }}"
dest: "/etc/{{ item.split('.')[0] }}/{{ item.split('.')[1] }}"
mode: '0644'
loop:
- limits.conf
- sysctl.conf
- snmpd.conf
- name: Setup alternate SSH port
lineinfile:
dest: /etc/ssh/sshd_config
regexp: '^#Port'
line: 'Port 25680'
- name: Ensure SNMP service is running and enabled
service:
name: snmpd
state: started
enabled: yes
- name: Restart SSH service
service:
name: sshd
state: restarted
enabled: yes
- name: Set timezone to Asia/Shanghai
timezone:
name: Asia/Shanghai
- name: Create web cache directory
file:
path: /www/web/proxy/cache
owner: www-data
group: www-data
mode: '0755'
state: directory

roles/common/tasks/redhat.yml

适用于 RedHat 系列主机的任务:

---
- name: Add user 'www-data'
ansible.builtin.user:
name: www-data
shell: /usr/sbin/nologin
- name: Disable SELinux
selinux:
state: disabled
- name: Disable firewalld
systemd:
name: firewalld
enabled: no
- name: Disable kdump
systemd:
name: kdump
enabled: no
- name: Disable postfix
systemd:
name: postfix
enabled: no
- name: Upgrade all packages
yum:
name: '*'
state: latest
- name: Install EPEL repository
yum:
name: epel-release
state: latest
- name: Install Development Tools
yum:
name: "@Development tools"
state: present
- name: Install additional packages
yum:
name: "{{ packages }}"
state: latest
vars:
packages:
- net-tools
- lrzsz
- python
- net-snmp
- httpry
- screen
- lvm2
- git
- vim
- wget
- unzip
- ntpdate
- curl
- rsync
- patch
- dmidecode
- rdate
- hdparm
- pcre-devel
- openssl-devel
- lua-devel
- axel

roles/common/tasks/debian.yml

适用于 Debian 系列主机的任务:

---
- name: Clean APT cache
apt:
autoclean: yes
autoremove: yes
force_apt_get: yes
- name: Update APT package list
apt:
update_cache: yes
force_apt_get: yes
- name: Upgrade all packages
apt:
name: "*"
state: latest
upgrade: dist
force_apt_get: yes
- name: Install additional packages
apt:
name: "{{ packages }}"
state: latest
update_cache: yes
vars:
packages:
- axel
- lrzsz
- snmpd
- httpry
- screen
- lvm2
- git
- vim
- build-essential
- zlib1g-dev
- curl
- iptables
- rsync
- jq
- net-tools
- aptitude
- xfsprogs
- nfs-common
- name: Create rc.local link
file:
src: /lib/systemd/system/rc-local.service
dest: /etc/systemd/system/rc-local.service
owner: root
group: root
mode: '0755'
state: link
- name: Copy rc.local script
copy:
src: rc.local
dest: /etc/rc.local
mode: '0755'

五、执行 Playbook

1. 语法检查

Terminal window
ansible-playbook new.yml -e ansible_ssh_port=22 --syntax-check

2. 执行 Playbook

  • 针对 new 组主机:
    Terminal window
    ansible-playbook new.yml -e ansible_ssh_port=22
  • 针对所有主机:
    Terminal window
    ansible-playbook common.yml

3. 重启目标主机

Terminal window
ansible new -m shell -a 'reboot'
ansible web4.gaojinbo.com -m shell -a 'reboot'

Ansible 远程命令执行指南

一、概述

Ansible 提供了多种模块用于远程管理主机,其中 commandshell 模块常用于执行远程命令。本文介绍如何使用这些模块对单个主机或主机组执行命令。


二、基本命令示例

1. 使用 command 模块执行简单命令

对指定主机执行 date 命令

Terminal window
ansible 192.168.119.134 -m command -a 'date'
  • 说明:
    • -m command: 指定使用 command 模块。
    • -a 'date': 指定要执行的命令为 date

对指定主机组执行 date 命令

前提是已在 /etc/ansible/hosts 文件中配置了主机组 test

Terminal window
ansible test -m command -a 'date'
  • 说明:
    • test: 目标主机组的名称。
    • 其他参数同上。

2. 使用 shell 模块执行复杂命令

对指定主机执行带管道的命令

当命令包含管道 (|) 或其他 Shell 特性时,需使用 shell 模块。

Terminal window
ansible 192.168.119.134 -m shell -a 'ls | grep txt'
  • 说明:
    • -m shell: 指定使用 shell 模块。
    • -a 'ls | grep txt': 执行包含管道的命令,列出当前目录下文件名包含 txt 的文件。

三、注意事项

  1. 权限要求:

    • 确保 Ansible 控制节点可以通过 SSH 无密码登录到目标主机,或者在执行命令时提供正确的 SSH 用户和密码。
  2. 模块选择:

    • command 模块:
      • 更加安全,适用于执行简单的命令。
      • 不支持 Shell 特性(如管道、重定向等)。
    • shell 模块:
      • 支持所有 Shell 特性,但存在一定的安全风险,尤其是当命令中包含用户输入时。
  3. 幂等性:

    • command 模块设计为幂等的,即多次执行不会对系统状态产生额外影响。
    • shell 模块不具备天然的幂等性,需谨慎使用以避免重复执行导致的问题。
  4. 错误处理:

    • 使用 -u 参数指定非默认用户(如 root):
      Terminal window
      ansible 192.168.119.134 -m command -a 'date' -u root
    • 使用 -b 参数以提升权限执行命令(需要配置 become 相关设置):
      Terminal window
      ansible 192.168.119.134 -m command -a 'systemctl restart sshd' -b

四、示例总结

命令描述
ansible 192.168.119.134 -m command -a 'date'在 IP 为 192.168.119.134 的主机上执行 date 命令。
ansible test -m command -a 'date'test 主机组的所有主机上执行 date 命令。
`ansible 192.168.119.134 -m shell -a ‘lsgrep txt’`

五、最佳实践

  • 优先使用 command 模块:

    • 除非需要使用 Shell 特性,否则应优先选择 command 模块以确保命令的安全性和幂等性。
  • 使用 Playbook 管理任务:

    • 对于复杂的任务或多步骤操作,建议编写 Ansible Playbook,而不是直接在命令行中执行。
  • 配置 SSH 免密登录:

    • 设置 SSH 密钥认证,避免每次执行命令时输入密码,提高自动化效率。
  • 版本控制:

    • 将 Ansible 剧本和配置文件纳入版本控制系统(如 Git),便于跟踪变更和管理。