自动化运维工具ansible基础
# macOS安装redis-cli
本文介绍自动化运维工具ansible的安装步骤和基础使用方法。通过ansible可以在本地方便地管理远程主机列表(如同时在某一组远程主机执行一个“按序执行的任务列表”等)。
# 1. 安装ansible
此处以macOS为例
执行命令brew install ansible
wangshibiao@bogon ~ % brew install ansible
Updating Homebrew...
==> Downloading https://homebrew.bintray.com/bottles/libyaml-0.2.5.big_sur.bottle.tar.gz
######################################################################## 100.0%
==> Downloading https://homebrew.bintray.com/bottles/ansible-3.2.0.big_sur.bottle.tar.gz
==> Downloading from https://d29vzk4ow07wi7.cloudfront.net/822cc4694e6e5bc9856d5bdcfd58ce7714c7793c99938e897cb6cf49675742d8?response-content-disposition=a
######################################################################## 100.0%
==> Installing dependencies for ansible: libyaml
==> Installing ansible dependency: libyaml
==> Pouring libyaml-0.2.5.big_sur.bottle.tar.gz
🍺 /usr/local/Cellar/libyaml/0.2.5: 10 files, 348.4KB
==> Installing ansible
==> Pouring ansible-3.2.0.big_sur.bottle.tar.gz
🍺 /usr/local/Cellar/ansible/3.2.0: 38,732 files, 345.4MB
wangshibiao@bogon ~ %
查看ansible版本, 如下
wangshibiao@bogon ~ % ansible --version
ansible 2.10.7
config file = None
configured module search path = ['/Users/wangshibiao/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules']
ansible python module location = /usr/local/Cellar/ansible/3.2.0/libexec/lib/python3.9/site-packages/ansible
executable location = /usr/local/bin/ansible
python version = 3.9.4 (default, Apr 5 2021, 01:50:46) [Clang 12.0.0 (clang-1200.0.32.29)]
wangshibiao@bogon ~ %
# 2. 配置inventory文件
inventory文件用于配置远端的服务器主机列表, 示例如下:
wangshibiao@bogon ~ % cat ~/ansible-hosts
[webserver]
server1 ansible_ssh_host=192.168.1.100 ansible_ssh_port=22 ansible_ssh_user=root
server2 ansible_ssh_host=192.168.1.100 ansible_ssh_port=22 ansible_ssh_user=root
wangshibiao@bogon ~ %
本地需要事先配置支持通过sshkey密钥登陆远程主机 如上示例中的server1和server2是为每个远程主机定义的别名 支持以分组的方式定义主机列表
# 3. 管理远程主机
对于简单的使用场景(如在远程主机上执行一个命令),那么通过命令行操作即可。
对于复杂的使用场景(如需要经过多个步骤,且各个步骤之间存在依赖关系等),那么就需要使用Playbook
配置文件来配置我们的任务执行过程。
# 3.1 通过命令行管理远程主机
配置好inventory文件后,下面就可以管理该文件中定义的远程主机了。
- 执行远程主机上的命令
下面的示例演示如何执行远程主机上的命令:
wangshibiao@bogon ~ % ansible -i ~/ansible-hosts server1 -m shell -a "ls -l /root/"
server1 | CHANGED | rc=0 >>
总用量 191624
-rwxr-xr-x 1 root root 10697256 8月 21 2020 deploy
-rw-r--r-- 1 root root 185515842 7月 6 2020 jdk-8u144-linux-x64.tar.gz
-rw-r--r-- 1 root root 8118 7月 6 2020 schema.sql
wangshibiao@bogon ~ %
wangshibiao@bogon ~ % ansible -i ~/ansible-hosts server2 -m shell -a "ls -l /root/"
server2 | CHANGED | rc=0 >>
总用量 191624
-rwxr-xr-x 1 root root 10697256 8月 21 2020 deploy
-rw-r--r-- 1 root root 185515842 7月 6 2020 jdk-8u144-linux-x64.tar.gz
-rw-r--r-- 1 root root 8118 7月 6 2020 schema.sql
wangshibiao@bogon ~ % ansible -i ~/ansible-hosts webserver -m shell -a "ls -l /root/"
server2 | CHANGED | rc=0 >>
总用量 191624
-rwxr-xr-x 1 root root 10697256 8月 21 2020 deploy
-rw-r--r-- 1 root root 185515842 7月 6 2020 jdk-8u144-linux-x64.tar.gz
-rw-r--r-- 1 root root 8118 7月 6 2020 schema.sql
server1 | CHANGED | rc=0 >>
总用量 191624
-rwxr-xr-x 1 root root 10697256 8月 21 2020 deploy
-rw-r--r-- 1 root root 185515842 7月 6 2020 jdk-8u144-linux-x64.tar.gz
-rw-r--r-- 1 root root 8118 7月 6 2020 schema.sql
wangshibiao@bogon ~ %
可以看出,可以通过ansible直接执行远程主机上的命令,执行的时候可以指定主机别名或组名
。
- 查看某个组下的主机列表
wangshibiao@bogon ~ % ansible -i ~/ansible-hosts webserver --list
hosts (2):
server1
server2
wangshibiao@bogon ~ %
- 通过-i参数指定inventory文件,即可很方便地管理远程主机
- 若不想每次执行都指定invertory文件路径,那么可以为ansible增加配置文件
~/ansible.cfg
,该配置文件中指定默认的inventory文件路径。配置方法如下:
inventory = /etc/ansible/hosts
# 3.2 通过Playbook管理远程主机
- 示例1 创建playbook配置文件
wangshibiao@bogon ansible % cat ./ansible-playbook.yml
---
- hosts: server1
tasks:
- name: 第1次查询/root/目录
shell: ls -l /root/
- name: 第2次查询/root/目录
shell: ls -l /root/
wangshibiao@bogon ansible %
执行ansible-playbook.yml
配置的任务, 命令为ansible-playbook -i ./ansible-hosts ./ansible-playbook.yml
, 执行过程如下:
wangshibiao@bogon ansible % ansible-playbook -i ./ansible-hosts ./ansible-playbook.yml
PLAY [server1] ******************************************************************************************************************************************
TASK [Gathering Facts] **********************************************************************************************************************************
ok: [server1]
TASK [第1次查询/root/目录] ************************************************************************************************************************************
changed: [server1]
TASK [第2次查询/root/目录] ************************************************************************************************************************************
changed: [server1]
PLAY RECAP **********************************************************************************************************************************************
server1 : ok=3 changed=2 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
wangshibiao@bogon ansible %
- 示例2 创建playbook配置文件
wangshibiao@bogon ansible % cat ./ansible-playbook2.yml
---
- hosts: server1
tasks:
- name: 第1次查询/root/目录
shell: ls -l /root/
register: out1
- name: 第2次查询/root/目录
shell: ls -l /root/
register: out2
- name: 打印第一次的执行结果
debug: var=out1
- name: 打印第2次的执行结果
debug: var=out2
wangshibiao@bogon ansible %
执行ansible-playbook.yml
配置的任务, 命令为ansible-playbook -i ./ansible-hosts ./ansible-playbook.yml
, 执行过程如下:
wangshibiao@bogon ansible % ansible-playbook -i ./ansible-hosts ./ansible-playbook2.yml
PLAY [server1] ******************************************************************************************************************************************
TASK [Gathering Facts] **********************************************************************************************************************************
ok: [server1]
TASK [第1次查询/root/目录] ************************************************************************************************************************************
changed: [server1]
TASK [第2次查询/root/目录] ************************************************************************************************************************************
changed: [server1]
TASK [打印第一次的执行结果] ***************************************************************************************************************************************
ok: [server1] => {
"out1": {
"changed": true,
"cmd": "ls -l /root/",
"delta": "0:00:00.024973",
"end": "2021-04-10 17:28:14.559925",
"failed": false,
"rc": 0,
"start": "2021-04-10 17:28:14.534952",
"stderr": "",
"stderr_lines": [],
"stdout": "总用量 191624\n-rwxr-xr-x 1 root root 10697256 8月 21 2020 deploy\n-rw-r--r-- 1 root root 185515842 7月 6 2020 jdk-8u144-linux-x64.tar.gz\n-rw-r--r-- 1 root root 8118 7月 6 2020 schema.sql",
"stdout_lines": [
"总用量 191624",
"-rwxr-xr-x 1 root root 10697256 8月 21 2020 deploy",
"-rw-r--r-- 1 root root 185515842 7月 6 2020 jdk-8u144-linux-x64.tar.gz",
"-rw-r--r-- 1 root root 8118 7月 6 2020 schema.sql"
]
}
}
TASK [打印第2次的执行结果] ***************************************************************************************************************************************
ok: [server1] => {
"out2": {
"changed": true,
"cmd": "ls -l /root/",
"delta": "0:00:00.025226",
"end": "2021-04-10 17:28:15.753111",
"failed": false,
"rc": 0,
"start": "2021-04-10 17:28:15.727885",
"stderr": "",
"stderr_lines": [],
"stdout": "总用量 191624\n-rwxr-xr-x 1 root root 10697256 8月 21 2020 deploy\n-rw-r--r-- 1 root root 185515842 7月 6 2020 jdk-8u144-linux-x64.tar.gz\n-rw-r--r-- 1 root root 8118 7月 6 2020 schema.sql",
"stdout_lines": [
"总用量 191624",
"-rwxr-xr-x 1 root root 10697256 8月 21 2020 deploy",
"-rw-r--r-- 1 root root 185515842 7月 6 2020 jdk-8u144-linux-x64.tar.gz",
"-rw-r--r-- 1 root root 8118 7月 6 2020 schema.sql"
]
}
}
PLAY RECAP **********************************************************************************************************************************************
server1 : ok=5 changed=2 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
wangshibiao@bogon ansible %
# 4. 模块
前文中控制远程主机实际上是通过ansible提供的各种模块实现的。常用的模块介绍详见ansible常用模块 (opens new window)
上次更新: 2021-04-17 23:22:49