1. ansible介绍

Ansible 是一种基于 ssh 协议的自动化运维工具,适用于并发数量不是很大的场景中使用,相对于其它同类型的软件(如saltstack,puppe)更加轻量级,学习成本比较低,不需要agent。

1.1. ansible基本架构

  • 核心:ansible代码程序
  • 模块(modules): 实现具体功能的组件,比如文件拷贝、服务管理等
  • 插件(plugins):扩展功能,如常用的lookup
  • 剧本(playbook):根据需求并排好的任务
  • 连接插件(Connectior Plugins):ansible基于连接插件连接到各个主机上,虽然ansible是使用ssh连接到各个主机的,但是它还支持其他的连接方法,所以需要有连接插件
  • 主机清单(inventory):定义ansible管理的主机

f70jj8c70t.jpeg

1.2. ansible的一些概念

  • 主控端与被控端:主控端为部署了ansible的机器,被控端为ansible需要操作的远程机器
  • 清单文件:存储被控端信息的文件,一般为 ini 格式或者 yaml 格式
  • ansible执行命令的方式: ad-hoc 和 playbook

2. ansible的安装

ansible 的安装通常采用以下两种:使用操作系统的包管理软件安装;使用 pip 安装。

2.1. CentOS

  1. [root@centos7-7-2 ~]# yum install -y epel-release
  2. [root@centos7-7-2 ~]# yum install ansible python-argcomplete -y # python-argcomplete 参数补全
  3. [root@centos7-7-2 ~]# ansible --version
  4. ansible 2.9.10
  5. config file = /etc/ansible/ansible.cfg
  6. configured module search path = [u'/root/.ansible/plugins/modules', u'/usr/share/ansible/plugins/modules']
  7. ansible python module location = /usr/lib/python2.7/site-packages/ansible
  8. executable location = /usr/bin/ansible
  9. 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

01-2-1-Ansible介绍 - 图2