执行前设定

它的Config文件呢,默认在/etc/ansible/ansible.cfg

第一步,就是我们的ansible的机器,需要链接上被它控制的机器。因为ansiblessh是默认有个检查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.combar.example.com2个机器,分给了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的准备工作也差不多了。

示例

[root@node1 .ssh]#vim /etc/ansible/hosts  

[websrvs]
172.18.21.100
172.18.21.200
[dbsrvs]
172.18.21.100
172.18.21.7
[root@node1 .ssh]#ansible all --list-hosts
  hosts (3):
    172.18.21.100
    172.18.21.7
    172.18.21.200
[root@node1 .ssh]#ansible websrvs --list-hosts
  hosts (2):
    172.18.21.100
    172.18.21.200
[root@node1 .ssh]#ansible dbsrvs --list-hosts
  hosts (2):
    172.18.21.100
    172.18.21.7
这里执行了ansible的最简单的模块ping,让它对所有在Hosts里的机器进行ping.探测远程主机网络是否畅通
[root@node1 .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:

体验shellcommand的区别,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模块

该模块主要用于从httpftphttps服务器上下载文件(类似于wget),主要有如下选项:

sha256sum:下载完成后进行sha256 check

timeout:下载超时时间,默认10s

url:下载的URL必须有

url_passwordurl_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:以哪个用户的身份执行


例:

[root@localhost ~]# ansible wserver -m cron -a 'name=sync_time minute=*/5 job="/sbin/ntpdate 172.16.0.1 > /dev/null;/sbin/hwclock -w"'

连到一台主机看一下crontab

[root@localhost ~]# crontab -l

#Ansible: sync_time                #这个就是我们刚添加的。

*/5 * * * * /sbin/ntpdate 172.16.0.1 > /dev/null;/sbin/hwclock -w

删除:

[root@localhost ~]# ansible wserver -m cron -a 'name=sync_time state=absent'

 

例: 添加每2天的2:30备份/etc目录到/var/backup下。

[root@localhost ~]# 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_fileyum的配置文件 

disable_gpg_check:关闭gpg_check 

disablerepo   #临时禁止使用yum库。 只用于安装或更新时。

enablerepo    #临时使用的yum库。只用于安装或更新时。

name:要进行操作的软件包的名字,也可以传递一个url或者一个本地的rpm包的路径 

state:状态(presentabsentlatest

例:安装httpd

这里只是说明一下conf_file的用法,yum的仓库文件没有在/etc/yum.repos.d/目录下的话。

[root@localhost ~]# ansible wserver -m yum -a 'name=httpd state=present conf_file="/root/local.repo"'

 

如果库本来是禁止使用的,就要用enablerepo来临时使用这个库。

这里的yum库文件已经在/etc/yum.repos.d/目录下了,不需要conf_file指定配置文件了。

[root@localhost 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服务:

[root@localhost html]# ansible all -m service -a 'name=httpd state=started'

设置开机启动:

[root@localhost ~]# ansible all -m service -a 'name=httpd enabled=yes'

重启服务:

[root@localhost ~]# ansible all -m service -a 'name=httpd sleep=2 state=restarted'

unarchive模块

用于解压文件,模块包含如下选项:

  • copy:在解压文件之前,是否先将文件复制到远程主机,默认为yes。若为no,则要求目标主机上压缩包必须存在。

  • creates:指定一个文件名,当该文件存在时,则解压指令不执行

  • dest:远程主机上的一个路径,即文件解压的路径 

  • grop:解压后的目录或文件的属组

  • list_files:如果为yes,则会列出压缩包里的文件,默认为no2.0版本新增的选项

  • mode:解决后文件的权限

  • src:如果copyyes,则需要指定压缩文件的源路径 

  • 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模块

发送脚本到各被管理节点,并执行。同样不需要参数。

[root@localhost ~]# 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:

[root@localhost ~]# ansible all -m selinux -a 'state=disabled'

selinux处于enforceing状态下的时候只能用permissive

statedisabled的情况下必须要指定policy

pip模块:在远程主机安装python
常用参数namestateversion
npm模块:在远程主机安装node.js
常用参数namestateversion

git模块Deploy software (or files) from git checkouts

websrvs每个节点上yum install git
访问此https://github.com/
搜索fastdfs

ansible 常用模块_第1张图片

[root@node1 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参数

具体使用示例如下:

[root@ansible ~]# ansible db -m setup

db | SUCCESS => {

    "ansible_facts": {

        "ansible_all_ipv4_addresses": [

            "192.168.33.137", 

            "172.17.42.1"

        ], 

….

….

使用filter过滤等等,支持通配符

获取ip

[root@ansible ~]# ansible db -m setup -a 'filter=ansible_default_ipv4'

获取主机名。。

[root@ansible ~]# ansible db -m setup -a 'filter=ansible_nodename'

获取内存信息。

[root@ansible ~]# ansible db -m setup -a 'filter=ansible_memory_mb'

 

可以使用grep过滤

[root@node1 ~]$ 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*destownergroupmode
注意此模块只能在playbook中使用,而不能在命令行中使用,因为只有ansible-playbook才能收内建变量,基于内建变量才能生成
模板文件