一个计算机技术爱好者与学习者

0%

Ansible入门篇

1. Ansible简介

ansible是一个用于自动化运维的配置管理和应用部署工具。基于Python开发,集合了众多运维工具(puppet、cfengine、chef、func、fabric.SaltStack )的优点,实现了批量系统配置、批量程序部署、批量运行命令等功能。ansible是基于模块工作的,本身没有批量部署的能力,真正具有批量部署能力的是ansible所运行的模块。

ansible的基本架构:

  • 连接插件(connectior plugins)用于连接管理端和被管理端。
  • 核心模块(core modules)连接主机实现操作,它依赖于具体的模块来做具体的事情。
  • 自定义模块(custom modules)根据自己的需求编写具体的模块。
  • 插件(plugins)完成模块功能的补充。
  • 剧本(playbooks)ansible的配置文件,将多个任务定义在剧本中,由ansible自动执行。
  • 主机清单(host inventory)定义ansible需要操作主机的范围。

上述简介摘自ansible基础

参考文档:

2. 实验环境准备

两台主机,都是ubuntu14.04.4 server版,用户都是voidking。一台作为管理机,IP为192.168.56.101,一台作为被管理机(以下称为客户机),IP为192.168.56.102。

在管理机上安装ansible,一条命令搞定:sudo apt install ansible
不过,安装的ansible版本很低,默认1.5.4。这里我们通过添加源来安装最新版ansible:

1
2
3
4
5
sudo apt remove ansible
sudo apt-get install software-properties-common
sudo apt-add-repository ppa:ansible/ansible
sudo apt-get update
sudo apt-get install ansible

或者,使用pip安装指定版本的ansible,本文选择安装 2.6.11

1
sudo pip install ansible==2.6.11 -i https://pypi.tuna.tsinghua.edu.cn/simple

想要知道都有哪些版本,可以查看ansible版本列表

PS:如果是centos系统,还可以下载ansible rpm包,通过rmp命令安装 rpm -ivh ansible-2.6.11-1.el7.ans.noarch.rpm

3. 连接准备

1、在管理机生成密钥

1
ssh-keygen

连续回车即可。

2、将公钥写入客户机

1
ssh-copy-id -i .ssh/id_rsa.pub -p 22 voidking@192.168.56.102

3、在管理机添加客户机到hosts

1
sudo vim /etc/ansible/hosts

在文档最后添加:

1
2
[commonservers]
192.168.56.102

4、在管理机执行第一条命令

1
ansible all -m ping

5、在客户机把voidking用户添加进sudo免密,方便以后的操作

1
sudo vim /etc/sudoers

添加

1
voidking ALL = NOPASSWD: ALL

4. Ansible程序说明

4.1. 程序/命令列表

  • ansible:主程序,临时命令执行工具
  • ansible-doc:查看配置文档,模块功能查看工具
  • ansible-galaxy:下载/上传优秀代码或Roles模块的官网平台
  • ansible-lint:对playbook的语法进行检查的一个工具
  • ansible-playbook:定制自动化任务,编排剧本工具
  • ansible-pull:远程执行命令的工具
  • ansible-vault:文件加密工具
  • ansible-console:基于console界面与用户交互的执行工具

其中,最重要和最常用的是ansible。

4.2. ansible命令详解

ansible命令是ansible套装的核心部分,其主要用于执行ad-hoc命令,即单条命令。默认后面需要跟主机和选项部分,默认不指定模块时,使用的是command模块。command模块不是调用的shell的指令,所以没有bash的环境变量,也不能使用shell的一些操作方式,其他和shell模块没有区别。

格式:ansible <host-pattern> [-m module_name] [options]

参数列表:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
ansible [-h] [--version] [-v] [-b] [--become-method BECOME_METHOD]
[--become-user BECOME_USER]
[-K | --become-password-file BECOME_PASSWORD_FILE]
[-i INVENTORY] [--list-hosts] [-l SUBSET] [-P POLL_INTERVAL]
[-B SECONDS] [-o] [-t TREE] [--private-key PRIVATE_KEY_FILE]
[-u REMOTE_USER] [-c CONNECTION] [-T TIMEOUT]
[--ssh-common-args SSH_COMMON_ARGS]
[--sftp-extra-args SFTP_EXTRA_ARGS]
[--scp-extra-args SCP_EXTRA_ARGS]
[--ssh-extra-args SSH_EXTRA_ARGS]
[-k | --connection-password-file CONNECTION_PASSWORD_FILE] [-C]
[--syntax-check] [-D] [-e EXTRA_VARS] [--vault-id VAULT_IDS]
[--ask-vault-password | --vault-password-file VAULT_PASSWORD_FILES]
[-f FORKS] [-M MODULE_PATH] [--playbook-dir BASEDIR]
[--task-timeout TASK_TIMEOUT] [-a MODULE_ARGS] [-m MODULE_NAME]
pattern

常用参数:

  • -m:指定模块
  • -a:指定参数
  • -i:指定主机列表

例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
# 查看主机清单中的所有主机
ansible all --list-hosts

# 指定主机清单,查看主机清单中的所有主机
ansible all -i ./hosts --list-hosts

# 查看commonservers组的主机
ansible commonservers --list-hosts

# 测试连通
ansible all -m ping

# 单台主机执行命令
ansible all -i "192.168.56.102," -m ping

# 查看客户机的内存
ansible all -m command -a "free -h"

# 在客户机执行管理机脚本
cp /bin/echo ~/echo.sh
ansible all -m script -a "~/echo.sh hello" -vvv

# 在客户机执行客户机脚本
ansible all -m command -a "cp /bin/echo /home/voidking/echo.sh"
ansible all -m shell -a "/home/voidking/echo.sh hello"

# 向客户机拷贝文件
ansible all -m copy -a "src=/home/voidking/echo.sh dest=/tmp/ owner=voidking group=voidking mode=0755"

# 后台执行命令
ansible all -m ping -B 3600 -P 0
ansible all -m async_status -a "jid='182829279182.2094'"

# 批量添加sudo权限
ansible all -i hosts -s -m shell -a "echo 'haojin ALL=(ALL) NOPASSWD: ALL' >> /etc/sudoers"

# 批量移除sudo权限
ansible all -i hosts -s -m shell -a "sed -i '/haojin ALL=(ALL) NOPASSWD: ALL/d' /etc/sudoers"

# 使用root用户备份和拷贝文件
ansible all -i hosts -s -m shell -a "mv /tmp/run.sh /tmp/run.sh.bak"
ansible all -i hosts -b --become-user=root -m shell -a "mv /tmp/run.sh /tmp/run.sh.bak"
ansible all -i hosts -s -m copy -a "src=/root/run.sh dest=/tmp/run.sh owner=voidking group=root mode=0755"

# 重启服务
ansible all -i hosts -s -m shell -a "/tmp/stop.sh"
ansible all -i hosts -s -m shell -a "/tmp/run.sh" -u voidking

4.3. 配置文件

  • /etc/ansible/ansible.cfg,主配置文件,配置ansible工作特性
  • /etc/ansible/hosts,主机清单
  • /etc/ansible/roles/,存放角色的目录

1、ansible.cfg的配置参考Configuring Ansible,主要关注inventory、forks、poll_interval、remote_port、log_path等参数。

2、hosts文件有一个特性很棒,可以指定变量,例如:

1
2
3
4
5
6
7
8
9
10
[commonservers]
192.168.56.102
[commonservers:vars]
ansible_ssh_pass='123456'
ansible_ssh_port=22

[commonservers1]
192.168.56.103
[commonservers:children]
commonservers1

如果在hosts文件中指定了用户名和密码,使用时报错 to use the ‘ssh’ connection type with passwords, you must install the sshpass program
那么需要先安装sshpass,安装命令为:

1
2
3
4
5
# ubuntu
apt-get install sshpass
# centos
yum install epel-release -y
yum install sshpass -y

sshpass可以实现免交互指定密码登录机器,使用方法为:

1
sshpass -p xxx ssh ubuntu@192.168.56.102

4.4. ansible内置变量小结

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 主机名
ansible_ssh_host
# 端口号
ansible_ssh_port
# 用户名
ansible_ssh_user
# 密码
ansible_ssh_pass
# 使用sudo连接用户时的密码
ansible_sudo_pass
# 秘钥文件如果不想使用ssh-agent管理时可以使用此选项
ansible_ssh_private_key_file
# shell的类型默认sh
ansible_shell_type
# SSH 连接的类型
ansible_connection
# 指定python解释器的路径
ansible_python_interpreter

4.5. ansible-doc

格式:ansible-doc [options] [module...]

例子:

1
2
3
4
ansible-doc ping
ansible-doc -s ping
ansible-doc -l
ansible-doc -a

4.6. 主机通配符

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 匹配所有主机,相当于all
ansible '*' -m ping
# 匹配含有common的主机组
ansible '*common*' -m ping
# 匹配IP为100-109的主机
ansible '192.168.56.10?' -m ping
# 匹配IP段
ansible '192.168.56.101:192.168.56.200' -m ping
# 逻辑与
ansible 'commonservers:&dbservers' --list
# 逻辑非
ansible 'commonservers:!dbservers' --list
# 正则表达式
ansible '~192\.168\.56\.[1-254]' --list

4.7. 常用模块

  • command:在客户机运行命令
  • shell:在客户机shell进程下运行命令,支持shell特性,如管道等
  • copy:从管理机拷贝文件到客户机
  • fetch:从客户机获取文件
  • file:设置文件属性
  • yum:centos软件包管理
  • service:服务管理
  • script:执行脚本
  • user:用户管理
  • cron:crontab管理

shell比command更强大,command比shell更安全。因为command不支持重定向、管道等,避免了shell注入的风险。

5. 指定ansible.cfg

如果ansible没有指定ansible.cfg,或者想要临时使用自己定义的ansible.cfg,该怎么处理?

1、参考ansible.cfg,创建ansible.cfg文件,假设路径为 /home/voidking/ansible.cfg

2、设置环境变量

1
export ANSIBLE_CONFIG=/home/voidking/ansible.cfg

3、查看配置

1
ansible --version

6. 批量推送公钥

在本文的一开始,我们通过ssh-copy-id命令把管理机的公钥推送给了客户机。
如果客户机有几百个,肯定不能再手动搞了,这时可以使用ansible的authorized_key模块来实现推送。

1、创建hosts文件,把所有客户机都添加进去

1
2
3
4
5
6
7
[common]
192.168.56.102
192.168.56.103
192.168.56.104
[common:vars]
ansible_ssh_user="voidking"
ansible_ssh_pass="123456"

2、配置忽略host_key_checking

1
vim /etc/ansible/ansible.cfg

去掉 host_key_checking = False 的注释

3、测试连通性

1
ansible all -i hosts -m ping

4、编写剧本 ssh-copy.yaml

1
2
3
4
5
6
7
---
- hosts: common
remote_user: voidking
tasks:
- authorized_key:
user: voidking
key: "{{ lookup('file', '/home/voidking/.ssh/id_rsa.pub') }}"

5、推送公钥

1
ansible-playbook -i hosts ssh-copy.yaml

6、验证

1
ssh voidking@192.168.56.102

7. ssh-agent

ansible可能使用到ssh-agent,那就顺便学习一下,参考了解ssh代理:ssh-agent

ssh-agent是ssh代理程序,ssh-agent可以帮助我们管理私钥。

那么什么时候需要ssh代理帮助我们管理私钥呢?当遇到如下情况时,我们会需要ssh代理。

  • 使用不同的密钥连接到不同的主机时,需要手动指定对应的密钥,ssh代理可以帮助我们选择对应的密钥进行认证,不用手动指定密钥即可进行连接。
  • 当私钥设置了密码,我们又需要频繁的使用私钥进行认证时,ssh代理可以帮助我们免去重复的输入密码的操作。
  • 管理机可以通过密钥连接到客户机A和客户机B,但是客户机A无法通过密钥连接到客户机B,ssh代理可以帮助我们在客户机A也能通过密钥连接到客户机B。

我们以添加.ssh/id_rsa私钥给ssh代理为例,查看一下使用流程。

1、启用ssh-agent
ssh-agent bash

2、把.ssh/id_rsa添加到ssh代理
ssh-add ~/.ssh/id_rsa

3、测试登录
ssh voidking@192.168.56.102
登录成功。
切换到root用户,ssh-agent失效。重新使用voidking登录,ssh-agent失效。想要重新登录依然生效,那就创建个脚本登录时自动执行。

常用命令:

  • ssh-agent $SHELL,启动
  • ssh-agent -k,关闭
  • ssh-add ~/.ssh/key_name,添加指定私钥
  • ssh-add -l,查看私钥
  • ssh-add -L,查看公钥
  • ssh-add -d /path/of/key/key_name,删除指定私钥
  • ssh-add -D,删除所有私钥
  • ssh-add -x,设置密码,锁定ssh代理
  • ssh-add -X,输入密码,解锁ssh代理
  • 本文作者: 好好学习的郝
  • 原文链接: https://www.voidking.com/dev-ansible-start/
  • 版权声明: 本文采用 BY-NC-SA 许可协议,转载请注明出处!源站会即时更新知识点并修正错误,欢迎访问~
  • 微信公众号同步更新,欢迎关注~