1. ansible介绍
Ansible 是一种基于 ssh 协议的自动化运维工具,适用于并发数量不是很大的场景中使用,相对于其它同类型的软件(如saltstack,puppe)更加轻量级,学习成本比较低,不需要agent。
1.1. ansible基本架构
- 核心:ansible代码程序
- 模块(modules): 实现具体功能的组件,比如文件拷贝、服务管理等
- 插件(plugins):扩展功能,如常用的lookup
- 剧本(playbook):根据需求并排好的任务
- 连接插件(Connectior Plugins):ansible基于连接插件连接到各个主机上,虽然ansible是使用ssh连接到各个主机的,但是它还支持其他的连接方法,所以需要有连接插件
- 主机清单(inventory):定义ansible管理的主机
1.2. ansible的一些概念
- 主控端与被控端:主控端为部署了ansible的机器,被控端为ansible需要操作的远程机器
- 清单文件:存储被控端信息的文件,一般为 ini 格式或者 yaml 格式
- ansible执行命令的方式: ad-hoc 和 playbook
2. ansible的安装
ansible 的安装通常采用以下两种:使用操作系统的包管理软件安装;使用 pip 安装。
2.1. CentOS
[root@centos7-7-2 ~]# yum install -y epel-release
[root@centos7-7-2 ~]# yum install ansible python-argcomplete -y # python-argcomplete 参数补全
[root@centos7-7-2 ~]# ansible --version
ansible 2.9.10
config file = /etc/ansible/ansible.cfg
configured module search path = [u'/root/.ansible/plugins/modules', u'/usr/share/ansible/plugins/modules']
ansible python module location = /usr/lib/python2.7/site-packages/ansible
executable location = /usr/bin/ansible
python version = 2.7.5 (default, Apr 11 2018, 07:36:10) [GCC 4.8.5 20150623 (Red Hat 4.8.5-28)]
2.2. Ubuntu
! 使用默认的源直接安装 ansible,会装上 ansible 2.5.1
[root@duduniao ~]# sudo apt update
[root@duduniao ~]# sudo apt install software-properties-common
[root@duduniao ~]# sudo apt-add-repository --yes --update ppa:ansible/ansible
[root@duduniao ~]# sudo apt install ansible
2.3. pip
[root@duduniao ~]# pip3 install ansible -i https://pypi.tuna.tsinghua.edu.cn/simple
3. ansible命令和配置
3.1. ansible的命令
usage: ansible [-h] [--version] [-v] [-b] [--become-method BECOME_METHOD]
[--become-user BECOME_USER] [-K] [-i INVENTORY] [--list-hosts]
[-l SUBSET] [-P POLL_INTERVAL] [-B SECONDS] [-o] [-t TREE] [-k]
[--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] [-C] [--syntax-check] [-D]
[-e EXTRA_VARS] [--vault-id VAULT_IDS]
[--ask-vault-pass | --vault-password-file VAULT_PASSWORD_FILES]
[-f FORKS] [-M MODULE_PATH] [--playbook-dir BASEDIR]
[-a MODULE_ARGS] [-m MODULE_NAME]
pattern
# 常用参数和选项
--version 版本
-v 执行结果详细输出, -vvv 显示更多,-vvvv 开启debug模式
--become-user 使用指定用户运行命令,默认为root
-i 指定inventory清单文件
-m 指定使用的模块
-a 指定该模块的参数
-f 指定并发数
-T 指定连接超时时间
-k 询问ssh连接密码
--private-key 指定ssh私钥路径
-e 命令传递环境变量
usage: ansible-playbook [-h] [--version] [-v] [-k]
[--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] [--force-handlers]
[--flush-cache] [-b] [--become-method BECOME_METHOD]
[--become-user BECOME_USER] [-K] [-t TAGS]
[--skip-tags SKIP_TAGS] [-C] [--syntax-check] [-D]
[-i INVENTORY] [--list-hosts] [-l SUBSET]
[-e EXTRA_VARS] [--vault-id VAULT_IDS]
[--ask-vault-pass | --vault-password-file VAULT_PASSWORD_FILES]
[-f FORKS] [-M MODULE_PATH] [--list-tasks]
[--list-tags] [--step] [--start-at-task START_AT_TASK]
playbook [playbook ...]
# 常用参数和选项
--version 版本
-v 执行结果详细输出, -vvv 显示更多,-vvvv 开启debug模式
--become-user 使用指定用户运行命令,默认为root
-i 指定inventory清单文件数
-f 指定并发数
-T 指定连接超时时间
-k 询问ssh连接密码
--private-key 指定ssh私钥路径
-e 命令传递环境变量
--syntax-check语法检查
--tag 执行指定标签的playbook
--skip-tag 跳过指定标签的playbook
usage: ansible-doc [-h] [--version] [-v] [-M MODULE_PATH]
[--playbook-dir BASEDIR]
[-t {become,cache,callback,cliconf,connection,httpapi,inventory,lookup,netconf,shell,module,strategy,vars}]
[-j] [-F | -l | -s | --metadata-dump]
[plugin [plugin ...]]
# 常用参数
-l 列出所有用的插件/模块
-s 显示简易文档
3.2. 配置文件
配置文件优先级:$ANSIBLE_CONFIG > ./ansible.cfg > ~/.ansible.cfg > /etc/ansible/ansible.cfg
以下为常用配置
#inventory = /etc/ansible/hosts #主机列表配置文件
#library = /usr/share/my_modules/ #库文件存放目录
#remote_tmp = ~/.ansible/tmp #临时py文件存放在远程主机目录
#local_tmp = ~/.ansible/tmp #本机的临时执行目录
#forks = 5 #默认并发数
#sudo_user = root #默认sudo用户
#ask_sudo_pass = True #每次执行是否询问sudo的ssh密码
#ask_pass = True #每次执行是否询问ssh密码
#remote_port = 22 #远程主机端口
host_key_checking = False #跳过检查主机指纹
log_path = /var/log/ansible.log #ansible日志
#普通用户提权操作
[privilege_escalation]
#become=True
#become_method=sudo
#become_user=root
#become_ask_pass=False
3.3. 清单文件
# 比较完整的写法,实际情况可以适当减少参数,如端口、用户名、密码等
[webs]
10.0.0.7 ansible_ssh_port=22 ansible_ssh_user=root ansible_ssh_pass='123456'
10.0.0.8 ansible_ssh_port=22 ansible_ssh_user=root ansible_ssh_pass='123456'
[dbs]
ubuntu-7-60 ansible_host=10.4.7.60 ansible_ssh_user=root ansible_ssh_private_key_file="xxx/id_rsa"
ubuntu-7-61 ansible_host=10.4.7.61 ansible_ssh_user=root ansible_ssh_private_key_file="xxx/id_rsa"
# 主机组,centos组包含了 webs和dbs
[centos:children]
webs
dbs