执行前设定
它的Config文件呢,默认在/etc/ansible/ansible.cfg
第一步,就是我们的ansible的机器,需要链接上被它控制的机器。因为ansible的ssh是默认有个检查key的设置,我们第一次使用它,肯定对面机器没有Public key啊,所以我们要关闭配置文件内的private key的检查:
host_key_checking = False
生成ssh-key
生成ssh-key这部分,就不再多说了。
创建你的hosts
设置控制的主机清单在/etc/ansible/hosts下
然后就是要把你想控制的机器的ip\域名等等按照ansible的格式写进去:
如:
[webservers]
foo.example.com
bar.example.com
什么意思呢?我把域名为foo.example.com和bar.example.com的2个机器,分给了webservers组。
除了域名也可以这样:
[dbservers]
192.168.10.12
127.152.112.13
如果某些主机的SSH运行在自定义的端口上,但是如果修改 ansible使用openssh进行ssh连接时将会使用:
192.168.1.1:3091
假如你想要为某些静态IP设置一些别名,可以这样做:
web1 ansible_ssh_port = 3333 ansible_ssh_host = 192.168.1.2
上面的 web1别名就指代了IP为192.168.1.2,ssh连接端口为3333的主机。
[webservers]
www[01:50].yanruogu.com
[databases]
db-[a:f].yanruogu.com
上面指定了从web1到web50,webservers组共计50台主机;databases组有db-a到db-f共6台主机。
这时候,有经验的运维人员,肯定纳闷,又没配好ssh,又没地方写密码用户,怎么连过去?
这里ansible是准备好了答案的(主机变量),它支持在ssh配好以前,使用用户名密码登录远程机器
[webservers]
192.168.10.12 ansible_ssh_pass=123456 ansible_ssh_user=root
127.152.112.13 ansible_ssh_pass=123567 ansible_ssh_user=root
这么一设置,能理解了吧?那么我们本次第一次运行ansible的准备工作也差不多了。
示例
[[email protected] .ssh]#vim /etc/ansible/hosts
[websrvs]
172.18.21.100
172.18.21.200
[dbsrvs]
172.18.21.100
172.18.21.7
[[email protected] .ssh]#ansible all --list-hosts
hosts (3):
172.18.21.100
172.18.21.7
172.18.21.200
[[email protected] .ssh]#ansible websrvs --list-hosts
hosts (2):
172.18.21.100
172.18.21.200
[[email protected] .ssh]#ansible dbsrvs --list-hosts
hosts (2):
172.18.21.100
172.18.21.7
这里执行了ansible的最简单的模块ping,让它对所有在Hosts里的机器进行ping.探测远程主机网络是否畅通
[[email protected] .ssh]#ansible all -m ping
172.18.21.7 | SUCCESS => {
"changed": false,
"ping": "pong"
}
172.18.21.200 | SUCCESS => {
"changed": false,
"ping": "pong"
}
172.18.21.100 | SUCCESS => {
"changed": false,
"ping": "pong"
}
Ansible的安装、初始化、第一个ping,我们也搞定了。
那么我们可以继续说下,Ansible的常用命令了,不过这个部分我们只需要知道下就行了。
重点是后面的playbook。
这里需要说明下的就是,ansible本身是没有部署能力的,它只是个框架,它的模块才有真正的部署能力。
Command 模块
在远程主机运行命令
常用参数:
chdir 运行command命令前先cd到这个目录
creates 如果这个参数对应的文件存在,就不运行command
executable 将shell切换为command执行,这里的所有命令需要使用绝对路径
removes 如果这个参数对应的文件不存在,就不运行command,存在运行
示例:
ansible-doc -s command \\可以查看这个模块的帮助信息
ansible 172.18.21.100 -m command -a "pwd chdir=/tmp" \\在172.18.21.10主机切换到/tmp目录执行pwd命令
ansible 172.18.21.100 -m command -a "mkdir mydir chdir=/app" \\在远程主机创建目录
ansible 172.18.21.100 -m command -a "mkdir mydir chdir=/app creates=mydir" \\creates表示此文件或者目录如果存在就不执行
172.18.21.100 | SUCCESS | rc=0 >>
skipped, since mydir exists
ansible 172.18.21.100 -m command -a "touch f1 chdir=/app removes=f1"
172.18.21.100 | SUCCESS | rc=0 >>
skipped, since f1 does not exist
shell 模块
这个是一个很神奇的模块,它也是ansible的核心模块之一。它跟command模块一样负责在被ansible控制的节点(服务器)执行命令行。它与command模块有着相似的地方,也有不同的地方如在远程主机的shell进程下运行命令,支持shell特性,如管道等
常用参数
chdir 运行command命令前先cd到这个目录
creates 如果这个参数对应的文件存在,就不运行command
removes 如果这个参数对应的文件不存在,就不运行command,存在运行
案例1:
让所有节点运行somescript.sh并把log输出到somelog.txt。
ansible websrvs -m shell -a "/usr/bin/sh somescript.sh >> somelog.txt"
案例2:
先进入somedir/ ,再在somedir/目录下让所有节点运行somescript.sh并把log输出到somelog.txt。
ansible websrvs -m shell -a "somescript.sh >> somelog.txt" chdir=somedir/
案例3:
体验shell和command的区别,先cd到某个需要编译的目录,执行condifgure然后,编译,然后安装。
ansible websrvs -m shell -a "./configure && make && make insatll" chdir=/xxx/yyy/
案例4:
ansible-doc -s shell
ansible websrvs -m command -a "useradd user1" \\在远程的两个主机上创建一个用户
ansible websrvs -m shell -a "echo magedu|passwd --stdin user1" \\创建一个密码
ansible websrvs -m shell -a "echo magedu|passwd --stdin user1 executable=/bin/tcsh" \\也可以指定其他的shell类型,这要这个shell类型可以解析里面的命令即可
user模块
用户管理
state={present|absent} #present表示创建,absent表示删除。
force=yes #强制删除用户。 一般情况下用户在已登录状态下是不能删除的。相当于userdel -f
remove=yes #在删除用户的时候,同时删除家目录与mail spool。相当于userdel -r
system=yes #创建的系统用户
uid #指定uid
shell #指定shell
password #用来指定密码,要用已加密的密码。
示例
ansible websrvs -m user -a "name=tom groups=haproxy state=present uid=3000 shell=/usr/bin/sh"
\\!/usr/bin/sh用途就是指出本脚本是用的哪种shell写的,执行时系统应该用哪种shell来解释执行它。
ansible websrvs -m user -a "name=tom groups=haproxy state=present uid=3000 shell=/usr/bin/sh generate_ssh_key=true" \\创建用户并生产公钥私钥对
ansible websrvs -m user -a "name=test01 state=absent remove=yes" \\删除用户
group模块
组管理
gid # Optional `GID' to set for the group.
name # Name of the group to manage.
state # Whether the group should be present or not on the remote host.
system # If `yes', indicates that the group created is a system group.
跟user差不多
示例
ansible websrvs -C -m group -a "name=haproxy system=no state=present" \\先测试跑一遍看有没有错误
ansible websrvs -m group -a "name=haproxy system=no state=present" \\state为状态,指明是创建还是删除,创建用present,删除用absent,不是系统组
ansible websrvs -m group -a "name=haproxy system=no state=absent" \\---删除组
copy模块
复制文件到远程主机
content #代替src,可以直接设定指定文件的内容 。
src #要复制到远程主机的文件在本地的地址,可以是绝对路径,也可以是相对路径。如果路径是一个目录,它将递归复制。在这种情况下,如果路径使用"/"来结尾,则只复制目录里的内容,如果没有使用"/"来结尾,则包含目录在内的整个内容全部复制,类似于rsync。。
owner #属主。
group #属组。
mode #权限。
dest #必选项。要将源文件复制到的远程主机的绝对路径,如果源文件是一个目录,那么该路径也必须是个目录
backup #覆盖文件之前,先备份。 yes/no
others #所有的file模块里的选项都可以在这里使用
force #如果目标主机包含该文件,但内容不同,如果设置为yes,则强制覆盖,如果为no,则只有当目标主机的目标位置不存在该文件时,才复制。默认为yes
vim /app/test.txt
hello magedu
welcome
ansible all -m copy -a "src=/app/test.txt dest=/app/ owner=daemon group=nobody mode=664"
ansible all -m copy -a "content='hello true\n how are you\n' dest=/app/test2.txt" \\也可以复制一个内容到一个文件中
fetch模块
从远程主机取文件
ansible 172.18.21.7 -m fetch -a "src=/etc/fstab dest=/app/fstab" \\注意这里只能有一台主机上去取
file模块
设置文件的属性、创建空文件和目录软连接等
file模块主要用于远程主机上的文件操作,file模块包含如下选项:
force:需要在两种情况下强制创建软链接,一种是源文件不存在但之后会建立的情况下;另一种是目标软链接已存在,需要先取消之前的软链,然后创建新的软链,有两个选项:yes|no
group:定义文件/目录的属组
mode:定义文件/目录的权限
owner:定义文件/目录的属主
path:必选项,定义文件/目录的路径
recurse:递归的设置文件的属性,只对目录有效
src:要被链接的源文件的路径,只应用于state=link的情况
state:
directory:如果目录不存在,创建目录
file:即使文件不存在,也不会被创建,用于修改已存在文件的权限
link:创建软链接 src=源文件 path=链接文件
hard:创建硬链接
touch:如果文件不存在,则会创建一个新的文件,如果文件或目录已存在,则更新其最后修改时间
absent:删除目录、文件或者取消链接文件
ansible all -m file -a "path=/app/hidir state=directory owner=nobody mode=700" \\在远程主机创建一个空目录,并指定权限
ansible all -m file -a "path=/app/ff state=touch owner=nobody mode=770" \\创建空文件并指定权限,注意这里要用touch
ansible all -m file -a "path=/app/ff state=file owner=daemon mode=770" \\file只能用于已经存在文件修改权限,如果文件不存在不会创建
ansible all -m file -a "path=/app/fff src=/app/ff state=link" \\创建一个软连接文件/app/fff指向源文件/app/ff
ansible all -m file -a "path=/app/fff state=absent" \\删除文件
get_url模块
该模块主要用于从http、ftp、https服务器上下载文件(类似于wget),主要有如下选项:
sha256sum:下载完成后进行sha256 check;
timeout:下载超时时间,默认10s
url:下载的URL必须有
url_password、url_username:主要用于需要用户名密码进行验证的情况
use_proxy:是事使用代理,代理需事先在环境变更中定义
dest 下载到目录必须有
ansible all -m get_url -a "url=http://example.com/path/file.conf dest=/etc/foo.conf mode=0440"
ansible all -m get_url -a "url=http://example.com/path/file.conf dest=/etc/foo.conf sha256sum=b5bb9d8014a0f9b1d61e21e796d78dccdf1352f23cd32812f4850b878ae4944c"
ansible all -m get_url -a "url=http://mirrors.sohu.com/centos/7/os/x86_64/RPM-GPG-KEY-CentOS-7 dest=/app" \\下载网上的文件到多台主机
cron 模块
用于管理计划任务包含如下选项:
backup:对远程主机上的原任务计划内容修改之前做备份 backup=true
cron_file:如果指定该选项,则用该文件替换远程主机上的cron.d目录下的用户的任务计划
day:日(1-31,*,*/2,……)
hour:小时(0-23,*,*/2,……)
minute:分钟(0-59,*,*/2,……)
month:月(1-12,*,*/2,……)
weekday:周(0-7,*,……)
job:要执行的任务,依赖于state=present
name:该任务的描述
special_time:指定什么时候执行,参数:reboot,yearly,annually,monthly,weekly,daily,hourly
state:确认该任务计划是创建present(默认)还是删除 absent
user:以哪个用户的身份执行
例:
[[email protected] ~]# ansible wserver -m cron -a 'name=sync_time minute=*/5 job="/sbin/ntpdate 172.16.0.1 > /dev/null;/sbin/hwclock -w"' |
连到一台主机看一下crontab。
[[email protected] ~]# crontab -l #Ansible: sync_time #这个就是我们刚添加的。 */5 * * * * /sbin/ntpdate 172.16.0.1 > /dev/null;/sbin/hwclock -w |
删除:
[[email protected] ~]# ansible wserver -m cron -a 'name=sync_time state=absent' |
例: 添加每2天的2:30备份/etc目录到/var/backup下。
[[email protected] ~]# ansible wserver -m cron -a 'name=etc_tar minute=30 hour=2 day=*/2 job="/bin/tar -Jcf /var/backup/`/bin/date "+\\%Y\\%m\\%d-\\%H\\%M"`.tar.xz /etc"' |
查看一下:
#Ansible: etc_tar 30 2 */2 * * /bin/tar -Jcf /var/backup/`/bin/date +\%Y\%m\%d-\%H\%M`.tar.xz /etc |
yum模块
在远程主机安装软件包
使用yum包管理器来管理软件包,其选项有:
config_file:yum的配置文件
disable_gpg_check:关闭gpg_check
disablerepo #临时禁止使用yum库。 只用于安装或更新时。
enablerepo #临时使用的yum库。只用于安装或更新时。
name:要进行操作的软件包的名字,也可以传递一个url或者一个本地的rpm包的路径
state:状态(present,absent,latest)
例:安装httpd。
这里只是说明一下conf_file的用法,yum的仓库文件没有在/etc/yum.repos.d/目录下的话。
[[email protected] ~]# ansible wserver -m yum -a 'name=httpd state=present conf_file="/root/local.repo"' |
如果库本来是禁止使用的,就要用enablerepo来临时使用这个库。
这里的yum库文件已经在/etc/yum.repos.d/目录下了,不需要conf_file指定配置文件了。
[[email protected] html]# ansible wserver -m yum -a 'name=httpd state=present enablerepo=local' |
安装包组
ansible test -m yum -a 'name="@Development tools" state=present' \安装包组,只要在名称前面加上@
url路径安装
ansible test -m yum -a 'name=http://nginx.org/packages/centos/6/noarch/RPMS/nginx-release-centos-6-0.el6.ngx.noarch.rpm state=present'
service模块
服务程序管理
arguments #命令行提供额外的参数
enabled #设置开机启动。
name= #服务名称
runlevel #开机启动的级别,一般不用指定。
sleep #在重启服务的过程中,是否等待。如在服务关闭以后等待2秒再启动。
state #started启动服务, stopped停止服务, restarted重启服务,reloaded重载配置。
启动httpd服务:
[[email protected] html]# ansible all -m service -a 'name=httpd state=started' |
设置开机启动:
[[email protected] ~]# ansible all -m service -a 'name=httpd enabled=yes' |
重启服务:
[[email protected] ~]# ansible all -m service -a 'name=httpd sleep=2 state=restarted' |
unarchive模块
用于解压文件,模块包含如下选项:
- copy:在解压文件之前,是否先将文件复制到远程主机,默认为yes。若为no,则要求目标主机上压缩包必须存在。
- creates:指定一个文件名,当该文件存在时,则解压指令不执行
- dest:远程主机上的一个路径,即文件解压的路径
- grop:解压后的目录或文件的属组
- list_files:如果为yes,则会列出压缩包里的文件,默认为no,2.0版本新增的选项
- mode:解决后文件的权限
- src:如果copy为yes,则需要指定压缩文件的源路径
- owner:解压后文件或目录的属主
示例如下:
- unarchive: src=foo.tgz dest=/var/lib/foo \复制到远程主机,在解压
- unarchive: src=/tmp/foo.zip dest=/usr/local/bin copy=no
- unarchive: src=https://example.com/example.zip dest=/usr/local/bin copy=no
filesystem模块
在块设备上创建文件系统
选项:
dev:目标块设备
force:在一个已有文件系统 的设备上强制创建
fstype:文件系统的类型
opts:传递给mkfs命令的选项
示例:
ansible test -m filesystem -a 'fstype=ext2 dev=/dev/sdb1 force=yes'
ansible test -m filesystem -a 'fstype=ext4 dev=/dev/sdb1 opts="-cc"'
mount模块
配置挂载点
选项:
dump
fstype:必选项,挂载文件的类型
name:必选项,挂载点
opts:传递给mount命令的参数
src:必选项,要挂载的文件
state:必选项
present:只处理fstab中的配置
absent:删除挂载点
mounted:自动创建挂载点并挂载之
umounted:卸载
示例1:
ansible test -m mount -a "name=/mnt/dvd src=/dev/sr0 fstype=iso9660 opts=ro state=present"
ansible test -m mount -a "name=/srv/disk src='LABEL=SOME_LABEL' state=present"
ansible test -m mount -a "name=/home src='UUID=b3e48f45-f933-4c8e-a700-22a159ec9077' opts=noatime state=present'"
示例2:
创建disk.img磁盘镜像文件
ansible test -a 'dd if=/dev/zero of=/disk.img bs=4k count=1024'
使用 losetup将磁盘镜像文件虚拟成快设备
ansible test -a 'losetup /dev/loop0 /disk.img'
给块设备创建文件系统
ansible test -m filesystem -a 'fstype=ext4 force=yes opts=-F dev=/dev/loop0'
挂载
ansible test -m mount -a 'name=/mnt src=/dev/loop0 fstype=ext4 state=mounted opts=rw'
经过上面的四步之后,我们就可以通过/tmp目录,像访问真实快设备一样来访问磁盘镜像文件disk.img。
ansible webs -m mount -a 'name=/mnt state=absent' \\删除挂载点
script模块
发送脚本到各被管理节点,并执行。同样不需要参数。
[[email protected] ~]# ansible all -m script -a 'test.sh' |
直接在-a 后面指定脚本即可。
selinux模块
管理selinux选项
conf #指定应用selinux的配置文件。
state=enforcing|permissive|disabled #对应于selinux配置文件的SELINUX。
policy=targeted|minimum|mls #对应于selinux配置文件的SELINUXTYPE
关闭selinux:
[[email protected] ~]# ansible all -m selinux -a 'state=disabled' |
在selinux处于enforceing状态下的时候好像只能用permissive。
在state非disabled的情况下必须要指定policy。
pip模块:在远程主机安装python库
常用参数name,state,version
npm模块:在远程主机安装node.js库
常用参数name,state,version
git模块:Deploy software (or files) from git checkouts
在websrvs每个节点上yum install git
访问此https://github.com/
搜索fastdfs
[[email protected] app]#ansible websrvs -m git -a "repo=https://github.com/happyfish100/fastdfs.git dest=/app/fastdfs" \\可以在github上下载软件或者文件到远程多台主机
setup模块
setup模块,主要用于获取主机信息,在playbooks里经常会用到的一个参数gather_facts就与该模块相关。
这些信息是由特定格式的键和值组成的,键可以做为ansible的系统内建变量,可以调用这些变量使用,以后想使用哪些变量,可以用这种方式查找变量,相当于查字典的方式,如果要调用变量里面嵌套的变量可以使用外面的变量名[嵌套的变量]的方式实现.
setup模块下经常使用的一个参数是filter参数
具体使用示例如下:
[[email protected] ~]# ansible db -m setup
db | SUCCESS => {
"ansible_facts": {
"ansible_all_ipv4_addresses": [
"192.168.33.137",
"172.17.42.1"
],
….
….
使用filter过滤等等,支持通配符
获取ip
[[email protected] ~]# ansible db -m setup -a 'filter=ansible_default_ipv4'
获取主机名。。
[[email protected] ~]# ansible db -m setup -a 'filter=ansible_nodename'
获取内存信息。
[[email protected] ~]# ansible db -m setup -a 'filter=ansible_memory_mb'
可以使用grep过滤
[[email protected] ~]$ ansible 172.18.251.90 -m setup |grep mem
"ansible_memfree_mb": 1240,
"ansible_memory_mb": {
"ansible_memtotal_mb": 1823,
deploy_helper模块:Manages some of the steps common in deploying projects.
常用参数: backend、 host、 state、 weight
可以标记多台后端主机的状态,实现灰度发布
template模块:基于模板方式生成一个文件复制到远程主机
主要参数:*src,*dest,owner,group,mode
注意此模块只能在playbook中使用,而不能在命令行中使用,因为只有ansible-playbook才能收内建变量,基于内建变量才能生成
模板文件