原理

Ansible - 图1

安装

http://www.ansible.com.cn/

  • pip
  • 各平台自带软件管理器
  1. # 主配置文件
  2. /etc/ansible/ansible.cfg
  3. # 默认定义主机清单文件
  4. /etc/ansible/hosts
  5. # 用来编排Playbook
  6. /etc/ansible/roles
  7. # 执行命令的程序
  8. /usr/bin/ansible
  9. /usr/bin/ansible-console
  10. # Ansible模块使用帮助命令,其中使用-l可以查看ansible自带的所有模块
  11. /usr/bin/ansible-doc
  12. /usr/bin/ansible-galaxy
  13. # 用来执行playbook的程序
  14. /usr/bin/ansible-playbook
  15. /usr/bin/ansible-pull
  16. /usr/bin/ansible-vault

HOST

  • /etc/ansible/hosts
  • -i 指定host文件

    常用模块

    command

    command 作为 Ansible 的默认模块,可以运行远程权限范围所有的 shell 命令,不支持一些特殊符号。 ```bash ansible test -m command -a “hostname” or ansible test -a “hostname”

s3 | CHANGED | rc=0 >> e2fda1348478

s1 | CHANGED | rc=0 >> 3c14951f6bf8

s2 | CHANGED | rc=0 >> 687ec76366c7

  1. <a name="shell"></a>
  2. ### shell
  3. shell模块相当于command的升级版,他不仅可以拥有command的功能之外,还支持一些特殊符号。
  4. <a name="raw"></a>
  5. ### raw
  6. 类似于command模块、区别在于raw模块支持管道传递。

ansible test -m raw -a “tail -n2 /etc/passwd | head -n1” s2 | CHANGED | rc=0 >> _apt:x:104:65534::/nonexistent:/bin/false Shared connection to 127.0.0.1 closed.

s3 | CHANGED | rc=0 >> _apt:x:104:65534::/nonexistent:/bin/false Shared connection to 127.0.0.1 closed.

s1 | CHANGED | rc=0 >> _apt:x:104:65534::/nonexistent:/bin/false Shared connection to 127.0.0.1 closed.

  1. <a name="copy"></a>
  2. ### copy
  3. copy模块实现主控端向目标主机拷贝文件,类似于scp命令。
  4. ```bash
  5. ansible test -m copy -a "src=/Users/gikoo/Desktop/src.data dest=/root/dest.data mode=0755"
  6. s1 | CHANGED => {
  7. "changed": true,
  8. "checksum": "f4f84859edae8b2b19018de30a33bec3731249dc",
  9. "dest": "/root/dest.data",
  10. "gid": 0,
  11. "group": "root",
  12. "md5sum": "7eea60fc1c7d69bfde3285a73121e329",
  13. "mode": "0755",
  14. "owner": "root",
  15. "size": 9,
  16. "src": "/root/.ansible/tmp/ansible-tmp-1549942129.643651-16058954823383/source",
  17. "state": "file",
  18. "uid": 0
  19. }
  20. s3 | CHANGED => {
  21. "changed": true,
  22. "checksum": "f4f84859edae8b2b19018de30a33bec3731249dc",
  23. "dest": "/root/dest.data",
  24. "gid": 0,
  25. "group": "root",
  26. "md5sum": "7eea60fc1c7d69bfde3285a73121e329",
  27. "mode": "0755",
  28. "owner": "root",
  29. "size": 9,
  30. "src": "/root/.ansible/tmp/ansible-tmp-1549942129.6673431-253151023199026/source",
  31. "state": "file",
  32. "uid": 0
  33. }
  34. s2 | CHANGED => {
  35. "changed": true,
  36. "checksum": "f4f84859edae8b2b19018de30a33bec3731249dc",
  37. "dest": "/root/dest.data",
  38. "gid": 0,
  39. "group": "root",
  40. "md5sum": "7eea60fc1c7d69bfde3285a73121e329",
  41. "mode": "0755",
  42. "owner": "root",
  43. "size": 9,
  44. "src": "/root/.ansible/tmp/ansible-tmp-1549942129.652019-115622899628901/source",
  45. "state": "file",
  46. "uid": 0
  47. }
  48. #检查数据
  49. ansible test -a "ls -l /root/dest.data"
  50. s1 | CHANGED | rc=0 >>
  51. -rwxr-xr-x 1 root root 9 Feb 12 11:30 /root/dest.data
  52. s3 | CHANGED | rc=0 >>
  53. -rwxr-xr-x 1 root root 9 Feb 12 11:30 /root/dest.data
  54. s2 | CHANGED | rc=0 >>
  55. -rwxr-xr-x 1 root root 9 Feb 12 11:30 /root/dest.data

file

file模块实现创建/删除文件或目录信息,对数据权限进行修改
dest(required) : 将数据复制到远程节点的路径信息
可以使用path替代
group : 文件数据复制到远程主机,设置文件属组用户信息
mode : 文件数据复制到远程主机,设置数据的权限 eg 0644 0755
owner : 文件数据复制到远程主机,设置文件属主用户信息
src : 指定将本地管理主机的什么数据信息进行远程复制
state : absent 将数据进行删除
directory 创建一个空目录信息
file 查看指定目录信息是否存在
touch 创建一个空文件信息
hard/link 创建链接文件

  1. ansible test -m file -a "dest=/root/test.file state=touch mode=0777"
  2. s2 | CHANGED => {
  3. "changed": true,
  4. "dest": "/root/test.file",
  5. "gid": 0,
  6. "group": "root",
  7. "mode": "0777",
  8. "owner": "root",
  9. "size": 0,
  10. "state": "file",
  11. "uid": 0
  12. }
  13. s3 | CHANGED => {
  14. "changed": true,
  15. "dest": "/root/test.file",
  16. "gid": 0,
  17. "group": "root",
  18. "mode": "0777",
  19. "owner": "root",
  20. "size": 2,
  21. "state": "file",
  22. "uid": 0
  23. }
  24. s1 | CHANGED => {
  25. "changed": true,
  26. "dest": "/root/test.file",
  27. "gid": 0,
  28. "group": "root",
  29. "mode": "0777",
  30. "owner": "root",
  31. "size": 0,
  32. "state": "file",
  33. "uid": 0
  34. }

yum/apt

实现批量安装软件。
name 指定软件名称信息

state
absent/removed 将软件进行卸载(慎用)
present/installed 将软件进行安装

latest 安装最新的软件 yum update

  1. ansible test -m apt -a 'name=vim state=present'
  2. s2 | SUCCESS => {
  3. "cache_update_time": 1549945185,
  4. "cache_updated": false,
  5. "changed": false
  6. }
  7. s3 | SUCCESS => {
  8. "cache_update_time": 1549945640,
  9. "cache_updated": false,
  10. "changed": false
  11. }
  12. s1 | SUCCESS => {
  13. "cache_update_time": 1549955489,
  14. "cache_updated": false,
  15. "changed": false
  16. }

service

service模块用于管理服务运行状态
enabled(no yes) 设置服务是否开机自启动 如果参数不指定,原有服务开机自启动状态进行保留
name(required) 设置要启动/停止服务名称
state
reloaded 平滑重启
restarted 重启
started 启动
stopped 停止

  1. #重启SSH服务
  2. ansible test -m service -a "name=ssh state=restarted"
  3. s1 | CHANGED => {
  4. "changed": true,
  5. "name": "ssh",
  6. "state": "started"
  7. }
  8. s3 | CHANGED => {
  9. "changed": true,
  10. "name": "ssh",
  11. "state": "started"
  12. }
  13. s2 | CHANGED => {
  14. "changed": true,
  15. "name": "ssh",
  16. "state": "started"
  17. }

mount

mount模块用于批量管理主机进行挂载
fstype 指定挂载的文件系统类型
opts 指定挂载的参数信息
path 定义一个挂载点信息
src 定义设备文件信息
state
absent 会进行卸载,也会修改fatab文件信息
unmounted 会进行卸载,不会修改fstab文件
present 不会挂载,只会修改fstab文件
mounted 会进行挂载,会修改fstab文件

cron

cron模块用于创建/删除/修改定时任务
minute/hour/day/month/weekday 和设置时间信息相关参数
job 和设置定时任务先关参数
name 设置定时任务注释信息
state absent 删除指定定时任务
disabled yes 将指定定时任务进行注释
no 取消注释
#定时任务如何设置:
#crontab -e
* 定时任务
分 时 日 月 周
minute hour day month weekday job=‘/usr/sbin/ntpdate ntp1.aliyun.com &>/dev/null’

user

user模块用于创建/修改/删除用户
name 指定用户名信息
uid 指定用户uid信息
group 指定用户主要属于哪个组
groups 指定用户属于哪个附加组信息
shell 指定是否能够登录
create_home 是否创建家目录信息
home 指定家目录创建在什么路径 默认/home
password *设置密码时不能使用明文方式,只能使用密文方式
可以给用户设置密码 还可以给用户修改密码

group

group模块用于创建/修改/删除用户组
gid 指定创建的组ID信息
name 指定创建组名称信息
state
absent 删除指定的用户组
present 创建指定的用户组

script

script用于在节点上执行脚本

  1. ansible test -m script -a /Users/gikoo/Desktop/hello.sh
  2. s2 | CHANGED => {
  3. "changed": true,
  4. "rc": 0,
  5. "stderr": "Shared connection to 127.0.0.1 closed.\r\n",
  6. "stderr_lines": [
  7. "Shared connection to 127.0.0.1 closed."
  8. ],
  9. "stdout": "hello\r\n",
  10. "stdout_lines": [
  11. "hello"
  12. ]
  13. }
  14. s1 | CHANGED => {
  15. "changed": true,
  16. "rc": 0,
  17. "stderr": "Shared connection to 127.0.0.1 closed.\r\n",
  18. "stderr_lines": [
  19. "Shared connection to 127.0.0.1 closed."
  20. ],
  21. "stdout": "hello\r\n",
  22. "stdout_lines": [
  23. "hello"
  24. ]
  25. }
  26. s3 | CHANGED => {
  27. "changed": true,
  28. "rc": 0,
  29. "stderr": "Shared connection to 127.0.0.1 closed.\r\n",
  30. "stderr_lines": [
  31. "Shared connection to 127.0.0.1 closed."
  32. ],
  33. "stdout": "hello\r\n",
  34. "stdout_lines": [
  35. "hello"
  36. ]
  37. }

setup

setup获取机器的配置

get_url

该模块主要用于从http、ftp、https服务器上下载文件(类似于wget)
sha256sum #下载完成后进行sha256 check;
timeout #下载超时时间,默认10s;
url #下载的URL;
url_password、url_username #主要用于需要用户名密码进行验证的情况;
use_proxy #使用代理,代理需事先在环境变更中定义;

  1. ansible test -m get_url -a 'url=https://store.51yxxg.com/$HVOT5%29QAVBJEZRCWR%297%60A3-1549511966522.png dest=/root/test.png'
  2. s2 | CHANGED => {
  3. "changed": true,
  4. "checksum_dest": null,
  5. "checksum_src": "89cf1343a88ece3b344943d017126793493b05eb",
  6. "dest": "/root/test.png",
  7. "gid": 0,
  8. "group": "root",
  9. "md5sum": "08e263186eb8522f39839d935e38c1ff",
  10. "mode": "0644",
  11. "msg": "OK (180465 bytes)",
  12. "owner": "root",
  13. "size": 180465,
  14. "src": "/root/.ansible/tmp/ansible-tmp-1550023045.3543859-67698778084845/tmpw5atZn",
  15. "state": "file",
  16. "status_code": 200,
  17. "uid": 0,
  18. "url": "https://store.51yxxg.com/$HVOT5%29QAVBJEZRCWR%297%60A3-1549511966522.png"
  19. }

unarchive

用于解压文件的模块
copy #在解压文件之前,是否先将文件复制到远程主机,默认为yes。若为no,则要求目标主机上压缩包必须存在;
creates #指定一个文件名,当该文件存在时,则解压指令不执行;
dest #远程主机上的一个路径,即文件解压的路径;
group #解压后的目录或文件的属组;
list_files #如果为yes,则会列出压缩包里的文件,默认为no,2.0版本新增的选项;
mode #解决后文件的权限;
src #如果copy为yes,则需要指定压缩文件的源路径;
owner #解压后文件或目录的属主;

  1. ansible test -m unarchive -a 'src=foo.tgz dest=/var/lib/foo'
  2. ansible test -m unarchive -a 'src=/tmp/foo.zip dest=/usr/local/bin copy=no'
  3. ansible test -m unarchive -a 'src=https://example.com/example.zip dest=/usr/local/bin copy=no'

其他工具

ansible-doc

查看模块的帮助文档
ansible-doc ping

ansible-playbook

组织一套执行剧本

  1. #dep.yml
  2. - name: dep
  3. hosts: test
  4. remote_user: root
  5. tasks:
  6. - name: install zip
  7. apt : name=zip
  8. tags:
  9. - tag1
  10. - tag2
  11. - name: install unzip
  12. apt : name=unzip
  13. - name: install lrzsz
  14. apt : name=lrzsz
  1. ansible-playbook dep.yml
  2. #ansible-playbook dep.yml --tags tag1
  3. PLAY [dep] ********************************************************************************************
  4. TASK [Gathering Facts] ********************************************************************************
  5. ok: [s2]
  6. ok: [s3]
  7. ok: [s1]
  8. TASK [install zip] ************************************************************************************
  9. ok: [s1]
  10. ok: [s3]
  11. ok: [s2]
  12. TASK [install unzip] **********************************************************************************
  13. ok: [s1]
  14. ok: [s2]
  15. ok: [s3]
  16. TASK [install lrzsz] **********************************************************************************
  17. ok: [s1]
  18. changed: [s2]
  19. changed: [s3]
  20. PLAY RECAP ********************************************************************************************
  21. s1 : ok=4 changed=0 unreachable=0 failed=0
  22. s2 : ok=4 changed=1 unreachable=0 failed=0
  23. s3 : ok=4 changed=1 unreachable=0 failed=0

ansible-console

快捷命令集合版

参考

http://www.ansible.com.cn
https://blog.csdn.net/qq_41112887/article/details/86614234
https://blog.csdn.net/zzq900503/article/details/80158767