Ansible是由Ansible Inc.和Red Hat共同开发的一款开源集群配置软件,编写语言为python,使用时的配置文件语言为yaml。核心组件使用了paramiko和PyYaml。其中paramiko是python的ssh支持库,而PyYaml则用于支持yaml配置文件的使用和playbook的应用。

Ansible有着非常突出的优点,从而使其在saltstack等集群配置工具中脱颖而出。优势如下:

  • 仅需管理主机安装并配置即可,所有的配置工作都通过ssh连接下发至被管理主机。
  • 轻量化
  • Python编写,源代码可读性强。同时playbook使用yml配置,容易上手
  • 对于集群和ECS的支持非常完美。
  • 支持大量API接入,并且对于python的扩展支持良好。
  • 由于架构出色,理论上在管理主机性能到位的情况下可以同时配置近乎无限的主机。

安装

yum install -y epel-release
yum install -y ansible

配置ssh免密

ssh-keygen -t rsa
ssh-copy-id [email protected]
被管理机器IP

ansible hosts

ansible host通过记录IP和标签映射分组进行管理

示例

172.26.0.81 ##不分组直接声明IP
172.26.0.82:54208 ##申明特殊的ssh端口
[fangwei-test] ##申明了受管机的列表和分类名
172.26.0.83 ##直接声明IP
Printer ansible_ssh_host=172.26.0.84 ##定义别名和IP
EMR-master ansible_ssh_host=172.26.0.85
Snipe-it ansible_ssh_host=172.26.0.86
Kubernetes ansible_ssh_host=172.26.0.87
[fangwei-test:vars] ##配置对应的用户等ansible变量
ansible_user=root

变量说明

ansible_ssh_host ##连接目标主机的地址
ansible_ssh_port ##连接目标主机的端口,默认 22 时无需指定
ansible_ssh_user ##连接目标主机默认用户
ansible_ssh_pass ##连接目标主机默认用户密码
ansible_ssh_connection ##目标主机连接类型,可以是 local 、ssh 或 paramiko
ansible_ssh_private_key_file ##连接目标主机的 ssh 私钥,用于安全要求高的机器。可以使用其他管理主机的公钥来登录特定的主机。
ansible_*_interpreter ##指定采用非 Python 的其他脚本语言

TIP:后面使用ansible-playbook管理也需要再对应工作空间中创建hosts文件记录

ansible命令参数介绍

普通参数:
-a MODULE_ARGS, --args=MODULE_ARGS
#[重要]模块参数
--ask-vault-pass # 要求输入管理密码
-B SECONDS, --background=SECONDS
#异步运行,X秒后失败(默认关闭)
-C, --check #不对受管机执行任何改变,但是假设已执行语句并返回结果(用于测试)
-D, --diff #当改变小体积文件的时候,显示两者的区别,常常和-C参数一起用(用于测试)
-e EXTRA_VARS, --extra-vars=EXTRA_VARS
#将其他变量设置为key = value或YAML / JSON,如果filename前缀为@
-f FORKS, --forks=FORKS
#指定要使用的并行进程数(默认值= 5)
-h, --help #显示此帮助消息并退出
-i INVENTORY, --inventory=INVENTORY, --inventory-file=INVENTORY
#指定库存主机路径或逗号分隔的主机列表。PS: --inventory-file已弃用
-l SUBSET, --limit=SUBSET
#进一步将所选主机限制为其他模式
--list-hosts #输出匹配主机列表;不会执行任何其他操作
-m MODULE_NAME, --module-name=MODULE_NAME
##[重要]要执行的模块名称(默认为command)
-M MODULE_PATH, --module-path=MODULE_PATH
##将冒号分隔的路径预先添加到模块库(默认为[u'/root/.ansible/plugins/modules',u'/usr/share/ansible/plugins/modules'])
-o, --one-line ##压缩输出。
--playbook-dir=BASEDIR
##由于此工具不使用playbooks,因此将其用作替代playbook目录。这将设置许多功能的相对路径,包括roles/group_vars/etc. 也就是变相实现部分playbook功能。
-P POLL_INTERVAL, --poll=POLL_INTERVAL
##如果使用-B(默认值= 15),则设置轮询间隔。
--syntax-check ##对playbook执行语法检查,但不执行它.
-t TREE, --tree=TREE ##将输出记录到此目录
--vault-id=VAULT_IDS ##显示要使用的保管库标识
--vault-password-file=VAULT_PASSWORD_FILES
##保管库密码文件
-v, --verbose ##详细模式(-vvv表示更多,-vvvv表示启用连接调试)
--version ##显示ansible版本并退出

连接相关参数:

-k, --ask-pass ##要求输入受管机密码
--private-key=PRIVATE_KEY_FILE, --key-file=PRIVATE_KEY_FILE
##使用特点文件来认证链接
-u REMOTE_USER, --user=REMOTE_USER
##以特定user来进行连接。
-c CONNECTION, --connection=CONNECTION
##要使用的连接类型(默认=智能)
-T TIMEOUT, --timeout=TIMEOUT
##以秒为单位覆盖连接超时(默认值= 10)
--ssh-common-args=SSH_COMMON_ARGS
##指定传递给sftp / scp / ssh的公共参数(例如ProxyCommand)
--sftp-extra-args=SFTP_EXTRA_ARGS
##指定仅传递给sftp的额外参数(例如-f,-l)
--scp-extra-args=SCP_EXTRA_ARGS
##指定仅传递给scp的额外参数(例如-l)
--ssh-extra-args=SSH_EXTRA_ARGS
##指定仅传递给ssh的额外参数(例如-R)

特权控制参数:

-s, --sudo ##用sudo(nopasswd)运行操作(不推荐,推荐使用--become-method)
-U SUDO_USER, --sudo-user=SUDO_USER
##所需的sudo用户(默认= root)(不建议使用,推荐使用--become-method)
-S, --su ##用su运行操作 (不建议使用,推荐使用--become-method)
-R SU_USER, --su-user=SU_USER
##以su作为此用户运行操作(默认=无)(不建议使用,推荐使用--become-method)
-b, --become ##用run运行操作(不显示密码提示)
--become-method=BECOME_METHOD
##要使用的权限升级方法(默认= sudo),可选项有: [ sudo | su | pbrun | pfexec | doas | dzdo | ksu | runas | pmrun | enable | machinectl ]
--become-user=BECOME_USER
##以此用户身份运行操作(默认= root)
--ask-sudo-pass ##请求sudo密码(不推荐使用,推荐使用--become-method)
--ask-su-pass ##请求su密码 (不推荐使用,推荐使用--become-method)
-K, --ask-become-pass
##要求提供权限提升密码

模块查询

ansible-doc -l #查看所有模块列表
ansible-doc 模块名 #查看模块详情

ping模块

查看主机是否连通

ansible test -m ping

Command模块

用于在受管机上进行命令的执行,其本身也可以配合很多二级参数和指令进行功能的扩展。不支持管道功能。没指定-m参数时默认是此模块。

ansible test -m command -a 'hostname'

二级参数

creates:判断,当该文件存在时,则该命令不执行
free_form:需要执行的Linux指令
chdir:在执行命令之前,先切换到该指定的目录
removes:判断,当该文件不存在时,则该选项不执行
executable:切换shell来执行命令,该执行路径必须是一个绝对路径

命令格式:ansible $目标host -a '$二级参数=$目标文件或路径 $待执行指令'

ansible test -m command -a 'chdir=/root ls -l'

ansible test -m command -a 'creates=test mkdir test' #已存在test文件夹

Shell模块

囊括了所有的command的功能和二级参数支持,并且支持管道

ansible test -m shell -a 'ps -ef | grep crond | grep -v grep'

File模块

对于文件的一些简单操作,主要是创建或者权限设定,已经文件的存在判断等

参数

force:在两种情况下强制创建软链接。1、源文件不存在但之后会建立的情况;2、目标软件已存在,需要先取消之前的软链接,然后创建新的软链接。选项:yes|no
group:定义文件/目录的属组
mode:定义文件/目录的权限
path:必选项,定义文件/目录的路径
recurse:递归的设置文件的属性,只对目录有效
src:要被链接到的路径,只应用于state=link的情况
dest:被链接到的路径,只应用于state=link的情况
state:
directory:如果目录不存在,创建目录
file:即使文件不存在,也不会被创建
link:创建软链接;hard:创建硬链接
touch:如果文件不存在,则会创建一个新的文件,如果已存在,则更新其最后修改时间
absent:删除目录/文件或者取消链接文件

ansible test -m file -a 'path=/root/server01 state=touch'

Copy模块

复制文件到远程主机

参数

backup:在覆盖之前将源文件备份,备份文件包含时间信息,选项:yes|no
content:用于替代”src”,可以直接设定文件的值
directory_node:递归的设定目录权限,默认为系统默认权限
force:如果目标主机包含该文件,但内容不同,如果设置为yes,则强制覆盖;如果设置为no,则只有当目标主机的目标位置不存在该文件时,才复制。默认为yes
others:所有file模块里的选项都可以在这里使用
src:要复制到远程主机的文件在本地的地址,可以是绝对路径,也可以是相对路径。如果路径是一个目录,它将递归复制。在这种情况下,如果路径使用“/”来结尾,则只复制目录里的内容,如果没有使用“/”来结尾,则包含目录在内的整个内容全部复制,类似于rsync
dest:目标路径

ansible test -m copy -a 'src=/root/wakamizu dest=/root/wakamizu'

Service模块

用于受管机服务的配置与管理,类似于systemd

参数

arguments:为命令提供一些附加参数
enabled:是否开机启动,选项 yes|no
name:必选项,服务名称
pattern:定义一个模式,如果通过status指令来查看服务状态时,没有响应,它会通过ps命令在进程中根据该模式进行查找,如果匹配到,则认为该服务依然运行
runlevel:运行级别
sleep:如果执行了restarted,则在stop和start之间等待几秒钟
state:对当前服务执行启动/停止/重启/重新加载等操作(started/stopped/restarted/reloaded)

ansible test -m service -a 'name=chronyd state=stopped'

Cron模块

Linux的Crontab功能,用来控制服务或者进程的定时执行功能

参数

backup:对远程主机上的原计划任务内容修改之前做备份
cron_file:如果指定该选项,则用该文件替换远程主机上cron.d目录下的用户的任务计划
day:日(1-31,,/2,…)
hour:小时(0-23,,/2,…)
minute:分钟(0-59,,/2,…)
month:月(0-12,,…) weekday:周(0-7,,…)
job:要执行的任务,依赖于state=present
name:该任务的描述
special_time:指定什么时候执行,参数:reboot,yearly,annually,monthly,weekly,daily,hourly
state:确认该任务计划是创建还是删除
user:以哪个用户身份执行

ansible test -m cron -a 'name="check home directory" minute=*/10 job="ls -lht /home"'

FileSystem模块

配置受管机的文件系统

参数

dev:目标块设备
force:在一个已有文件系统的设备上强制创建
fstype:文件系统的类型
opts:传递给mkfs命令的选项

ansible test_hosts -m filesystem -a 'dev=/dev/sdb fstype=ext4'

Mount模块

用于配置受管机的磁盘挂载

参数

dump:存储。注意,如果设置为null并且状态设置为present,它将停止工作,并且将在后续运行中进行重复条目。对Solaris系统没有影响。
fstype:必选项,文件系统类型,要求状态是present或mounted
name:必选项,挂载点
opts:传递给mount命令的参数
src:必选项,要挂载的设备路径。要求状态是present或mounted
state:必选项。选项如下:
present:只处理fstab中的配置
absent:删除挂载点
mounted:自动创建挂载点并挂载
unmounted:卸载

ansible test_hosts -m mount -a 'name=/mnt src=/dev/sdb1 fstype=ext4 state=mounted opts=rw'

Yum模块

参数

conf_file:yum的配置文件
disable_gpg_check:关闭gpg_check
disablerepo:不启用某个源
enablerepo:启用某个源
list:查看yum列表
name:要进行操作的软件包名字,也可以传递一个url或者一个本地的rpm包的路径
state:状态(present/installed/absent/removed/latest)

ansible test -m yum -a 'name=chrony state=present'

User模块

用户参数设置的模块

参数

home:指定用户家目录
group:设置用户主组
groups:设置用户的附属组
uid:设置用户的UID
password:设置用户的密码,密码必须为加密后的值
name:创建用户的用户名
createhhome:选项yes|no,值为yes时才创建用户家目录
system:选项yes|no,默认为no,值为yes时创建的用户为系统用户
remove:当state=absent时,remove=yes则表示连同家目录一起删除,等价于userdel -r
state:选项present|absent,创建用户或删除用户
shell:设置用户的shell环境

ansible test_hosts -m user -a 'name=user1 uid=1001 group=yfshare createhome=yes home=/home/user1 password="[email protected]" shell=/bin/bash state=present'

Group模块

配置Group信息的模块

参数

gid:设置组的GID
name:组名
state:选项为present|absent,创建组或删除组
system:选项为yes|no,值为yes,则创建系统组 用法与User模块大致

get_url模块

主要用于从http、ftp、https服务器上下载文件(类似于wget)

参数

checksum:文件下载完成后进行校验
timeout:请求超时时间,默认为10s
url:文件下载地址
url_username:用户名,基于HTTP的基本认证
url_password:密码
-use_proxy:选项yes|no,默认为yes,即使用代理
dest:下载文件存储的绝对路径

ansible test -m get_url -a 'dest=/root url=https://www.baidu.com'

Setup模块

playbooks自动收集远程主机上可用变量,这些变量用于playbooks配置

ansible test -m setup

Script模块

在受管机上执行sh脚本

ansible test_hosts -m script -a '/tmp/script.sh'