8.模块 8.1模块的分类 8.1.1 Core Module (1)不需要格外下载和配置就可以直接使用的 (2)常用的module (3)都是经过严格测试的 8.1.2 Extra Module (1)Extra Module需要下载和配置才能使用 (2)次常用的 (3)还有可能存在bug的 注意:在ansible module文档上查看单个module的时候,每一个module文档的底部都会标识,这是一个“Core Module”,或者这是一个“Extra Module”,比如yum就是一个core module,yum_repository就是一个extra module 8.2常见模块 可以使用ansible-doc -l命令查看有哪些模块 使用ansible-doc -s copy命令可以查看模块的使用方法 8.2.1 command (1)帮助:[root@pythion ~]# ansible-doc -s command (2)简介:Command模块,命令模块、默认模块,用于在远程执行命令 (3)选项: free_form:要执行的linux指令 chdir:在执行指令之前,先切换到该目录 removes:对应的文件不存在就执行command creates:对应的文件存在就执行command executable:切换shell来执行指令,该执行路径必须是一个绝对路径 (4)案例:远程查看时间和文件 [root@pythion ansible]# ansible zhang -m command -a "date" [root@pythion ansible]# ansible all -m command -a "date" [root@pythion ansible]# ansible wang -m command -a "date" [root@pythion ansible]# ansible wang -m command -a "tail -1 /etc/passwd" [root@pythion ansible]# ansible all -a "date"

8.2.2 cron (1)简介:用来做计划任务 (2)state: present:安装 默认为安装 absent:移除 如果需要移除的话,只需要写上name和absent就可以了 (3)案例:写入一个计划任务,查看是否已经成功写入。 需要注意的是不写的默认都是 * ,名字得写,不写就会报错,状态默认是安装 [root@pythion ansible]# ansible zhang -m cron -a 'hour="*/5" job="/bin/date" name="date test" state=present' [root@pythion ansible]# ansible zhang -a "crontab -l"

8.2.3 user、group (1)简介:实现用户账号管理的 (2)案例:创建用户、创建组、创建组里边的成员 (3)注意:system 是否是系统组 [root@pythion ansible]# ansible all -m user -a 'name="user1" state=present' //创建用户 [root@pythion ~]# ansible zhang -m group -a 'name=pig gid=301 system=yes' //创建组 [root@pythion ~]# ansible zhang -m user -a 'name=pig uid=301 system=yes group=pig' //创建组里边的成员 ansible user 的passwd参数的值需要接受加密后的值 [root@dev2 test_deploy]# echo Zmc2tG1m= | openssl passwd -1 -stdin $1$XI3TNbug$Y14rSXX7JxTtlTub9Car/0 tasks: - name: add user tech user: name=tech password=$1$XI3TNbug$Y14rSXX7JxTtlTub9Car/0 8.2.4 copy (1)简介:用来操作文件,但是不能传输目录,他不会递归目录 (2)案例:复制文件、创建新文件,写入指定内容 (3)注意: src本地源文件路径,可以相对,可以绝对 dest目标文件,必须绝对路径 content:取代src,表示指定生成内容生成文件 远端可以指定传过去的文件名称,没有指定则为默认名称,目录后边+/和不加是一样的 backup:可以备份原来的文件,前提是原来的文件必须和要推送的文件有不同的地方,默认为no state:directory,abset,file,directory会创建目录,abset会删除,默认是file 将本地文件复制到远程主机 [root@pythion ~]# ansible wang -m copy -a 'src=/etc/passwd dest=/tmp/ mode=750 owner=root' 创建一个新文件,并写入指定内容 [root@pythion ~]# ansible wang -m copy -a 'content="hello\n world\n" dest=/tmp/1.txt 如果要批量复制目录下的文件到远端某一个目录中,可以使用with_fileglob模块,使用案例如下 tasks: - name: unity build script copy: src={{item}} dest=/data/shell/ owner=root mode=755 backup=yes with_fileglob: - /data/conf/build/* 8.2.5 file (1)简介:设置文件属主、属组、权限、制作软链接 (2)案例:设定远程文件 归属关系和权限 修改将远程主机/tmp/1.txt的归属关系和权限 [root@pythion ~]# ansible wang –m file -a 'owner=user1 group=user1 mode=644 path=/tmp/1.txt' 注意:path:指定文件路径,可以使用name或dest来替换 案例:制作软链接 [root@pythion ~]# ansible wang -m file -a 'path=/tmp/1.txt.link src=/tmp/1.txt state=link' 注意: src:指定文件路径,可以使用name或dest来替换 path:指明符号链接文件路径 如果要删除,则设为state=absent 创建目录: - name: mkdir scripts in zabbix-agent file: dest=/etc/zabbix/scripts mode=755 owner=root state=directory 8.2.6 ping (1)简介:检测主机是否能连通 (2)案例:检测所有主机连通性 [root@pythion ~]# ansible all -m ping 8.2.7 service (1)简介:控制服务的运行状态和开机启动状态 (2)案例: [root@pythion ~]# ansible wang -a "chkconfig --list named" 注意: enabled:是否开机自动启动,取值为true为false name:服务名称 state:状态 [root@pythion ~]# ansible wang -a "chkconfig --list named" //查看named开机自启级别 [root@pythion ~]# ansible wang -m service -a 'enabled=true name=named' //named开机自启 named的开机自启,并且保持运行状态 [root@pythion ~]# ansible wang -m service -a 'enabled=true name=named state=started' 8.2.8 shell (1)简介:Shell模块,在远程主机上执行命令 (2)注意:如果涉及管道、变量的最好使用shell模块 (3)案例: 设置密码 [root@pythion ~]# ansible zhang -m shell -a 'echo 123456 | passwd --stdin user1' 8.2.9 script (1)简介:在远程主机执行本地脚本 (2)案例:在远程主机执行本地的test.sh脚本 (3)注意: script:将本地脚本复制到远程主机,并运行 相对绝对路径都支持 [root@pythion ~]# ansible all -m script -a 'test.sh' 8.2.10 yum (1)简介:程序包的安装和卸载 (2)案例:安装zsh包,卸载zsh包 (3)注意: name:指定要安装的程序包,可以带上版本号 state:present,latest表示安装,absent表示卸载 [root@pythion ~]# ansible wang -m yum -a "name=zsh" //安装zsh包 [root@pythion ~]# ansible wang -m yum -a 'name=zsh state=absent' //卸载zsh包 8.2.11 setup (1)简介:收集远程主机的facts,每个被管理节点在接收管理命令之前会将自己主机相关的信息,如操作系统版本,ip地址等报告给远程的ansbile主机。 (2)案例:收集wang组里边的所有远程主机信息 [root@pythion ~]# ansible wang -m setup 案例:把信息以主机名的方式存储到/tmp/facts [root@rsync facts]# ansible jingqu -m setup --tree /tmp/facts 案例:收集网卡信息 [root@rsync facts]# ansible 172.165.0.7 -m setup -a "filter=ansible_eth[0-9]" 8.2.12 synchronize模块 (1)简介:将src目录的内容推送到远端服务器的目录之下 (2)案例1:将/home/zhang/目录下的内容推送到远端/tmp/wang/目录下,会把源目录的所有内容都推送到目标目录,内容以本地为主 [root@rsync ~]# ansible 172.165.0.6 -m synchronize -a 'src=/home/zhang/ dest=/tmp/wang/' 案例2:将/home/zhang/目录下的内容推送到远端/tmp/wang/目录下,会把源目录的所有内容都推送到目标目录,内容以本地为主,加delete=yes,会让两个目录保持一致,目标目录中原来的数据也会被删除 [root@rsync ~]# ansible 172.165.0.6 -m synchronize -a 'src=/home/zhang/ dest=/tmp/wang/ delete=yes' 案例3:将远方的文件同步到本地,使用mode选项,但是src就成为了远端服务器的目录,正好相反 [root@rsync zhang]# ansible 172.165.0.6 -m synchronize -a 'dest=/home/zhang/ src=/tmp/wang/ delete=yes mode=pull' (3)参数: delete=yes:使两边的内容一样(以推送方为主) compress=yes:开启压缩,默认为开启 8.2.13 replace模块 这个模块可以说是相当于shell中的sed,我看了下他的光放文档中讲述的参数作用,基本和我的业务不沾边,有一个正则,但是它使用的是Python的正则,现在还不懂,等以后把这个学会了,再弯过来学习这个模块 8.2.14 raw模块 可以使用管道,sed,awk之类的 ansible 192.168.70.78 -m raw -a "chdir=/data ifconfig eth0|head -1|grep Link|awk '{print $1}'" 8.2.15unarchive模块 copy:在解压文件之前,是否先将文件复制到远程主机,默认为yes。若为no,则要求目标主机上压缩包必须存在。 creates:指定一个文件名,当该文件存在时,则解压指令不执行 dest:远程主机上的一个路径,即文件解压的路径 grop:解压后的目录或文件的属组 list_files:如果为yes,则会列出压缩包里的文件,默认为no,2.0版本新增的选项 mode:解决后文件的权限 src:如果copy为yes,则需要指定压缩文件的源路径 owner:解压后文件或目录的属主

#直接传过去的 这个模块可以把压缩文件传输过去,并且传输过去之后解压的目录必须存在 - name: add docker tomcat unarchive: src=/data/scripts/tms/tomcat.tar.gz dest=/data/docker119/ owner=root mode=755 exclude=Documentation

#需要下载的

  • name: Unarchive a file that needs to be downloaded (added in 2.0) unarchive: src: https://example.com/example.zip dest: /usr/local/bin remote_src: yes

分为3种,远端目录有的就设置copy=no,默认为yes,然后如果要从网上下载在传送,写url即可 8.2.16 fetch模块 fetch模块可以把远端服务器的文件拉到本地,并且生成一个以主机名命名的 [root@zabbix-server ~]# ansible test -m fetch -a "src=/etc/fstab dest=/tmp/" 8.2.17 jenkis_job模块

  • name: Test hosts: jenkins tasks:
    • name: Test jenkins_job module jenkins_job: name: '{{project}}' #jenkins job的名字 password: 45ec4d09e9870fd9eea4b92787bb6068 #jenkins server的认证密码 url: http://114.55.227.11:8080 #jenkins server的访问地址 user: jenkins #认证用户 config: "{{ lookup('template', 'config.xml') }}" 8.2.18 supervisor模块
    • name: Start {{project}}0..3 supervisorctl: name="{{item}}" state=started with_items:
      • '{{project}}:0'
      • '{{project}}:1'
      • '{{project}}:2'
      • '{{project}}:3' when: result | failed ignore_errors: True 管理进程用的模块 8.2.19 pause模块 8.2.20debug 当满足条件的时候,可以输出指定的字符串,当不满足条件时,则会跳过,不会输出字符串
  • name: test hosts: self vars: bianliang: '' tasks:
    • name: echo love for vars debug: msg='i love you' when: ansible_os_family =="RedHatiiii"

    • name: mkdir dir file: path=/root/etcd/{{ bianliang }} state=directory

[root@junmpserver etcd]# vim a.yml

  • name: test hosts: self vars: bianliang: '' tasks:
    • name: echo love for vars debug: msg='i love you' when: ansible_os_family =="RedHat"

    • name: mkdir dir file: path=/root/etcd/{{ bianliang }} state=directory 8.2.21jenkins_job模块

  • name: Add jenkins job hosts: jenkins tasks:
    • name: Add jenkins job jenkins_job: name: '{{project}}' password: 45ec4d09e9870fd9eea4b92787bb6068 url: http://114.55.227.11:8080 user: jenkins config: "{{ lookup('template', '/root/playbook/jenkins/config.xml') }}" 8.2.22 wait_for模块 vars: port: []

    • name: port check wait_for: port={{item}} delay=10 timeout=20 with_items:

      • "{{port}}"