Ansible

1、Ansible 组成

组合INVENTORY、API、MODULES、PLUGINS的绿框,为ansible命令工具,其为核心执行工具

图片[1]-Ansible-李佳程的个人主页
  • INVENTORY:Ansible管理主机的清单文件,默认为 /etc/ansible/hosts
  • MODULES:Ansible执行命令的功能模块,多数为内置核心模块,也可自定义
  • PLUGINS:模块功能的补充,如连接类型插件、循环插件、变量插件、过滤插件等,该功能不常用
  • API:供第三方程序调用的应用程序编程接口

2、Ansible 命令执行来源

  • USER 普通用户,即SYSTEM ADMINISTRATOR
  • PLAYBOOKS:任务剧本(任务集),编排定义Ansible任务集的配置文件,由Ansible顺序依次执行,通常是JSON格式的YML文件
  • CMDB(配置管理数据库) API 调用
  • PUBLIC/PRIVATE CLOUD API调用
  • USER-> Ansible Playbook -> Ansible

3、注意事项

  • 执行ansible的主机一般称为管理端, 主控端,中控,master或堡垒机
  • 主控端Python版本需要2.6或以上
  • 被控端Python版本小于2.4,需要安装python-simplejson
  • 被控端如开启SELinux需要安装libselinux-python
  • windows 不能做为主控端,只能做为被控制

4、Ansible 安装和常见模块

4.1、包安装

# 查看EPEL源中ansible版本
[root@ansible ~]# yum info ansible
Loaded plugins: fastestmirror
Repodata is over 2 weeks old. Install yum-cron? Or run: yum makecache fast
Determining fastest mirrors
Available Packages
Name        : ansible
Arch        : noarch
Version     : 2.9.27
Release     : 1.el7
Size        : 17 M
Repo        : local_epel
Summary     : SSH-based configuration management, deployment, and task execution system
URL         : http://ansible.com
License     : GPLv3+
Description : Ansible is a radically simple model-driven configuration management,
            : multi-node deployment, and remote task execution system. Ansible works
            : over SSH and does not require any software or daemons to be installed
            : on remote nodes. Extension modules can be written in any language and
            : are transferred to managed machines automatically.
[root@ansible ~]# yum install -y ansible

[root@ansible ~]# ansible --version
ansible 2.9.27
  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, Oct 14 2020, 14:45:30) [GCC 4.8.5 20150623 (Red Hat 4.8.5-44)]

4.2、pip 安装

pip 是安装Python包的管理器,类似 yum

[root@ansible ~]# yum install -y python3
[root@ansible ~]# pip3 install ansible
[root@ansible ~]# ansible --version

5、Ansible 相关文件

5.1、Ansible 配置文件列表

  • /etc/ansible/ansible.cfg 主配置文件,配置ansible工作特性,也可以在项目的目录中创建此文件,当前目录下如果也有ansible.cfg,则此文件优先生效,建议每个项目目录下,创建独有的ansible.cfg文件
  • /etc/ansible/hosts 主机清单
  • /etc/ansible/roles/ 存放角色的目录

5.2、Ansible 主配置文件

# Ansible 的配置文件可以放在多个不同地方,优先级从高到低顺序如下
ANSIBLE_CONFIG  #环境变量,目录下的文件必须存在才能生效
./ansible.cfg   #当前目录下的ansible.cfg,一般一个项目对应一个专用配置文件,推荐使
用
~/.ansible.cfg  #当前用户家目录下的.ansible.cfg
/etc/ansible/ansible.cfg    #系统默认配置文件
# Ansible 的默认配置文件 /etc/ansible/ansible.cfg ,其中大部分的配置内容无需进行修改
[defaults]
#inventory     = /etc/ansible/hosts  #主机列表配置文件
#library = /usr/share/my_modules/    #库文件存放目录
#remote_tmp = $HOME/.ansible/tmp     #临时py命令文件存放在远程主机目录
#local_tmp     = $HOME/.ansible/tmp  #本机的临时命令执行目录
#forks         = 5                   #默认并发数
#sudo_user     = root                #默认sudo 用户
#ask_sudo_pass = True                #每次执行ansible命令是否询问ssh密码
#ask_pass     = True
#remote_port   = 22
#host_key_checking = False           #检查对应服务器的host_key,建议取消此行注释,实
                                      现第一次连
接自动信任目标主机
#log_path=/var/log/ansible.log       #日志文件,建议启用
#module_name = command               #默认模块,可以修改为shell模块
[privilege_escalation]               #普通用户提权配置
#become=True
#become_method=sudo
#become_user=root
#become_ask_pass=False
# 创建项目专用配置文件
[root@ansible ~]# mkdir /data/ansible/test -p
[root@ansible ~]# cd /data/ansible/test/
[root@ansible test]# touch ansible.cfg
[root@ansible test]# ansible --version
ansible 2.9.27
  config file = /data/ansible/test/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, Oct 14 2020, 14:45:30) [GCC 4.8.5 20150623 (Red Hat 4.8.5-44)]

5.3、Inventory 主机清单文件

ansible的主要功用在于批量主机操作,为了便捷地使用其中的部分主机,可以在inventory 主机清单文件中将其分组组织

默认的inventory file为 /etc/ansible/hosts

inventory file可以有多个,且也可以通过Dynamic Inventory来动态生成

  • 生产建议在每个项目目录下创建项目独立的hosts文件
  • 通过项目目录下的ansible.cfg文件中的 inventory = ./hosts实现

主机清单文件格式

inventory文件遵循INI文件风格,中括号中的字符为组名。可以将同一个主机同时归并到多个不同的组中
此外,当如若目标主机使用了非默认的SSH端口,还可以在主机名称之后使用冒号加端口号来标明
如果主机名称遵循相似的命名模式,还可以使用列表的方式标识各主机

Inventory 参数说明

ansible_ssh_host
# 将要连接的远程主机名.与你想要设定的主机的别名不同的话,可通过此变量设置.

ansible_ssh_port
# ssh端口号.如果不是默认的端口号,通过此变量设置.这种可以使用 ip:端口192.168.1.100:2222

ansible_ssh_user
# 默认的 ssh 用户名

ansible_ssh_pass
# ssh 密码(这种方式并不安全,我们强烈建议使用 --ask-pass 或 SSH 密钥)

ansible_sudo_pass
# sudo 密码(这种方式并不安全,我们强烈建议使用 --ask-sudo-pass)

ansible_sudo_exe (new in version 1.8)
# sudo 命令路径(适用于1.8及以上版本)

ansible_connection
# 与主机的连接类型.比如:local, ssh 或者 paramiko. Ansible 1.2 以前
默认使用 paramiko.1.2 以后默认使用 'smart','smart' 方式会根据是否支持 ControlPersist,
来判断'ssh' 方式是否可行.

ansible_ssh_private_key_file
# ssh 使用的私钥文件.适用于有多个密钥,而你不想使用 SSH 代理
的情况.

ansible_shell_type
#目标系统的shell类型.默认情况下,命令的执行使用 'sh' 语法,可设置为
'csh' 或 'fish'.

ansible_python_interpreter
# 目标主机的 python 路径.适用于的情况: 系统中有多个 Python,
或者命令路径不是"/usr/bin/python",比如 \*BSD, 或者 /usr/bin/python 不是 2.X 版本的
Python.之所以不使用 "/usr/bin/env" 机制,因为这要求远程用户的路径设置正确,且要求 "python"
可执行程序名不可为 python以外的名字(实际有可能名为python26).与
ansible_python_interpreter 的工作方式相同,可设定如 ruby 或 perl 的路径....
# 范例
192.168.1.1

[webserver]
192.168.1.11
192.168.1.12

[dbserver]
192.168.1.21
192.168.1.22
# 组嵌套
192.168.1.1

[webserver]
192.168.1.11
192.168.1.12

[dbserver]
192.168.1.21
192.168.1.22

# 定义testsrvs组中包括两个其它分组,实现组嵌套
[testsrvs:children]
webserver
dbserver
# 基于用户名和密码的ssh连接主机清单
[test]
192.168.1.11  ansible_connection=local   #指定本地连接,无需ssh配置

# 每个主机分别指定用户和密码,ansible_connection=ssh 需要StrictHostKeyChecking no 或者host_key_checking = False
192.168.1.12  ansible_connection=ssh  ansible_ssh_port=2222  ansible_ssh_user=test ansible_ssh_password=123456
192.168.1.13  ansible_ssh_user=root  ansible_ssh_password=123456

# 对每个分组的所有主机统一定义用户和密码,执行ansible命令时显示别名,如web01
[websrvs]
web01 ansible_ssh_host=192.168.1.51
web02 ansible_ssh_host=192.168.1.52

[websrvs:vars]
ansible_ssh_password=123456

6、Ansible相关工具

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

利用ansible实现管理

  • Ansible Ad-Hoc 即利用ansible命令,主要用于临时命令使用场景
  • Ansible playbook 主要用于长期规划好的,大型项目的场景,需要有前期的规划过程

ansible 使用前准备

ansible 相关工具大多数是通过ssh协议,实现对远程主机的配置管理、应用部署、任务执行等功能
建议:使用此工具前,先配置ansible主控端能基于密钥认证的方式联系各个被管理节点

利用sshpass批量实现基于key验证脚本

vim /etc/ssh/ssh_config
StrictHostKeyChecking no

cat hosts.list
192.168.1.11
192.168.1.12
192.168.1.13

vim push_ssh_key.sh
#!/bin/bash

rpm -q sshpass &> /dev/null || yum -y install sshpass
[ -f /root/.ssh/id_rsa ] || ssh-keygen -f /root/.ssh/id_rsa  -P ''

export SSHPASS=root123

while read IP;do
    sshpass -e ssh-copy-id  -o StrictHostKeyChecking=no $IP
done < hosts.list
#!/bin/bash

IPLIST="
192.168.1.11
192.168.1.12
192.168.1.13"

rpm -q sshpass &> /dev/null || yum -y install sshpass
[ -f /root/.ssh/id_rsa ] || ssh-keygen -f /root/.ssh/id_rsa  -P ''

export SSHPASS=123456

for IP in $IPLIST;do
    { sshpass -e ssh-copy-id -o StrictHostKeyChecking=no $IP; } &
done
wait

7、ansible-doc

此工具用来显示模块帮助,相当于man

ansible-doc [options] [module...]
-l, --list       #列出可用模块
-s, --snippet    #显示指定模块的playbook片段
[root@ansible ~]# ansible-doc --help
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 ...]]

plugin documentation tool

positional arguments:
  plugin                Plugin

optional arguments:
  --metadata-dump       **For internal testing only** Dump json metadata for
                        all plugins.
  --playbook-dir BASEDIR
                        Since this tool does not use playbooks, use this as a
                        substitute playbook directory.This sets the relative
                        path for many features including roles/ group_vars/
                        etc.
  --version             show program's version number, config file location,
                        configured module search path, module location,
                        executable location and exit
  -F, --list_files      Show plugin names and their source files without
                        summaries (implies --list)
  -M MODULE_PATH, --module-path MODULE_PATH
                        prepend colon-separated path(s) to module library (def
                        ault=~/.ansible/plugins/modules:/usr/share/ansible/plu
                        gins/modules)
  -h, --help            show this help message and exit
  -j, --json            Change output into json format.
  -l, --list            List available plugins
  -s, --snippet         Show playbook snippet for specified plugin(s)
  -t {become,cache,callback,cliconf,connection,httpapi,inventory,lookup,netconf,shell,module,strategy,vars}, --type {become,cache,callback,cliconf,connection,httpapi,inventory,lookup,netconf,shell,module,strategy,vars}
                        Choose which plugin type (defaults to "module").
                        Available plugin types are : ('become', 'cache',
                        'callback', 'cliconf', 'connection', 'httpapi',
                        'inventory', 'lookup', 'netconf', 'shell', 'module',
                        'strategy', 'vars')
  -v, --verbose         verbose mode (-vvv for more, -vvvv to enable
                        connection debugging)

See man pages for Ansible CLI options or website for tutorials
https://docs.ansible.com
#列出所有模块
ansible-doc -l
#查看指定模块帮助用法
ansible-doc ping
#查看指定模块帮助用法
ansible-doc -s  ping
# 查看指定的插件
[root@ansible ~]#ansible-doc -t connection -l
[root@ansible ~]#ansible-doc -t lookup -l

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享