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'