ansible常用选项参数:
-a 模块的参数,如果执行默认COMMAND的模块,即是命令参数,如:“date”,"pwd"等等
-k ask for SSH password 登录密码,提示输入SSH密码而不是假设基于密钥的验证
-m 执行模块的名字,所以如果是只执行单一命令可以不用 -m参数ansiblet通过ssh实现配置管理、应用部署、任务执行等功能,建议配置ansible端能基于密钥认证的方式联系各被管理节点
ansible <host_pattern> [-m module_name] [-a args]
-m module 指定模块,默认为command
-v 详细过程 -vv -vvv更详细
--list-hosts 显示主机列表,可简写—list
-k, --ask-pass 提示输入ssh连接密码,默认key验证
-K, --ask-become-pass 提示输入sudo时的口令
-C, --check 检查,并不换行
-T, --timeout=TIMEOUT执行命令的超时时间,默认10s
-u, --user=REMOTE_USER 执行远程执行的用户
-b, --become 代替旧版的sudo切换ansible系列命令
ansible ansible-doc ansible-playbook ansible-vault ansible-console ansible-galaxy ansible-pull
ansible-doc:显示模块帮助
ansible-doc [options] [module…]
-a 显示所有模块的文档
-l, --list 列出可用模块
-s, --snippet 显示指定模块的playbook代码段示例:
ansible-doc -l 列出所有模块
ansible-doc ping 查看指定模块帮助用法
ansible-doc -s ping 查看指定模块参数用法密钥认证
可查看:
ssh-keygen
ssh-copy-id 10.24.45.12
ssh-copy-id 10.24.45.14
ssh-copy-id 10.24.45.15
#yum -y install openssh-clients(解决:ssh-copy-id:command not found问题)
ansible的Host-pattern
匹配主机的列表
all: 表示所有inventory中的主机
ansible all -m ping
*: 通配符
ansible “*” -m ping
ansible 10.10.1.* -m ping
ansible “*srvs” -m ping
或关系:
ansible “web:app” -m ping
ansible “10.10.1.10:10.10.1.20” -m ping
逻辑与:
ansible “web:&app” -m ping
#在web组并且在app组中的主机
逻辑非:
ansible ‘web:!app’ -m ping
#在web组中但不在app组中的主机
#注意:此处为单引号
综合逻辑:
ansible ‘web:app:&db:!ftp’ -m ping
#这里也是单引号
正则表达式:
ansible “web:&app” -m ping
ansible “~(web|app).&\.cjk\.com” -m pingansible命令执行后过程
- 加载自己的配置文件,默认/etc/ansible/ansible.cfg
- 加载自己对应的模块文件,如command
- 通过ansible将模块或命令生成对应的临时py文件,并将该文件传输至远程服务器的对应执行用户$HOME/.ansible/tmp/ansible-tmp-数字/xxx.py文件
- 给文件+x执行
- 执行并返回结果
- 删除临时py文件,sleep 0退出
执行状态:
绿色:执行成功并且不需要做改变的操作
黄色:执行成功并且对目标主机做了变更
红色:执行失败ansible使用示例
以cjk用户执行ping存活检测
ansible all -m ping -u cjk -k
以cjk sudo至root执行ping存活检测
ansible all -m ping -u cjk -b -k
以cjk sudo至 benn用户执行ping存活检测
ansible all -m ping -u cjk -b -k –become-user benn
以cjk sudo 至root用户执行 ls
ansible all -m shell -u cjk –become-user=root -a ‘ls /root’ -b -k -Kping模块演示:
先对主机清单管理文件配置
tail /etc/ansible/hosts
#如果没有做密钥认证且在hosts配置文件里如上图IP为10.24.45.14没有填写服务器对应的用户名和密码在执行ansible命令时要加参数-k;
ansible常用模块
1、command:在远程主机执行命令,默认模块,可忽略-m选项
ansible db -m command -a ‘service vsftpd start’
ansible db -m command -a ‘echo 123456 |passwd –stdin cjk’ 不成功
#此命令不支持$VARNAME < > | ; &等,需要用shell模块实现
2、shell:和command相似,用shell执行命令
ansible db -m shell “echo 123456 |passwd -stdin cjk”
调用bash执行命令类似cat /tmp/cjk.log |awk -F’/’ ‘{print $1,$2}’ & > /tmp/cjk.txt这些复杂命令时,即使使用shell也可能会失败,解决方法:写道脚本,copy到远程执行,再把需要的结果拉回执行命令的机器
3、script:运行脚本
-a “PATH/TO/SCRIPT_FILE”
ansible db -m script -a f1.sh
4、remove如果文件不存在就不执行后面的命令;
5、creates 如果文件存在反而不执行后面的命令。
ansible test -a 'removes=/etc/fs cat /root/s1.sh'
给目标服务器创建一个空文件:
ansible test -a 'creates=/etc/fs cat /root/s1.sh'
查看目标服务器主机名:
ansible test -a 'echo $HOSTNAME'
ansible test -m shell -a 'echo $HOSTNAME'
#比较默认的command模块和shell模块执行带特殊字符的命令结果,shell模块弥补了command模块不能准确执行特殊字符的缺陷,功能比command更强大。
创建用户并设置密码:
ansible test -a 'useradd cjk'
#script:模块不需要把脚本先推送到所有主机,只需要在管理端ansible服务器上把脚本写好自动就能让所有主机执行。(如果使用command模块则需要先把脚本推送到所有服务器上才能执行)
echo -e "#! /bin/bash\nhostname" >/root/s1.sh
chmod +x s1.sh
ansible test -m script -a '/root/s1.sh'
6、copy:从服务器复制文件到客户端
ansible db -m copy -a ‘src=/root/f1.sh dest=/tmp.f2.sh owner=cjk mode=600 backup=yes’
#backup=yes表示copy前先备份
7、fetch:从客户端取文件到服务器端,copy相反,目录可先tar
ansible db -m fetch -a ‘src=/root/a.sh dest=/data/scripts’
8、file: 设置文件属性
ansible db -m file -a ‘path=/root/a.sh owner=cjk mode=755’
ansible db -m file -a ‘src=/app/testfile dest=/app/testfile-link state=lind’
#state表示执行动作
使用copy模块,并设置权限和所有者:
ansible test -m copy -a 'src=/root/s2.sh dest=/data/ mode=000 owner=cjk'
查看目标服务器/data/目录:
ansible test -a 'ls -l /data/'
#fetch测试,抓取远程文件到ansible管理端(目前版本只能复制单个文件,不能抓取目录,但是我们可以把想要抓取的多个文件打一个包,这样就可以满足我们的需求)
ansible test -m fetch -a 'src=/var/log/messages dest=/data/logs'
远程打包:
ansible test -m shell -a 'tar Jcf /root/log.tar.xz /var/log/*.log'
注意:标黄部分提示有专门的打包模块“unarchive”,事实上通过执行ansible-doc -s unarchiv命令,你会发现这个是解包模块,打包模块是“archive”
把打好的包拉回ansible服务器:
ansible test -m fetch -a 'src=/root/log.tar.xz dest=/data/'
查看打包内容:
file模块演示
建立一个新文件(name和dest是path的别名,都可用)
ansible test -m file -a 'name=/data/f1 state=touch'
删除文件用absent:
ansible test -m file -a 'name=/data/f1 state=absent'
创建目录用directory;删除目录还是absent:
ansible test -m file -a 'name=/data/d1 state=directory'
# ansible test -m file -a 'name=/data/d1 state=absent'
创建软链接用link;删除还是absent:
ansible test -m file -a 'src=/etc/fstab name=/data/fstab.link state=link'
删除软连接:
#删除一个目录下所有文件直接用rm -rf。
ansible test -m shell -a 'rm -fr /data/*'
Hostname: 管理主机名
ansible node1 -m hostname -a “name=www”
Cron: 计划任务
支持时间:minute,hour,day,month,weekday
ansible db -m cron -a “minute=*/5 job=’/usr/sbin/ntpdate 172.160.1 &>/dev/null’ name=synctime” //创建任务
ansible db -m cron -a ‘state=absent name=synctime’ //删除任务
Yum: 管理包
ansible db -m yum -a ‘name=httpd state=latest’ //安装
ansible db -m yum -a ‘name=httpd state=absent’ //删除
#hostname模块改主机名可以立即生效,而且能自动把配置文件替换(但是只能单台修改):
cron模块演示(添加一个定时任务):
ansible test -m cron -a 'minute=* weekday=1,3,5 job="/usr/bin/cjk FBI warning" name=warningcron state=absent'
禁用cron(加注释:disabled=true),再启动就把true改成false
ansible test -m cron -a 'disabled=true job="/usr/bin/cjk FBI warning" name=warningcron state=absent'
查看定时任务内容:
ansible test -a 'crontab -l'
删除还是用absent
ansible test -m cron -a 'job="/usr/bin/cjk FBI warning" name=warningcron state=absent'
#yum模块演示(前提要在做系统的时候装好yum源,ansible执行安装的时候比较慢):
ansible test -m yum -a 'name=vsftpd'
卸载还是用absent或者remove:
ansible test -m service -a 'name=vsftpd state=absent'
查看是否安装成功:
ansible test -m shell -a 'rpm -aq vsftpd'
安装多个包(中间用,(逗号)隔开,卸载同理):
ansible test -m yum -a 'name=memcache,httpd,mysql-server,php*'
安装包远程安装(不能直接装,需要先推送到目标机器再yum安装):
ansible test -m yum -a 'name=/root/logstash-6.5.4.rpm'
Service: 管理服务
ansible db -m service -a ‘name=httpd state=stopped’
ansible db -m service -a ‘name=httpd state=started
ansible db -m service -a ‘name=httpd state=reloaded’
ansible db -m service -a ‘name=httpd state=restartedUser: 管理用户
ansible db -m user -a ‘name=user1 comment=”test user” uid=2019 home=/app/user1 group=root’
ansible db -m user -a ‘name=sysuser1 system=yes home=/app/sysuser1’
ansible db -m user -a ‘name=user1 state=absent remove=yes’ //删除用户及家目录等数据Group: 管理组
ansible db -m group -a “name=testgroup system=yes”
ansible db -m group -a “name=testgroup state=absent”启动一个服务并设置开机自启:
ansible test -m service -a 'name=vsftpd state=started enabled=yes'
#ansible test -m service -a 'name=vsftpd state=stopped enabled=no'
#state和enabled可以单独执行;yes还可以用true或者no代替;
目标服务器测试启动结果如下:
user模块使用:(system指系统用户,home指家目录,comment:描述)
ansible test -m user -a 'name=nginx shell=/sbin/nologin system=yes home=/home/nginx groups=root,bin uid=80 comment="nginx service"'
查看目标服务器是否创建成功:
ansible test -a 'getent passwd nginx'
#getent 用来察看系统的数据库中的相关记录
删除用户:
ansible test -m user -a 'name=nginx state=absent remove=yes'
#注意这里删除的时候absent和remove同时使用。
group模块使用:
ansible test -m group -a 'name=nginx system=yes gid=80'
验证:
ansible test -a 'getent group nginx'
删除group:
ansible test -m group -a 'name=nginx state=absent'
ansible-galaxy
连接https://galay.ansible.com下载相应的roles
列出所有已安装的galaxy
ansible-galaxy list
安装galaxy
ansible-galaxy install geerlingguy.redis
删除galaxy
ansible-galaxy remove geerlingguy.redis安装galaxy-nginx:
ansible-galaxy install geerlingguy.nginx
注意上面报错提示使用参数: --ignore-errors
# ansible-galaxy --ignore-errors install geerlingguy.nginx
进入nginx目录下,查看tasks/main.yml内容实际上就是ansible模块组成的剧本
还可以修改角色名称:
删除galaxy角色:
ansible-galaxy remove geerlingguy.nginx/
ansible-pull
推送命令至远程,效率无限提升,对运维要求较高