1,Ansible 系列命令
ansible
ansible-doc
ansible-playbook
ansible-valut
ansible-console
ansible-galaxy
ansible-pull
1.1 ansible-doc 显示模块帮助
Usage: ansible-doc [-l|-F|-s] [options] [-t <plugin type> ] [plugin]
plugin documentation tool
Options:
-a, --all 显示所有模块文档
-l, --list 列出可用模块
-s, --snippet 显示指定模块的playbook片段
ansible-doc -l 列出所有模块
ansible-doc ping 查看指定模块帮助用法
ansible-doc -s ping 查看指定模块帮助用法
1.2 ansible
- ansible 通过 ssh 实现配置管理、应用部署、任务执行等功能,建议配置 ansible 端能基于秘钥认证的方式联系各被管理节点
- ansible [-m module_name] [-a args]
--version 显示版本
-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 切换
1.2.1 ansible 的 主机模式
Host-pattern
匹配主机主机的列表
ALL
:表示素有 Inventory
中的所有主机
*
:通配符
ansible "*" -m ping
ansible 192.168.1.* -m ping
ansible "*srvs" -m ping
- 或关系
ansible "websrvs:appsrvs" -m ping
ansible "192.168.2.100:192.168.2.111" -m ping
- 逻辑与
ansible 'websrvs:&dbsrvs' -m ping
- 在
websrvs
组并且在 dbsrvs
组中的主机
- 注意:此处为单引号
- 逻辑非
ansible 'websrvs:!dbsrvs' -m ping
- 在
websrvs
组,但不在 dbsrvs
组中的主机
- 注意:此处为单引号
- 综合逻辑
ansible 'websrvs:dbsrvs:&appsrvs:!ftpsrvs' -m ping
- 注意:此处为单引号
- 正则表达式
ansible 'websrvs:&dbsrvs' -m ping
ansible '~(web|db).*.example.com' -m ping
- 注意:此处为单引号
1.2.2 ansible 命令执行过程
- 1,加载自己的配置文件 默认 /etc/ansible/ansible.cfg
- 2,加载自己对应的模块文件,如 command
- 3,通过 ansible 将模块或命令生成对应的临时 py 文件,并将该 文件传输至远程服务器
- 4,给文件 +x 执行权限
- 5,执行并返回结果
- 6,删除临时 py 文件,sleep 0 退出
- 执行状态
- 绿色:执行成功并且不需要做改变的操作
- 黄色:执行成功并且对目标主机做变更
- 红色:执行失败
- 示例
- 以 wang 用户执行 ping 存活检测
ansible all -m ping -u wang -k
- 以 wang sudo 至 root 执行 ping 存活检测
ansible all -m ping -u wang -b -k
- 以 wang sudo 至 test 用户执行 ping 存活检测
ansible all -m ping -u wang -b -k --become-user test
- 以 wang sudo 至 root 用户执行 ls
ansible all -m command -u wang --become-user=root -a 'ls /root' -b -k -K
2,ansible 常用模块
- Command:在远程主机执行命令,默认模块,可忽略 -m 选项
ansible srvs -m command -a 'service vsftpd start'
ansible srvs -m command -a 'echo test | passwd --stdin wang'
不成功
- 此命令不支持
$VARNAME < > | ; &
等,用 shell
模块实现
- Shell:和 command 相似,用 shell 执行命令
ansible srv -m shell -a 'echo test | passwd --stdin wang'
- 调用
bash
执行命令类似 cat /tmp/stanley.md | awk -F '|' '{print $1 $2}' & > /tmp/example.txt
这些复杂命令,即使使用 shell 也可能会失败,解决办法:写到脚本时,copy 到远程,执行,再把需要的结果拉回执行命令的机器
- Script:运行脚本
-a '/PATH/TO/SCRIPT_FILE'
ansible websrvs -m script -a f1.sh
- Copy:从服务器复制文件到客户端
ansible srv -m copy -a 'src=/root/f1.sh dest=/tmp/f2.sh owner=wang mode=600 backup=yes'
如目标存在,默认覆盖,此处指定先备份
ansible srv -m copy -a "content='test content
' dest=/tmp/f1.txt"
利用内容直接生成目标文件
- Fetch:从客户端取文件至服务器端,copy 相反,目录可先 tar
ansible srv -m fetch -a 'src=/root/a.sh dest=/data/scripts'
- File:设置文件属性
ansible srv -m file -a 'path=/root/a.sh owner=wang mode=755'
ansible web -m -file -a 'src=/app/testfile dest=/app/testfile-link state=link'
- Hostname:管理主机名
- Cron:计划任务
- 支持时间:
minute,hour,day,month,weekday
ansible srv -m cron -a "minute=*/5 job='/usr/sbin/ntpdate 172.16.0.1 & > /dev/null' name=Synctime"
创建任务
ansible srv -m cron -a "disabled=true job='/usr/sbin/ntpdate 172.16.0.1 & > /dev/null' name=Synctime"
禁用任务
ansible srv -m cron -a 'state=absent name=Synctime'
删除任务
- Yum:管理包
ansible srv -m yum -a 'name=httpd state=latest'
安装
ansible srv -m yum -a 'name=htttpd state=absent'
删除
- Service:管理服务
ansible srv -m service -a 'name=httpd state=started enabled=true'
启动并且开机自启
ansible srv -m service -a 'name=httpd state=stopped'
停止
ansible srv -m service -a 'name=httpd state=reloaded'
平滑重启
ansible srv -m service -a 'name=httpd state=restarted'
重启
- User:管理用户
ansible srv -m user -a 'name=nginx shell=/sbin/nologin system=yes home=/var/nginx groups=root,bin uid=2048 comment="nginx service"'
ansible srv -m user -a 'anme=sysuser1 system=yes home=/app/sysuser1'
ansible srv -m user -a 'name=user1 state=absent remove=yes'
删除用户及家目录等数据
- Group:管理组
ansible srv -m group -a "name=testgroup system=yes"
创建组
ansible srv -m group -a "name=testgroup state=absent"
删除组
3,ansible-galaxy
- 连接 ````https://galaxy.ansible.com```` 下载相应的 roles
- 列出所有已安装的 galaxy
- ````ansible-galaxy list````
- 安装 galaxy
- ````ansible-galaxy install geerlingguy.nginx````
- 删除 galalxy
- ````ansible-galaxy remove geerlingguy.nginx````
4,ansible-pull
5,ansible-playbook
# hello world yml file
---
- hosts: websrvs # 对应ansible hosts 分组名 或 主机名
remote_user: root # 指定在被管理的主机上执行任务的用户
tasks: # 任务列表
- name: hello # 任务名称
command: hostname # 调用command模块 执行命令
ansible-playbook hello.yml
6,ansible-vault
# ansible-vault [create|decrypt|edit|encrypt|encrypt_string|rekey|view] [options] [vaultfile.yml]
# 加密
ansible-vault encrypt hello.yml
# 解密
ansible-vault decrypt hello.yml
# 查看
ansible-vault view hello.yml
# 编辑加密文件
ansible-vault edit hello.yml
# 修改口令
ansible-vault rekey hello.yml
# 创建新文件
ansible-vault create new.yml
7,ansible-console:2.0+ 新增,可交互执行命令,支持 tab
root@all (3)[f:5]$
执行用户@当前操作的主机组(当前组的主机数量)[f:并发数]$
- 设置并发数:```forks n
;例如:
forks 10````
- 切换组:
cd
主机组 例如:cd web
- 列出当前组主机列表:
list
- 列出所有的内置命令:
?
或 help
- 示例:
root@all (3)[f:5]$ list
root@all (3)[f:5]$ cd websrvs
root@websrvs (3)[f:5]$ list
root@websrvs (3)[f:5]$ yum name=httpd state=present
root@websrvs (3)[f:5]$ service name=httpd sstat=started