一、ad-hoc介绍

  ansible执行方式的其中一种是ad-hoc,ad-hoc就像一条Linux命令,ad-hoc一次性只能执行一个模块,所以ad-hoc一般在ansible中实现的是简单的任务

  ansible执行方式的另外一种是playbook,playbook就像一个shell脚本文件,可以一次性调用多个ansible的模块,而且playbook中还可以实现条件判断、循环等高阶特性,playbook一般都是实现复杂的任务

(一)ad-hoc语法格式

ansible 主机 -m 模块 -a '模块参数' ansible选项

eg:ansible all -m shell -a 'useradd zhangsan' -uroot -k

二、命令执行模块

  ansible的命令执行模块,就是相当于在被控节点直接去执行shell命令,所以叫做命令执行模块

  而这些命令执行模块和其他的模块之间有一个很大的区别:

命令执行模块不具备幂等性

幂等性:执行一次任何或者多次执行任务,结果只要是一样的,那么就不会发生任何改变

调用user模块去被控节点创建用户:

    第一次调用的时候,创建了用户

    第二次调用的时候,已经存在的用户,结果是一样的,不会发生任何改变

(一)shell模块

简单容易上手,本质就是执行shell命令,也就是所谓的linux命令

支持一些高阶参数:如creates、removes、chdir..

(二)command模块

和shell模块一模一样,只不过有一些特殊符号不支持,比如 | 、>...

 

(三)raw模块

和shell模块也是一模一样,但是不支持shell模块和command模块的那些参数

执行任务的时候—>直接SSH远程执行命令,并没有将模块封装为py脚本去执行,所以raw模块可以在没有python环境下的被控节点执行任务

(四)script模块

在被控节点执行主控节点的shell脚本

实际上并不是将shell脚本推送到远程主机执行,而是在主控节点上读取脚本的shell命令,把shell命令推送到被控节点执行

 

三、常用模块       ##一定要擅用  ansible-doc  模块名” 查询帮助

(一)文件管理模块(copy、fetch、file)

(1)file:在被控节点查看文件信息、创建、删除、修改普通文件/目录文件

    touch、rm、mkdir、chmod、chown 

state常用参数:

file(默认)   确保这是一个普通文件,并可修改属性

directory  确保这是一个目录         

link      创建软链接            

hard     创建硬链接            

touch      创建空文件(如果不存在)     

absent     删除文件或目录          

 

1.查看node节点的/etc/passwd文件信息

[root@controller ~]# ansible node1 -m file -a 'path=/etc/passwd  state=file'    ##state=file可以不用加上,默认就是这个

node1 | SUCCESS => {

    "ansible_facts": {

        "discovered_interpreter_python": "/usr/bin/python"

    },

    "changed": false,

    "gid": 0,

    "group": "root",

    "mode": "0644",

    "owner": "root",

    "path": "/etc/passwd",

    "secontext": "system_u:object_r:passwd_file_t:s0",

    "size": 2314,

    "state": "file",

    "uid": 0

}

2.在node1和node2节点上创建/opt/file文件,要求文件的拥有人是devops,拥有组是root,文件权限是777

[root@controller ~]# ansible node1,node2 -m file -a 'path=/opt/file   owner=devops   group=root   mode='0777'  state=touch'

##注意点:一定一定要带上特殊权限,一共是四位数字并要用逗号包裹起来

3.修改node2节点上的/opt/file文件信息,将文件的拥有人修改为root

[root@controller ~]# ansible all -m file -a 'path=/opt/file    owner=root    state=file'   ##state=file可以不用加上,默认就是这个

  

4.在所有的节点上创建/opt/dir目录

[root@controller ~]# ansible all -m file -a 'path=/opt/dir   state=directory'

  

5.删除所有节点上的/opt/dir目录文件

[root@controller ~]# ansible all -m file -a 'path=/opt/dir   state=absent'

      ##file模块只能一个文件一个文件的删除,不支持批量删除文件

6.在node1节点上创建软链接文件/opt/passwd,源文件指定/etc/passwd

[root@controller ~]# ansible all -m file -a 'src=/etc/passwd   dest=/opt/passwd   state=link'

##src:被控节点的源文件(原始文件的真实路径)—— 链接指向的目标

##dest:被控节点的目标路径(链接文件存放的位置)—— 创建的快捷方式本身

 

(二) copy:实现控制节点和被控节点文件的传输;把控制节点的文件传输给被控节点,在被控节点自身上进行文件拷贝,支持将内容直接写入到文件中

    常用参数:

      backup:在覆盖文件之前先备份一份,备份的文件名自动以时间命名

      content:把内容写到文件中

      dest:目标文件

      src:源文件

      remote_src:如果为yes,则src表示被控节点路径,如果为false,则src表示主控节点的路径

      force:是否要覆盖文件

1. 将控制节点的/etc/passwd拷贝到所有的被控节点的/tmp目录下

ansible all -m copy -a 'src=/etc/passwd  dest=/tmp  backup=true'

2. 将node1节点的/etc/passwd文件拷贝到自己node1节点的/opt目录下,修改名/opt/passwd-node1

[root@controller ansible]# ansible node1 -m copy -a 'remote_src=yes  src=/etc/passwd   dest=/opt/passwd-node1'

##remote_src源文件已经在远程主机上,在远程主机内部复制/移动

3. 使用copy模块将httpd index 内容写入到/var/www/html/index.html文件

[root@controller  ansible]# ansible all -m copy -a 'content="httpd index\n" dest=/var/www/html/index.html'

##\n表示换行

 

 

(三)fetch:将被控节点的文件拷贝到控制节点上,只能拉取普通文件,目录是无法拷贝过来的,默认情况下,拉取过来的文件在控制节点上是以被控节点主机名的名字作为目录名字来存储的

1.将所有的被控节点的/opt/copy.txt文件保存到控制节点的/tmp目录下

[root@controller ansible]# ansible all -m fetch -a 'src=/opt/copy.txt    dest=/tmp/'

##拉取过来的文件在控制节点上是以被控节点主机名的名字作为目录名字来存储的

[root@controller ansible]# ls /tmp/node1/opt/copy.txt

/tmp/node1/opt/copy.txt

2.直接拉取/opt/copy.txt文件,不要以目录结构存储

[root@controller ansible]# ansible all -m fetch -a 'src=/opt/copy.txt  dest=/opt/   flat=yes'

node1 | CHANGED => {

    "changed": true,

node2 | SUCCESS => {    ##因为文件名相同所以node2显示为success

    "changed": false,

##注意,flat设置为true,然后dest如果是一个目录,那么目录后面必须要带/

 

四、软件管理模块

1. yum_repository模块:管理yum仓库配置文件(创建配置文件往里面写内容,修改配置文件的内容)不能删除yum仓库配置文件

2. yum模块:管理软件包的,比如安装、更新、卸载...

(一) yum_repository模块

    常用参数:

      file:指定yum配置文件的,不需要指定.repo后缀

      name:对应配置文件中的[ ] ,仓库名

      description:对应配置文件的中name内容

      gpgcheck:对应配置文件中的gpgcheck

      gpgkey:对应配置文件中的gpgcheck

      enabled:对应配置文件中的enabled

      state:present创建仓库以及修改的含义,absent删除仓库

(1)在所有的被控节点创建yum配置文件,要求文件名称为dvd.repo,文件中包含俩个仓库,仓库信息如下.提前将镜像挂载到iso目录上。

[base]

name=base01

baseurl=file:///iso/BaseOS/

gpgcheck=0

enabled=1

[appstream]

name=appstream01

baseurl=file:///iso/AppStream

gpgcheck=0

enabled=1

[root@controller ansible]# ansible all -m yum_repository -a 'file=dvd name=base description=base01 baseurl=///iso/BaseOS gpgcheck=0 enabled=1'

[root@controller ansible]# ansible all -m yum_repository -a 'file=dvd name=appstream description=appstream01 baseurl=///iso/AppStream gpgcheck=0 enabled=1'

 

(二)yum模块

可以对包进行管理,也可以对包组进行管理

常见参数:

  name:指定包或者包组的名字

  state:absent卸载、latest更新、present安装

(1)安装nginx软件包

[root@controller ansible]# ansible all -m yum -a 'name=nginx  state=present'

2)安装Development Tools软件包组       ##考试会考

[root@controller ansible]# ansible all -m yum -a 'name="@development  tools" state=present '   ##有空格的内容一定要使用“”包裹起来

##在软件包组前加上一个@。则表示为包组

(3)更新系统上所有的rpm包版本

[root@controller ansible]# ansible all -m yum -a 'name="*" state=latest'

(4)卸载nginx软件包(不会同时卸载依赖包)

[root@controller ansible]# ansible all -m yum -a 'name="nginx" state=absent'

 

五、服务管理模块

- service

- systemd

  systemd模块多了daemon_reload参数,相当于执行了systemctl daemon-reload,一旦修改了服务的服务单元配置文件,一定要daemon-reload才能够读取到。其他的参数都是一样

 常用参数:

name:操作哪个服务

state:started、stopped、restarted、reloaded

enabled:是否实现开机自启动

(一) 重启httpd服务,并且实现开机自启动

[root@controller ansible]# ansible all -m systemd -a 'name="httpd"  state=restarted   enabled=yes'

 

 

六、用户管理模块

user模块:管理用户的,相当于useradd、userdel、usermod

group模块:管理用户组的,相当于groupadd、groupmod、groupdel

(一)user模块  

(1) 创建lisi用户,要求uid是3300,附加组是root,描述信息是web user,登录shell是/bin/bash

[root@controller ansible]# ansible all -m user -a 'name=lisi uid=3300 groups=root comment="web server" shell="/bin/bash"'

##append: yes 在 Ansible 的 user 模块中表示追加组,而不是替换组。

(2)修改lisi用户信息,将其登录shell修改为/sbin/nologin

[root@controller ansible]# ansible all -m user -a 'name=lisi shell="/sbin/nologin"'

(3)删除lisi用户,删除用户的要删除家目录和邮箱文件,所以这里需要额外添加一个参数remove=yes

[root@controller ansible]# ansible all -m user -a 'name=lisi state=absent remove=yes'

(二)group模块

(1)创建用户组itgroup,gid是6666

[root@controller ansible]# ansible all -m group -a 'name=itgroup  gid=6666'

##默认的状态是,state:present

(2)修改组的gid为7777

[root@controller ansible]# ansible all -m group -a 'name=itgroup gid=7777'

(3)删除用户组

[root@controller ansible]# ansible all -m group -a 'name=itgroup state=absent'

 

七、计划任务模块

  cron模块:相当于crontab周期性计划任务

  常用参数:

  minute

  hour

  day

  month

  weekday

  job:定义执行的任务命令

  user:以什么用户的身份去执行任务

  state:创建/删除

  cron_file:指定在哪个文件定义计划任务,要么是/etc/crontab要么是/etc/cron.d

(一)在node1节点上,创建一个cron01任务每天上午9点15分,以及下午的17点15分,执行echo redhat任务

[root@controller ansible]# ansible node1 -m cron -a 'name=cron01  minute="15"  hour="9,17"  job="echo redhat"'

##如果未指定文件 则默认存放在  “/var/spool/cron/”目录下

(二)删除cron01计划任务

[root@controller ansible]# ansible node1 -m cron -a 'name=cron01 state=absent'

八、文件下载模块

  get_url:在被控节点下载文件使用的

  常用参数:

  url:指定下载的文件的路径

  dest:指定下载到目的的哪个位置

(一)下载https://releases.ansible.com/ansible/ansible-2.9.0.tar.gz文件,到/opt目录下

[root@controller ansible]# ansible all -m get_url -a 'url=https://releases.ansible.com/ansible/ansible-2.9.0.tar.gz   dest=/opt'

 

九、解压缩模块

  unarchive:可以把控制节点的压缩包解压缩到被控节点,也可以在被控节点自身上找压缩包然后解压缩到自身另外一个目录

  常用参数:

  src:压缩文件的源路径,默认是在控制节点上找到的,除非remote_src=yes

  dest:解压缩后放到哪个目录下

  remote_src:表示找的压缩文件是否来自于被控节点本身,如果remote_src=yes,则src是在被控节点本身搜索的压缩文件,如果 remote_src=no,则src表示控制节点的压缩文件。默认remote_src=no

(一)将控制节点/下的压缩文件demo.tar.gz解压缩到/opt目录下

[root@controller ansible]# ansible all -m unarchive -a 'src=/demo.tar.gz    dest=/opt'

(二)将被控节点node1,/opt目录下的压缩文件node1.tar.gz解压缩到/tmp目录下

[root@controller ansible]# ansible node1 -m unarchive -a 'remote_src=yes   src=/opt/node01.tar.gz    dest=/tmp'

 

十、文件同步模块

  synchronize模块:相当于执行rsync命令

    - 将远程主机 被控节点的文件拉取到控制节点上

    - 将控制节点的文件推送到被控节点

  底层其实走的是rsync命令,而rsync走的是SSH协议

  常用参数:

  mode:pull/push,默认是push。如果是push的话,那么src表示控制节点的文件路径;如果是pull的话,那么src表示被控节点的路径

  src:文件源路径

  dest:文件目标路径

(一)传输普通文件:

1.将控制节点的/etc/passwd文件同步到所有的被控节点的/opt目录下

[root@controller ansible]# ansible all -m synchronize -a 'src=/etc/passwd   dest=/opt'

2.将所有的被控节点的/opt/passwd拉取到控制节点的/tmp目录下

[root@controller ansible]# ansible all -m synchronize -a 'mode=pull   src=/opt/passwd   dest=/tmp/'

(二)传输目录文件:

  传输的如果是目录,那么对于src来说,后面路径带不带/是存在不同的意义的

  如果带上了/,表示同步这个目录下所有的文件

  如果没带/,表示同步这一整个目录

1.将控制节点的整个“/opt目录”同步到被控节点的/tmp目录下

[root@controller ansible]# ansible all -m synchronize -a 'src=/opt   dest=/tmp'

[root@node1 /]# ls /tmp/

opt

 ##这个没带/,同时的是一整个opt目录

2.将控制节点/opt目录下的文件全部同步到被控节点的/tmp目录下

[root@controller ansible]# ansible all -m synchronize -a 'src=/opt/ dest=/tmp'

[root@node1 /]# ls /tmp/

containerd  copy.txt

  ##这个带了/,同步的是/opt目录下的所有文件

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐