ansible是新出现的自动化运维工具,基于Python开发,集合了众多运维工具(puppet、cfengine、chef、func、fabric)的优势,实现了批量系统配置、批量程序部署、批量运行命令等功能。python
ansible是基于模块工做的,自己没有批量部署的能力。真正具备批量部署的是ansible所运行的模块,ansible只是提供一种框架。主要包括:
(1)、链接插件connection plugins:负责和被监控端实现通讯;
(2)、host inventory:指定操做的主机,是一个配置文件里面定义监控的主机;
(3)、各类模块核心模块、command模块、自定义模块;
(4)、借助于插件完成记录日志邮件等功能;
(5)、playbook:剧本执行多个任务时,非必需能够让节点一次性运行多个任务。mysql
链接其余主机默认使用ssh协议
ansible core核心引擎:即ansible自己
host inventory主机清单:用来定义ansible所管理主机,默认是在ansible的hosts配置文件中定义被管理主机,同时也支持自定义动态主机清单和指定其余配置文件的位置
connect plugin链接插件:负责和被管理主机实现通讯,除支持使用SSH链接被管理主机外,ansible还支持其余的链接方式,全部须要有链接插件将各个主机用链接插件链接到ansible
playbook剧本:用来集中定义ansible任务的配置文件,即将多个任务定义在一个剧本中由ansible自动执行,能够由控制主机针对多台被管理主机同时运行多个任务
core modules核心模块:是ansible自带的模块,使用这些模块将资源分发到被管理主机使其执行特定任务或匹配特定的状态
custom modules自定义模块:用于完成模块功能的补充,可借助相关插件完成记录日志,发送邮件等功能web
控制主机 192.168.13.128 被管理主机 192.168.13.129 被管理主机 192.168.13.130
[root@promote ~]# systemctl stop firewalld.service ##关闭全部主机的防火墙 [root@promote ~]# setenforce 0 [root@promote ~]# yum install epel-release -y ##安装epel源 [root@promote ~]# yum install ansible -y ##安装ansible服务 [root@promote ~]# yum install tree -y [root@promote ~]# tree /etc/ansible/ ##查看ansible属性结构 /etc/ansible/ ├── ansible.cfg ##配置文件 ├── hosts ##主机清单 └── roles
[root@promote ~]# vim /etc/ansible/hosts ##编辑ansible主机清单 [webserver] 192.168.13.129 ##web的主机地址 [mysql] 192.168.13.130 ##mysql的主机地址
[root@promote ~]# ssh-keygen -t rsa ##生成秘钥对 Generating public/private rsa key pair. Enter file in which to save the key (/root/.ssh/id_rsa): ##回车 Created directory '/root/.ssh'. Enter passphrase (empty for no passphrase): ##输入密码 Enter same passphrase again: ##确认密码 [root@promote ~]# ls .ssh/ ##查看秘钥 id_rsa id_rsa.pub [root@promote ~]# ssh-copy-id root@192.168.13.129 ##上传秘钥到后面的服务器上 [root@promote ~]# ssh-copy-id root@192.168.13.130
[root@promote ~]# ansible webserver -m command -a 'date' ##使用ansible命令行模块执行date Enter passphrase for key '/root/.ssh/id_rsa': ##输入秘钥密码 192.168.13.129 | CHANGED | rc=0 >> 2020年 01月 23日 星期三 23:57:16 CST [root@promote ~]# ansible mysql -m command -a 'date' Enter passphrase for key '/root/.ssh/id_rsa': 192.168.13.130 | CHANGED | rc=0 >> 2020年 01月 23日 星期三 23:57:38 CST [root@promote ~]# ssh-agent bash ##免交互代理 [root@promote ~]# ssh-add ##添加 Enter passphrase for /root/.ssh/id_rsa: ##输入秘钥 Identity added: /root/.ssh/id_rsa (/root/.ssh/id_rsa) [root@promote ~]# ansible webserver -m command -a 'date' ##继续执行命令行模块实现免交互 192.168.13.129 | CHANGED | rc=0 >> 2020年 01月 23日 星期三 23:58:26 CST [root@promote ~]# ansible mysql -m command -a 'date' 192.168.13.130 | CHANGED | rc=0 >> 2020年 01月 23日 星期三 23:58:39 CST
[root@promote ~]# ansible all -a 'date' 192.168.13.130 | CHANGED | rc=0 >> 2020年 01月 30日 星期四 00:17:02 CST 192.168.13.129 | CHANGED | rc=0 >> 2020年 01月 30日 星期四 00:17:02 CST [root@promote ~]# ansible all -a 'ls /' ##查看后两台主机的根目录 ##若是不加-m模块,则默认运行command模块all是全部主机
[root@promote ~]# ansible-doc -s cron ##查看cron模块信息 [root@promote ~]# ansible webserver -m cron -a 'minute="*/1" job="/usr/bin/echo haha" name="test haha"' ##选择cron模块指定时间,工做内容,名称 192.168.13.129 | CHANGED => { "ansible_facts": { "discovered_interpreter_python": "/usr/bin/python" }, "changed": true, "envs": [], "jobs": [ "test haha" ] } [root@promote ~]# ansible webserver -a 'crontab -l' ##执行命令行查看计划性任务 192.168.13.129 | CHANGED | rc=0 >> #Ansible: test haha */1 * * * * /usr/bin/echo haha [root@promote ~]# ansible webserver -m cron -a 'name="test haha" state=absent' ##移除计划性任务 192.168.13.129 | CHANGED => { "ansible_facts": { "discovered_interpreter_python": "/usr/bin/python" }, "changed": true, "envs": [], "jobs": [] }
[root@promote ~]# ansible-doc -s user ##查看user模块信息 [root@promote ~]# ansible all -m user -a 'name=test' ##给全部主机建立test用户 192.168.13.129 | CHANGED => { "ansible_facts": { "discovered_interpreter_python": "/usr/bin/python" }, "changed": true, "comment": "", "create_home": true, "group": 1001, "home": "/home/test", "name": "test", "shell": "/bin/bash", "state": "present", "system": false, "uid": 1001 } 192.168.13.130 | CHANGED => { "ansible_facts": { "discovered_interpreter_python": "/usr/bin/python" }, "changed": true, "comment": "", "create_home": true, "group": 1001, "home": "/home/test", "name": "test", "shell": "/bin/bash", "state": "present", "system": false, "uid": 1001 } [root@promote ~]# ansible webserver -m user -a 'name=test state=absent' ##删除webserver中test用户 192.168.13.129 | CHANGED => { "ansible_facts": { "discovered_interpreter_python": "/usr/bin/python" }, "changed": true, "force": false, "name": "test", "remove": false, "state": "absent" }
[root@promote ~]# ansible mysql -m group -a 'name=mysql gid=306 system=yes' ##建立mysql系统组 192.168.13.130 | SUCCESS => { "ansible_facts": { "discovered_interpreter_python": "/usr/bin/python" }, "changed": false, "gid": 306, "name": "mysql", "state": "present", "system": true } [root@promote ~]# ansible mysql -a 'tail -1 /etc/group' ##查看建立的状况 192.168.13.130 | CHANGED | rc=0 >> mysql:x:306: [root@promote ~]# ansible mysql -m user -a 'name=test02 uid=306 group=mysql system=yes' ##建立系统用户test02并加入到mysql组中 192.168.13.130 | CHANGED => { "ansible_facts": { "discovered_interpreter_python": "/usr/bin/python" }, "changed": true, "comment": "", "create_home": true, "group": 306, "home": "/home/test02", "name": "test02", "shell": "/bin/bash", "state": "present", "system": true, "uid": 306 } [root@promote ~]# ansible mysql -a 'id test02' ##查看系统用户test02的信息 192.168.13.130 | CHANGED | rc=0 >> uid=306(test02) gid=306(mysql) 组=306(mysql)
[root@promote ~]# ansible-doc -s copy ##copy模块的信息 [root@promote ~]# ansible mysql -m copy -a 'src=/etc/fstab dest=/opt/fstab.bak owner=root mode=644' ##复制源到目标,属组和文件权限 192.168.13.130 | CHANGED => { "ansible_facts": { "discovered_interpreter_python": "/usr/bin/python" }, "changed": true, "checksum": "0725780c6841b5cae04ba31a054b6090d701bc19", "dest": "/opt/fstab.bak", "gid": 0, "group": "root", "md5sum": "4a95e64f6c25098ca5e0613c5283e8f1", "mode": "0644", "owner": "root", "secontext": "system_u:object_r:usr_t:s0", "size": 595, "src": "/root/.ansible/tmp/ansible-tmp-1580550278.09-89338211954459/source", "state": "file", "uid": 0 } [root@promote ~]# ansible mysql -a 'ls -l /opt' ##查看是否复制成功 192.168.13.130 | CHANGED | rc=0 >> 总用量 4 -rw-r--r--. 1 root root 595 2月 1 17:44 fstab.bak drwxr-xr-x. 2 root root 6 3月 26 2015 rh [root@promote ~]# ansible mysql -m copy -a 'content="hello!" dest=/opt/test.txt' ##用copy进行写入文件内容 192.168.13.130 | CHANGED => { "ansible_facts": { "discovered_interpreter_python": "/usr/bin/python" }, "changed": true, "checksum": "8f7d88e901a5ad3a05d8cc0de93313fd76028f8c", "dest": "/opt/test.txt", "gid": 0, "group": "root", "md5sum": "5a8dd3ad0756a93ded72b823b19dd877", "mode": "0644", "owner": "root", "secontext": "system_u:object_r:usr_t:s0", "size": 6, "src": "/root/.ansible/tmp/ansible-tmp-1580550521.27-190936730009060/source", "state": "file", "uid": 0 } [root@promote ~]# ansible mysql -a 'cat /opt/test.txt' ##查看写入的文件内容 192.168.13.130 | CHANGED | rc=0 >> hello!
[root@promote ~]# ansible mysql -m file -a 'path=/opt/test.txt owner=test02 group=mysql mode=666' ##指定文件的属主,属组,文件的权限 192.168.13.130 | CHANGED => { "ansible_facts": { "discovered_interpreter_python": "/usr/bin/python" }, "changed": true, "gid": 306, "group": "mysql", "mode": "0666", "owner": "test02", "path": "/opt/test.txt", "secontext": "system_u:object_r:usr_t:s0", "size": 6, "state": "file", "uid": 306 } [root@promote ~]# ansible mysql -a 'ls -l /opt/test.txt' ##查看文件的属性 192.168.13.130 | CHANGED | rc=0 >> -rw-rw-rw-. 1 test02 mysql 6 2月 1 17:48 /opt/test.txt [root@promote ~]# ansible mysql -m file -a 'src=/opt/test.txt path=/opt/test.txt.link state=link' ##建立连接性文件 192.168.13.130 | CHANGED => { "ansible_facts": { "discovered_interpreter_python": "/usr/bin/python" }, "changed": true, "dest": "/opt/test.txt.link", "gid": 0, "group": "root", "mode": "0777", "owner": "root", "secontext": "unconfined_u:object_r:usr_t:s0", "size": 13, "src": "/opt/test.txt", "state": "link", "uid": 0 } [root@promote ~]# ansible mysql -a 'ls -l /opt/' ##查看文件的属性 192.168.13.130 | CHANGED | rc=0 >> 总用量 8 -rw-r--r--. 1 root root 595 2月 1 17:44 fstab.bak drwxr-xr-x. 2 root root 6 3月 26 2015 rh -rw-rw-rw-. 1 test02 mysql 6 2月 1 17:48 test.txt lrwxrwxrwx. 1 root root 13 2月 1 17:55 test.txt.link -> /opt/test.txt [root@promote ~]# ansible mysql -m file -a 'path=/opt/abc.txt state=touch' ##建立一个空文件 192.168.13.130 | CHANGED => { "ansible_facts": { "discovered_interpreter_python": "/usr/bin/python" }, "changed": true, "dest": "/opt/abc.txt", "gid": 0, "group": "root", "mode": "0644", "owner": "root", "secontext": "unconfined_u:object_r:usr_t:s0", "size": 0, "state": "file", "uid": 0 } [root@promote ~]# ansible mysql -a 'ls -l /opt/' ##查看建立状况 192.168.13.130 | CHANGED | rc=0 >> 总用量 8 -rw-r--r--. 1 root root 0 2月 1 17:57 abc.txt -rw-r--r--. 1 root root 595 2月 1 17:44 fstab.bak drwxr-xr-x. 2 root root 6 3月 26 2015 rh -rw-rw-rw-. 1 test02 mysql 6 2月 1 17:48 test.txt lrwxrwxrwx. 1 root root 13 2月 1 17:55 test.txt.link -> /opt/test.txt [root@promote ~]# ansible mysql -m file -a 'path=/opt/abc.txt state=absent' ##删除文件 192.168.13.130 | CHANGED => { "ansible_facts": { "discovered_interpreter_python": "/usr/bin/python" }, "changed": true, "path": "/opt/abc.txt", "state": "absent" } [root@promote ~]# ansible mysql -a 'ls -l /opt/' ##查看文件的信息 192.168.13.130 | CHANGED | rc=0 >> 总用量 8 -rw-r--r--. 1 root root 595 2月 1 17:44 fstab.bak drwxr-xr-x. 2 root root 6 3月 26 2015 rh -rw-rw-rw-. 1 test02 mysql 6 2月 1 17:48 test.txt
[root@promote ~]# ansible all -m ping 192.168.13.130 | SUCCESS => { "ansible_facts": { "discovered_interpreter_python": "/usr/bin/python" }, "changed": false, "ping": "pong" } 192.168.13.129 | SUCCESS => { "ansible_facts": { "discovered_interpreter_python": "/usr/bin/python" }, "changed": false, "ping": "pong" }
[root@promote ~]# ansible-doc -s yum ##yum模块信息 [root@promote ~]# ansible webserver -m yum -a 'name=httpd' ##安装httpd服务 [root@promote ~]# ansible webserver -m yum -a 'name=httpd state=absent' ##移除服务
[root@promote ~]# ansible webserver -m service -a 'name=httpd enabled=true state=started' ##开启httpd服务 [root@promote ~]# ansible webserver -a 'systemctl status httpd' ##查看开启的状况
[root@promote ~]# ansible webserver -m user -a 'name=jerry' ##建立用户 [root@promote ~]# ansible webserver -m shell -a 'echo abc123 | passwd --stdin jerry' ##建立密码 192.168.13.129 | CHANGED | rc=0 >> 更改用户 jerry 的密码 。 passwd:全部的身份验证令牌已经成功更新。
[root@promote ~]# cd /opt/ [root@promote opt]# vim test.sh ##编辑脚本文件 #!/bin/bash echo "this is test script" > /opt/script.txt chmod 666 /opt/script.txt [root@promote opt]# chmod +x test.sh ##给执行权限 [root@promote opt]# ansible all -m script -a 'test.sh' ##执行脚本 [root@promote opt]# ansible all -a 'cat /opt/script.txt' ##查看执行状况 192.168.13.130 | CHANGED | rc=0 >> this is test script 192.168.13.129 | CHANGED | rc=0 >> this is test script
[root@promote opt]# ansible mysql -m setup ##查看mysql主机的信息