Ansible的简单使用
Posted lbg-database
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Ansible的简单使用相关的知识,希望对你有一定的参考价值。
ansible相关原理简单介绍:
ansible是基于ssh服务.ssh服务一般服务器上都自带了.
ansible 所有的工作都依赖于核心模块来完成,这些核心模块都是 ansible 自身携带的,若这个内置模块功能不满足需求,还可以自己编写模块,任何语言都行,遵循基本的语法规范,能执行就行。 为了对部分主机执行配置,区分不同组的主机我们需要定义 host inventory.(主机清单),可以通过读取组名自动识别组成员。 |
Ansible遵从幂等性:
幂等性:即同一个命令无论几次执行,其结果一样.如卸载软件,第一次卸载成功了,再次运行卸载命令,则依旧报卸载成功了. |
ansible的安装:
上传安装包到/usr/local/src
[[email protected] src]# unzip ansible.zip 解压后进入目录,ansible-2.5.0-2.el6.noarch.rpm 是主要安装包,其他是依赖包。 [[email protected] ansible]# yum -y localinstall * ----安装。 [[email protected] ansible]# rpm -q ansible ---查看是否安装成功。 |
ansible的简单使用:
1.编辑host inventory.(主机清单),/etc/ansible/hosts 文件,该文件定义了当前系统能够识别的所有主机
[[email protected] ansible]# vim /etc/ansible/hosts
## green.example.com ## blue.example.com ## 192.168.100.1 ## 192.168.100.10 如上,我们可以直接定义主机,不分组,使用时使用选项all 来进行调用所有ip. ## [test] ## alpha.example.org ## beta.example.org ## 192.168.1.100 ## 192.168.1.110 如上,我们可以定义一个组叫 test,然后可以通过组名调用. |
例子:定义两个组,组别分别为test1和test2,其中test1组的ip有192.168.88.3,test2组的ip有192.168.88.4。
[test1]
192.168.88.3
[test2]
192.168.88.4
|
2.配置互相并测试:(互信是你的公钥我拿着,我的公钥你拿着.ansible中若无特殊要求,配单边互相即可。)
[[email protected] ~]# ping 192.168.88.3
[[email protected] ~]# ping 192.168.88.4
|
[[email protected] ~]# ssh-keygen -t rsa -P ‘‘
Enter file in which to save the key (/root/.ssh/id_rsa): --这一步直接回车,将私钥密码文件放在/root/.ssh/id_rsa里.其中公钥文件是id_rsa.pub
[[email protected] ~]# cd .ssh
[[email protected] .ssh]# ls
id_rsa id_rsa.pub
|
[[email protected] .ssh]# ssh-copy-id -i ~/.ssh/id_rsa.pub [email protected]
[[email protected] .ssh]# ssh-copy-id -i ~/.ssh/id_rsa.pub [email protected]
|
[[email protected] .ssh]# ansible all -m ping
192.168.88.4 | SUCCESS => {
"changed": false,
"ping": "pong"
}
192.168.88.3 | SUCCESS => {
"changed": false,
"ping": "pong"
}
|
注意:使用 ansible 远程执行命令一次只能执行一个,不能使用管道符。
-m 指modularity 后跟模块(默认是命令模块) -a 指argument 后跟命令.
|
例子:
[[email protected] .ssh]# ansible all -m command -a "date +‘%F%T‘"
192.168.88.3 | SUCCESS | rc=0 >> 2018-10-0616:34:40
192.168.88.4 | SUCCESS | rc=0 >>
2018-10-0616:34:39 |
ansible 的重要功能都是要使用模块的:
[[email protected] .ssh]# ansible-doc -l ---查看所有可以执行的模块
ansible-doc –s module_name -----查看模块的使用方法: 例子: [[email protected] .ssh]# ansible-doc -s copy ---查看copy模块的使用方法 [[email protected] .ssh]# ansible-doc -s file ----查看file模块的使用方法 |
copy模块使用示例:
将~/test.sh文件放到目标主机上的/tmp目录里,源文件可以是相对路径,但目标路径必须是绝对路径.
[[email protected] ~]# ansible all -m copy -a ‘src=~/test.sh dest=/tmp‘ ---拷贝文件
[[email protected] ~]# ansible all -m file -a ‘path=/tmp/test.sh mode=0755‘ --给文件授权 [[email protected] ~]# ansible all -a ‘chmod +x /tmp/test.sh‘ ---(不依赖模块功能)给文件可执行权限 [[email protected] ~]# ansible all -a ‘ls /tmp/test.sh‘ ----查看文件。 |
corn模块使用示例:
查看是否有定时任务:
[[email protected] ~]# ansible all -a ‘crontab -l ‘ |
创建定时任务,名字是lbg,每3分钟执行一次:
[[email protected] ~]# ansible all -m cron -a "name=‘lbg‘ minute=*/3 job=‘/bin/echo 123 >> /tmp/test.sh ‘" |
成功后可在目标主机上查看:
[[email protected] .ssh]# cat /var/spool/cron/root
#Ansible: lbg */3 * * * * /bin/echo 123 >> /tmp/test.sh |
删除定时任务:
[[email protected] ~]# ansible all -m cron -a "name=‘lbg‘ state=absent" |
只在IP组test1里创建定时任务:
[[email protected] ~]# ansible test1 -m cron -a " name=‘lbgtest‘ minute=*/2 job=‘echo how do you do >> /tmp/test.sh‘" |
hostname模块使用:
[[email protected] ~]# ansible all -a ‘hostname‘ ----查看所有主机的主机名
[[email protected] ~]# ansible all -m hostname -a ‘name=lbg‘ ---给所有主机命名(会在对应配置文件里也修改) [[email protected] ~]# ansible all -a ‘cat /etc/sysconfig/network‘ ---查看配置文件里主机名是否修改。 |
user模块的使用:
[[email protected] ~]# ansible all -m user -a ‘name=ansible uid=8888 group=0 ‘ --添加用户ansible.
[[email protected] ~]# ansible all -a ‘id ansible‘ --查看用户ansible. [[email protected] ~]# ansible all -m user -a ‘name=ansible group=2 ‘ --修改用户gid. [[email protected] ~]# ansible all -m user -a ‘name=ansible state=absent remove=yes ‘ --删除用户 [email protected] ~]# ansible test1 -a ‘ls -l /home‘ --查看test1组的主机的ansible用户的家目录是否删除 |
group模块的使用:
[[email protected] ~]# ansible test1 -m group -a " name=dba gid=666 " --添加组
[[email protected] ~]# ansible test1 -m group -a " name=dba state=absent " --删除组 |
service模块的使用:
Service的state的状态有:started/stopped/restarted/reloaded
[[email protected] ~]# ansible all -m service -a ‘name=httpd state=started ‘ ---开启httpd服务 |
yum模块的使用:
先在己机上写好配置yum源的文件,再使用copy模块命令传给目标主机.
[[email protected] ~]# ansible all -m copy -a " src=test.repo dest=/etc/yum.repos.d" --拷贝yum源文件
[[email protected] ~]# ansible all -a "mount /dev/sr0 /mnt/rhel" ---挂载 [[email protected] ~]# ansible all -a "yum repolist" ---检查yum源 [[email protected] ~]# ansible all -m yum -a "name=httpd state=present" --yum安装httpd软件。 [[email protected] ~]# ansible all -m yum -a "name=httpd state=absent" --yum卸载httpd软件 |
想让 ansible 在一台主机上同时执行多条命令的时候就会用到 playbook.使用YAML语法编写playbook。
创建 playbook:
[[email protected] ~]# vim create-group.yaml ----内容如下:
---
- hosts: test1 remote_user: root tasks: - name: add group dba group: name=dba gid=10000 system=no - name: add user oracle user: name=oracle group=dba uid=10000 system=no - name: touch-file command: /bin/touch /tmp/hello |
playbook说明:
YAML的结构(structure)通过空格来展示,序列(sequence)里的项用"-"来代替,Map(散列)里面的键值对用":"分隔"。
文件的第一行应该以 ”—” (三个连字符,无空格)开始,表明YMAL文件的开始。 在同一行中,#之后的内容表示注释。 大小写敏感。 使用缩进表示层级关系。 缩进时不允许使用Tab键,只允许使用空格。 缩进的空格数目不重要,只要相同层级的元素左侧对齐即可。 YMAL中的列表元素以”-”开头然后紧跟着一个空格,后面为元素内容。 对象的表示方法都是键值中间以”:”分隔,”:”后面还要增加一个空格。 hosts 用于指定要执行指定任务的主机,其可以是一个或者多个以冒号分隔的主机组。 remote_user 则用于指定远程主机上的执行任务的用户。 play 的主体部分是 tasks ,tasks的核心为ansible的模块,tasks包含name和要执行的模块,name是可选的,只是为了便于用户阅读,模块是必须的,同时也要给予模块相应的参数。 tasks 中的各任务按次序逐个在 hosts 中指定的所有主机上执行,即在所有主机上完成第一个任务后再开始第二个。tasks 的目的使用指定的参数执行模块,而在模块参数中可以使用变量.模块执行是幂等的,这意味着多次执行也是安全的,因为其执行结果一致。在运行 playbook 时,若中途发生错误,所有已执行的任务都将回滚,因此在更正 playbook 后重新执行即可。 在众多模块中,command 和 shell 模块可仅需给定一个列表而无需使用"key=value"格式。 |
运行 playbook:
[[email protected] ~]# ansible-playbook create-group.yaml ----输出结果如下:
PLAY [test1] ******************************************************************************
TASK [Gathering Facts] ******************************************************************* ok: [192.168.88.3] TASK [add group dba] ******************************************************************** ok: [192.168.88.3] TASK [add user oracle] ******************************************************************** ok: [192.168.88.3] TASK [touch-file] ************************************************************************** changed: [192.168.88.3] PLAY RECAP ******************************************************************************* 192.168.88.3 : ok=4 changed=1 unreachable=0 failed=0 |