云计算运维

Windows Server 2003 - Windows Server 2019 系统工具,Linux系统脚本,Mysql、Nginx、PHP、Redis、K8S、Seafile、Weblogic 、Jenkins、DNS、DHCP、FTP、IIS、Zookeeper、Rabbitmq、Oracle、Tomcat、Mavrn等服务搭建维护,请关注我.

Ansible以及常见模块应用


Playbook介绍

Ansible playbook剧本介绍

  • 在ansible中,类似”脚本”的文件被称作”剧本”,英文名称为’playbook’ ,用于配置,部署,和管理被控节点
  • 我们只需要把模块按照顺序编排在playbook剧本中,ansible就会按照剧本一步一步的执行,最终达到我们的目的
  • playbook是由一个或多个”play”组成的列表,当我们在工作中往往需要不止做一件事情的时候,使用playbook会更加适合。
  • playbook 与ad-hoc相比是一种完全不同的运用方式,剧本需要遵循YAML语法格式编写,文件名以”.yaml”或者”.yml”作为文件名后缀

playbook核心元素

  • hosts:用于指定要执行指定任务(task)的主机,须事先定义在主机清单中
  • tasks:任务集,由模板定义的操作列表
  • variables:内置变量或自定义变量在playbook中调用
  • tempaltes 模板,可替换文件中的变量并实现一些简单逻辑的文件
  • handlers:任务,与tasks不同的是只有在接受到通知(notify)时才会被触发

查看帮助

  • 命令:ansible-doc
  • 常用选项:-l #列出所有模块列表-s #查看模块帮助信息

ansible执行

  • Ansible命令返回值的颜色表示:
    • 绿色:代表对远程节点不进行相应修改,没有发生改变,命令执行成功
    • 黄色:代表对远程节点进行了相应的修改,命令执行成功
    • 红色:代表你的命令执行失败或者是有异常
    • 紫色:代表命令执行后发出的警告信息,给我们一些建议(可以忽略)
  • Ansible执行命令的方式
    • ad-hoc:在命令行执行的命令(临时命令)
    • Playbook:将命令写入到Playbook剧本中
  • playbook结果语法检测及模拟执行
    • 语法检测,--syntax-check 用于检测playbook语法是否正确,如果正确只返回playbook名称
    • 模拟执行,--check 用于模拟执行playbook

定义Ansible主机清单

  • 定义主机清单

[root@ansible-server ~]# cat /home/ruanbo/ansible/hosts 
 [root@ansible-server ansible]# cat hosts 
 192.168.77.130
 
 [test]
 192.168.77.145 ansible_connection=ssh chapass=rb123456
 192.168.77.146
 
 [prod]
 192.168.77.128
 192.168.77.140
 
 [dbserver:children]
 prod
 
 [range]
 192.168.77.[10:15]
 192.168.77.[30:40:3]
 
 [all:vars]
 #是否允许提权
 ansible_become=true
 
 #用户密码及密码
 ansible_ssh_user=ruanbo
 ansible_ssh_pass=123456
  
 
 #提权方式,sudo或su
 ansible_become_method=su
 
 #提权用户及密码
 ansible_become_user=root
 ansible_become_pass=redhat
 
 [test:vars]
 password="123456"

列出主机清单列表

ansible -i hosts all --list-host
 或者
 ansible-inventory -i hosts all --graph

使用ping模块测试主机连通性

 [root@ansible-server ~]# ansible -i hosts all -m ping

Playbook剧本包含内容说明

#使用ping模块测试远程主机联通性,并在远程主机创建目录
 [root@ansible-server ~]# vim ping_test.yml
 ---
 - hosts: test
  remote_user: root
  tasks:
   - name: ping test
     ping:
   - name: mkdir directory test
    shell:
        cmd: mkdir /test
 
 #第一行:playbook剧本以---开头表明yaml格式文件
 #第二行:使用”- “作为开头,”- “表示一个列表项,”- “后面使用hosts关键字指定要操作的主机组名,(注意:横杠后面有空格)表示我要在websrvs这组主机上进行操作,在YAML语法中,键值对需要使用冒号作为分隔,而且冒号后边必须还要有一个空格作为分隔
 #第三行:remote_user关键字可以指定在进行远程操作时使用哪个用户进行操作
 #第四行:tasks关键字是用来指定要执行哪些操作任务,之后的行都属于tasks任务列表中的任务,每个任务都以”- “开头,每个任务都有自己的名字,任务名使用name关键字进行指定

Ansible常用模块介绍

command 模块

  • command模块为默认模块,用于远程执行命令(命令模块)
  • 注意:使用command模块在远程主机中执行命令时,不会经过远程主机的shell处理,在使用command模块时,如果需要执行的命令中含比如”<“, “>”, “|”, “;” 和 “&” 这些符号时,这些符号的功能也会失效
  • 常用参数:
    • chdir:此参数表示执行命令之前,会先进入到指定的目录中
    • creates:此参数表示文件如果存在于远程主机中,则不执行对应命令,如果不存在,才执行
    • removes:此参数表示文件如果不存在于远程主机中,则不执行对应命令,如果存在 ,才执行
  • command模块示例:

 #chdir参数表示执行命令之前,会先进入到指定的目录中
 [root@ansible-server ~]# ansible test -m command -a 'chdir=/root/ ls'  
 
 #creates参数表示如果/etc/passwd文件存在于远程主机中,则不执行对应命令,如果不存在,才执行”touch”命令
 [root@ansible-server ~]# ansible test -m command -a 'creates=/etc/passwd touch /opt/passwd' 
 
 #removes参数表示如果/opt/abc文件不存在,就不执行“mv”命令,如果文件存在则执行“mv”命令
 [root@ansible-server ~]# ansible test -m command -a 'removes=/opt/abc mv /opt/abc /root/'

shell 模块

  • shell 模块,远程执行命令模块,和command模块类似,区别在于shell模块通过/bin/bash程序处理命令
  • 常用参数
    • chdir:此参数表示执行命令之前,会先进入到指定的目录中
    • creates:此参数表示文件如果存在于远程主机中,则不执行对应命令,如果不存在,才执行
    • removes:此参数表示文件如果不存在于远程主机中,则不执行对应命令,如果存在 ,才执行
  • shell 模块示例:

 #查看/etc/passwd文件,并通过管道符传递给“wc -l”统计文件行数
 [root@ansible-server ~]# ansible websrvs -m shell -a 'cat /etc/passwd | wc -l'
 
 #通过chdir参数进入/opt/目录,执行“ls”
 [root@ansible-server ~]# ansible websrvs -m shell -a 'chdir=/opt/ ls'
 
 #查看主机名
 [root@ansible-server ~]# ansible websrvs -m shell -a 'hostname'

script 模块

  • script 模块用于远程执行脚本,脚本存放在ansible主机本地,不需要拷贝到远程主机
  • 常用参数:
    • chdir:此参数表示执行命令之前,会先进入到指定的目录中
    • creates:此参数表示文件如果存在于远程主机中,则不执行对应命令,如果不存在,才执行命令
    • removes:此参数表示文件如果不存在于远程主机中,则不执行对应命令,如果存在 ,才执行命令
  • script模块示例:
#在ansible主机本地编写搭建yum仓库脚本
 [root@ansible-server ~]# vim local_centos7.sh 
 #!/bin/bash
 echo "[local_centos7]
 name=local_centos7
 baseurl=http://192.168.77.130/centos7.9/
 enabled=1
 gpgcheck=0" > /etc/yum.repos.d/local_centos7.repo
 
 #编写playbook文件
 [root@ansible-server ansible]# vim playbook/script.yml 
 ---
 - name: configure local-yum
  hosts: test
  tasks: 
     - name: Run a script with arguments (free form)
      script: /home/ruanbo/ansible/local_centos7.sh 
       
 #执行playbook
 [root@ansible-server ansible]# ansible-playbook playbook/script.yml

yum 模块

  • yum 模块,用于在远程主机通过yum源管理软件包
  • 常用参数:
    • present:此状态为默认值,表示安装软件包
    • installed:此状态表示安装软件包,与present等效
    • latest:此状态表示安装yum中最新版本软件包
    • removed:此状态表示删除对应软件包
    • absent:此状态表示删除对应软件包,与removed等效
    • name:必须参数,用于指定需要管理的软件包名字
    • state:用于指定软件包的状态

yum模块示例:

 #利用ansible实现批量安装软件包
 [root@ansible-server ~]# vim /home/ruanbo/ansible/playbook/yum-install.yml 
 ---
 - name: install packages
  hosts: test
  tasks: 
     - name: ensure a list of packages installed
      yum:
        name: "{{ packages }}"
        state: installed        
      vars:
        packages:
         - httpd
         - httpd-tools
         
 #执行playbook
 [root@ansible-server ansible]# ansible-playbook playbook/yum-install.yml

service 模块

  • service 模块,用于管理远程主机的服务,如:启动或停止服务
  • 常用参数:
    • name:此参数用于指定需要操作的服务名称,如 httpd
    • state:此参数用于指定服务的状态started:此状态用于启动服务restarted:此状态用于重启服务stopped:此状态用于停止服务
    • enabled:此参数用于指定是否将服务设置为开机启动项,设置为yes或者no


#利用ansible实现批量启动web服务并设置开机自启动
[root@ansible-server ansible]# vim playbook/service.yml 
---
- name: manager services
  hosts: test
  tasks: 
    - name: Start service httpd, if not started
      service:
        name: httpd
        state: started
        enabled: yes
        
#执行playbook
[root@ansible-server ansible]# ansible-playbook  playbook/service.yml

copy 模块

  • copy 模块,用于将文件复制到远程主机
  • 常用参数:
    • src:此参数用于指定需要拷贝的文件或目录
    • content:此参数当不使用src指定拷贝的文件时,可以使用content直接指定文件内容,src与content两个参数必有其一
    • dest:此参数用于指定文件将拷贝到远程主机的哪个目录中,dest为必须参数
    • owner:指定文件拷贝到远程主机后的属主
    • group:指定文件拷贝到远程主机后的属组
    • mode:指定文件拷贝到远程主机后的权限
    • force:当远程主机的目标路径中已经存在同名文件,并且与ansible主机中的文件内容不同时,是否强制覆盖
    • backup:当远程主机的目标路径中已经存在同名文件,并且与ansible主机中的文件内容不同时,是否对远程主机的文件进行备份
#利用ansible实现批量下发文件到客户端主机
[root@ansible-server ansible]# vim playbook/copy.yml 
---
- name: copy application
  hosts: test
  tasks: 
    - name: Copy file with owner and permissions
      copy:
        src: /home/ruanbo/ansible/playbook/service.yml
        dest: /tmp/foo.conf
        owner: foo
        group: foo
        mode: '0644'
        backup: yes
#执行playbook
[root@ansible-server ansible]# ansible-playbook playbook/copy.yml

fetch 模块

  • fetch模块,从远程主机获取文件到ansible管理节点
  • 常用参数:
    • src:指定从受管主机中拉取哪个文件
    • dest:指定拉取文件到本地以后文件存放的位置

#利用ansible实现批量拉取客户端主机文件到ansible管理节点
[root@ansible-server ansible]# cat playbook/fetch.yml 
---
- name: fetch file
  hosts: test
  tasks: 
    - name: Specifying a path directly
      fetch:
        src: /tmp/test
        dest: /tmp/test-{{ inventory_hostname }}
        
#执行playbook
[root@ansible-server ansible]# ansible-playbook playbook/fetch.yml

user 模块

  • user 模块,用于管理用户,如用户的创建及删除
  • 常用参数:
    • name:需要用于被操作的对象用户名称
    • password:用户密码,需要通过hash加密
    • remove:是否删除一个用户

#利用ansible实现批量创建用户并设置密码
[root@ansible-server ansible]# cat playbook/useradd.yml 
---
- name: add user
  hosts: test
  tasks: 
    - name: Add the user 'johnd' with a specific uid and a primary group of 'admin'
      user:
        name: johnd
        password: "{{'123456' | password_hash('sha512')}}"

#执行playbook
[root@ansible-server ansible]# ansible-playbook playbook/useradd.yml

lineinfile 模块

  • lineinfile 模块,常用于对文件的行替换、插入、删除
  • 常用参数:
    • path:指定要操作的文件对象
    • line:要写入文件的内容
    • regexp:匹配条件
    • insertbefore:在某行之前插入
    • insertafter:在某行之后插入
    • backup: 执行配置任务前是否先进行备份,yes|no

#利用ansible实现批量修改配置文件,包括管理selinux,配置hosts解析,修改web服务端口
[root@ansible-server ansible]# vim playbook/chage_config.yml 
---
- name: change config
  hosts: test
  tasks: 
    - name: Ensure SELinux is set to enforcing mode
      lineinfile:
        path: /etc/selinux/config
        regexp: '^SELINUX='
        line: SELINUX=enforcing
    
    - name: Replace a localhost entry with our own
      lineinfile:
        path: /etc/hosts
        regexp: '^127\.0\.0\.1'
        line: 127.0.0.1 localhost
        owner: root
        group: root
        mode: '0644'
    
    - name: Ensure the default Apache port is 8080
      lineinfile:
        path: /etc/httpd/conf/httpd.conf
        regexp: '^Listen '
        insertafter: '^#Listen '
        line: Listen 8080
      notify: restart httpd
  handlers: 
    - name: restart httpd
      service:
        name: httpd
        state: restarted
#执行playbook
[root@ansible-server ansible]# ansible-playbook playbook/chage_config.yml

yum_repository模块

  • yum_repository模块:管理yum仓库
  • 常用参数:
    • name:指定唯一的仓库ID
    • baseurl:指定yum仓库repodata目录的URL,可以是多个,如果设置为多个,需要使用"metalink"和"mirrorlist"参数
    • enabled:使用此yum仓库
    • gpgcheck:是否对软件包执行gpg签名检查
    • gpgkey:gpg秘钥的URL
    • mode:权限设置
    • state:状态,默认的present为安装此yum仓库,absent为删除此yum仓库
    • description:设置仓库的注释信息

#利用ansible实现批量配置yum源
[root@ansible-server ansible]# vim playbook/yum_repository.yml
---
- name: add yum repodata
  hosts: test
  tasks: 
    - name: Add repository
      yum_repository:
        name: yumlocal
        description: EPEL YUM repo
        baseurl: https://download.fedoraproject.org/pub/epel/$releasever/$basearch/
        gpgcheck: no
        enabled: yes

#执行playbook
[root@ansible-server ansible]# ansible-playbook playbook/yum_repository.yml

file模块

  • file模块,创建或者和删除远程主机上的文件或者目录
  • 常用参数:
    • path:用于指定要操作的文件或目录
    • mode:设置文件属性
    • owner:所有者
    • group:所属组
    • recurse:当文件为目录时,是否进行递归设置权限
    • state:touch :创建文件directory:创建目录absent:删除文件或者目录或者链接文件link或hard:创建链接文件

#利用ansible实现批量创建文件
[root@ansible-server ansible]# vim playbook/file.yml 
---
- name: mkdir dir
  hosts: test
  tasks: 
    - name: Create a directory if it does not exist
      file:
        path: /tmp/test/test/
        state: directory
        mode: '0750'
        recurse: yes
        owner: ruanbo
        group: ruanbo
#执行playbook
[root@ansible-server ansible]# ansible-playbook playbook/file.yml

cron模块

  • cron模块,用于管理远程主机中的计划任务
  • 常用参数:
    • name:此参数用于设置计划任务的名称,计划任务的名称会在注释中显示
    • job:此参数用于指定计划的任务中需要实际执行的命令或者脚本
    • user:此参数用于设置当前计划任务属于哪个用
    • state参数:当计划任务有名称时,可以根据名称修改或删除对应的任务
    • minute:此参数用于设置计划任务中分钟设定位的值,默认值为”*”
    • hour:此参数用于设置计划任务中小时设定位的值,默认值为”*”
    • day:此参数用于设置计划任务中日设定位的值,默认值为”*”
    • month:此参数用于设置计划任务中月设定位的值,默认值为”*”
    • weekday:此参数用于设置计划任务中周几设定位的值,默认值为”*”

#利用ansible实现批量为指定用户创建定时任务
[root@ansible-server ansible]# cat playbook/cron.yml 
---
- name: configure cron
  hosts: test
  tasks: 
    - name: date >> /tmp/datetime
      cron:
        name: "check dirs"
        minute: "*/1"
        job: "date >> /tmp/datetime"
        user: ruanbo
        
#执行playbook
[root@ansible-server ansible]# ansible-playbook playbook/cron.yml

多任务应用场景举例

利用Playbook源码部署Nginx的Web服务


[root@ansible-server ~]# vim nginx.yml
---
- hosts: websrvs
  remote_user: root
  tasks:
  - name: Copy nginx
    copy: src=/root/nginx-1.18.0.tar.gz  dest=/tmp
  - name: install Rely
    yum: name=gcc,pcre-devel,openssl-devel,zlib
  - name: unpacek nginx
    shell: tar -xf /tmp/nginx-1.18.0.tar.gz -C /tmp
  - name: install nginx
    shell:  cd /tmp/nginx-1.18.0 && ./configure && make && make install
  - name: Copy index.html
    copy: src=/root/index.html dest=/usr/local/nginx/html
  - name: start nginx
    shell: /usr/local/nginx/sbin/nginx

利用Playbook安装http应用并启动服务

[root@ansible-server ansible]# vim playbook/httpd.yml 
---
- name: install httpd and start httpd
  hosts: test
  tasks: 
    - name: install httpd
      yum:
        name: "{{ packages }}"
        state: installed
      vars:
        packages:
        - httpd
        - httpd-tools
    - name: Start service httpd, if not started
      service:
        name: httpd
        state: started
        enabled: yes
        
#执行playbook        
[root@ansible-server ansible]# ansible-playbook playbook/httpd.yml
  • 分享:
评论
还没有评论
    发表评论 说点什么