ansible安装配置文档
Ansible 入门指南
一、概述
-
参考文档:
-
目标:
- 快速上手 Ansible 的基本安装、配置与使用。
二、环境要求
-
操作系统:
- Ubuntu 18.04
- CentOS 7(或其他支持的系统)
-
工具:
- Ansible
三、安装 Ansible
1. 在 Ubuntu 上安装 Ansible
sudo apt-get updatesudo apt-get install software-properties-common -ysudo apt-add-repository ppa:ansible/ansiblesudo apt-get updatesudo apt-get install ansible -y
2. 在 CentOS 上安装 Ansible
# 安装 EPEL 仓库(适用于 CentOS/RHEL/Scientific Linux)sudo yum install https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm -y
# 安装 Ansiblesudo yum install ansible -y
四、Ansible 配置
1. 修改配置文件
编辑 Ansible 的主配置文件 /etc/ansible/ansible.cfg
,禁用公钥认证检查:
sudo vi /etc/ansible/ansible.cfg
添加或修改以下内容:
[defaults]host_key_checking = False
2. 配置主机清单 (inventory
)
编辑 /etc/ansible/hosts
文件,定义主机组和变量:
sudo vi /etc/ansible/hosts
示例内容:
[weball:children]web21xweb20xweb19xweb18xweb17xweb16x
[weball:vars]ansible_ssh_port=25680ansible_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. 测试连接
向所有主机发送简单命令:
ansible all -a "/bin/echo hello"
2. 执行远程命令
在所有主机上执行 yum update
:
ansible all -a "yum update -y"
3. 针对特定主机组执行命令
在 web17x
组的主机上执行 yum update
:
ansible web17x -a "yum update -y"
六、处理 Python 版本问题
1. 默认 Python 版本
Ansible 默认使用目标主机的 Python 2.7。如果目标主机仅安装了 Python 3,需要在命令中指定解释器:
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 密码:
cd /etc/ansibleansible-playbook -k -i hosts html.yml -e 'ansible_python_interpreter=/usr/bin/python3'
2. 后续部署(SSH 免密码登录)
确保目标主机已配置 SSH 公钥认证后,直接运行 Playbook:
ansible-playbook -i hosts html.yml -e 'ansible_python_interpreter=/usr/bin/python3'
八、Playbook 常用命令
1. 列出所有主机
查看 Playbook 将作用于哪些主机:
ansible-playbook -i hosts all.yml --list-hosts
2. 列出所有标签
查看 Playbook 中定义的标签:
ansible-playbook -i hosts all.yml --list-tags
3. 指定标签运行任务
仅执行标记为 new
的任务:
ansible-playbook -i hosts all.yml --tags new
4. 限制执行的主机组
仅对 mariadb_c
组的主机执行特定任务:
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
文件,添加目标主机:
sudo vi /etc/hosts
内容:
202.91.33.232 web1.gaojinbo.com23.105.216.108 web2.gaojinbo.com
2. 配置 Ansible 主配置文件
编辑 /etc/ansible/ansible.cfg
,设置默认参数:
sudo vi /etc/ansible/ansible.cfg
内容:
[defaults]forks = 8host_key_checking = False
[ssh_connection]scp_if_ssh=True
3. 定义主机清单
创建并编辑 /etc/ansible/hosts
文件,定义主机组和变量:
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]webserversdbs
[webservers:vars]ansible_ssh_port=25680ansible_ssh_user=root
[new:vars]ansible_ssh_port=22ansible_ssh_user=root
三、配置 SSH 免密登录
1. 生成 SSH 密钥
在控制节点上生成 RSA 密钥对:
ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa
2. 添加公钥到目标主机
将公钥添加到 new
组主机的 authorized_keys
文件中:
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. 创建目录结构
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. 语法检查
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. 重启目标主机
ansible new -m shell -a 'reboot'ansible web4.gaojinbo.com -m shell -a 'reboot'
Ansible 远程命令执行指南
一、概述
Ansible 提供了多种模块用于远程管理主机,其中 command
和 shell
模块常用于执行远程命令。本文介绍如何使用这些模块对单个主机或主机组执行命令。
二、基本命令示例
1. 使用 command
模块执行简单命令
对指定主机执行 date
命令
ansible 192.168.119.134 -m command -a 'date'
- 说明:
-m command
: 指定使用command
模块。-a 'date'
: 指定要执行的命令为date
。
对指定主机组执行 date
命令
前提是已在 /etc/ansible/hosts
文件中配置了主机组 test
。
ansible test -m command -a 'date'
- 说明:
test
: 目标主机组的名称。- 其他参数同上。
2. 使用 shell
模块执行复杂命令
对指定主机执行带管道的命令
当命令包含管道 (|
) 或其他 Shell 特性时,需使用 shell
模块。
ansible 192.168.119.134 -m shell -a 'ls | grep txt'
- 说明:
-m shell
: 指定使用shell
模块。-a 'ls | grep txt'
: 执行包含管道的命令,列出当前目录下文件名包含txt
的文件。
三、注意事项
-
权限要求:
- 确保 Ansible 控制节点可以通过 SSH 无密码登录到目标主机,或者在执行命令时提供正确的 SSH 用户和密码。
-
模块选择:
command
模块:- 更加安全,适用于执行简单的命令。
- 不支持 Shell 特性(如管道、重定向等)。
shell
模块:- 支持所有 Shell 特性,但存在一定的安全风险,尤其是当命令中包含用户输入时。
-
幂等性:
command
模块设计为幂等的,即多次执行不会对系统状态产生额外影响。shell
模块不具备天然的幂等性,需谨慎使用以避免重复执行导致的问题。
-
错误处理:
- 使用
-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 ‘ls | grep txt’` |
五、最佳实践
-
优先使用
command
模块:- 除非需要使用 Shell 特性,否则应优先选择
command
模块以确保命令的安全性和幂等性。
- 除非需要使用 Shell 特性,否则应优先选择
-
使用 Playbook 管理任务:
- 对于复杂的任务或多步骤操作,建议编写 Ansible Playbook,而不是直接在命令行中执行。
-
配置 SSH 免密登录:
- 设置 SSH 密钥认证,避免每次执行命令时输入密码,提高自动化效率。
-
版本控制:
- 将 Ansible 剧本和配置文件纳入版本控制系统(如 Git),便于跟踪变更和管理。