10.Python之Ansible自动化运维常用模块

 

Ansible中文权威文档:http://www.ansible.com.cn/docs/

Ansible从入门到精通:https://www.bilibili.com/video/av33611758/?p=1

Ansible工作原理:

1.管理端支持local 、ssh、zeromq 三种方式连接被管理端,默认使用基于ssh的连接

2.可以按应用类型等方式进行Host Inventory(主机群)分类,管理节点通过各类模块实现相应的操作---单个模块,单条命令的批量执行,我们可以称之为ad-hoc;

3.管理节点可以通过playbooks 实现多个task的集合实现一类功能,如web服务的安装部署、数据库服务器的批量备份等。playbooks我们可以简单的理解为,系统通过组合多条ad-hoc操作的配置文件 。

Ansible配置文件:

/etc/ansible/ansible.cfg 主配置文件,配置ansible工作特性
/etc/ansible/hosts 主机清单
/etc/ansible/roles/ 存放角色的目录

Ansible免密登陆:

ansible使用ssh登录,所以要在两者之间配置秘钥登录,这样才能开始正常的工作

ssh-keygen -t rsa -P ""      #生成秘钥/root/.ssh/id_rsa.pub
ssh
-copy-id -i ./.ssh/id_rsa.pub root@192.168.0.1 #将公钥传到192.168.0.1上

其中192.168.0.1是要被监控的机器

实现了master与其他节点之间的连接

介绍一下Ansible命令:

  • 功能:通过ssh实现配置管理、应用部署、任务执行等功能

  • 建议:配置ansible端能基于密钥认证的方式联系各被管理节点

  • 格式:ansible <host-pattern>  [-m module_name]  [-a args]

  • 常用选项:
-m MODULE_NAME, --module-name=MODULE_NAME     要执行的模块,默认为 command  
-a MODULE_ARGS, --args=MODULE_ARGS      模块的参数  
-u REMOTE_USER, --user=REMOTE_USER ssh      连接的用户名,默认用 root,ansible.cfg 中可以配置
-k, --ask-pass      提示输入 ssh 登录密码,当使用密码验证登录的时候用     
-s, --sudo      sudo 运行
-U SUDO_USER, --sudo-user=SUDO_USER     sudo 到哪个用户,默认为 root
-K, --ask-sudo-pass     提示输入 sudo 密码,当不是 NOPASSWD 模式时使用
-B SECONDS, --background=SECONDS       run asynchronously, failing after X seconds(default=N/A)
-P POLL_INTERVAL, --poll=POLL_INTERVAL      set the poll interval if using
-B (default=15)
-C, --check     只是测试一下会改变什么内容,不会真正去执行
-c CONNECTION   连接类型(default=smart)
-f FORKS, --forks=FORKS     fork 多少个进程并发处理,默认 5
-i INVENTORY, --inventory-file=INVENTORY      指定hosts文件路径默认 default =/etc/ansible/hosts
-l SUBSET, --limit=SUBSET       指定一个 pattern,对<host_pattern>已经匹配的主机中再过滤一次
--list-hosts        只打印有哪些主机会执行这个 playbook 文件:不是实际执行该 playbook
-M MODULE_PATH, --module-path=MODULE_PATH       要执行的模块的路径,默认为/usr/share/ansible/
-o, --one-line      压缩输出,摘要输出
--private-key=PRIVATE_KEY_FILE      私钥路径
-T TIMEOUT, --timeout=TIMEOUT   ssh 连接超时时间,默认 10-t TREE, --tree=TREE            日志输出到该目录,日志文件名会以主机名命名
-v, --verbose   verbose mode (-vvv for more, -vvvv to enable connection debugging)

这里主要讲一下<host-pattern>的匹配规则:

ALL 表示列表中的所有主机 例:ansible all -m ping #匹配所有主机 

* 支持通配符
例: ansible "*" -m ping #匹配所有主机
ansible 192.168.1.* -m ping #匹配IP地址以192.168.1开头的主机
ansible “*srvs” -m ping # 匹配分组名 以 srvs结尾的主机

逻辑或:只要存在websrvs或appsrvs组中的主机
例: ansible “websrvs:appsrvs” -m ping
ansible “192.168.1.10:192.168.1.20” -m ping

逻辑与:同时在websrvs组和dbsrvs组中的主机
ansible “websrvs:&dbsrvs” -m ping

逻辑非:在websrvs组,但不在dbsrvs组中的主机
ansible ‘websrvs:!dbsrvs’ -m ping

综合逻辑:ansible ‘websrvs:dbsrvs:&appsrvs:!ftpsrvs’ -m -ping

正则表达式:ansible “websrvs:&dbsrvs” -m ping ansible “~(web|db).*\.magedu\.com” -m ping

Ansible执行命令过程:

  • 加载自己的配置文件 默认/etc/ansible/ansible.cfg
  • 加载自己对应的模块文件,如command
  • 通过ansible将模块或命令生成对应的临时py文件,并将该文件传输至远程服务器的对应执行用户
  • $HOME/.ansible/tmp/ansible-tmp-数字/XXX.PY文件
  • 给文件+x执行
  • 执行并返回结果
  • 删除临时py文件,sleep 0退出

Ansible命令工具:

  • ansible主程序,临时命令执行工具
  • ansible-doc 查看配置文档,模块功能查看工具
  • ansible-galaxy 下载/上传优秀代码或Roles模块的官网平台
  • ansible-playbook 定制自动化任务,编排剧本工具
  • ansible-pull 远程执行命令的工具
  • ansible-vault 文件加密工具
  • ansible-console 基于Console界面与用户交互的执行工具

Ansible常用模块:

ansible 默认提供了很多模块来供我们使用。在 Linux 中,我们可以通过 ansible-doc -l 命令查看到当前 ansible 都支持哪些模块,通过 ansible-doc -s 模块名 又可以查看该模块有哪些参数可以使用。

这里主要介绍Ansible常用模块:

ping 模块
yum 模块
copy 模块
file 模块
service 模块
user 模块
group模块
cron 模块
template 模块
setup 模块
fetch 模块
apt 模块
command 模块
shell 模块
script 模块

1.ping模块

检查指定节点机器是否还能连通,用法很简单,不涉及参数,主机如果在线,则回复pong

ansible <host-pattern> -m ping

<host-pattern>匹配规则参考上面

2.yum 安装包模块

yum安装vsftpd包:(默认state=installd) ansible all -m yum -a 'name=vsftpd' 

安装多个包用逗号隔开: ansible all -m yum -a 'name=vsftpd,httpd'

显示所有已安装的包: ansible all -m yum -a 'name=vsftpd list=installd'

卸载vsftpd包: ansible all -m yum -a 'name=vsftpd state=removed'

安装从互联网下载的包: ansible srv -m copy -a 'src=/root/package.rpm dest=/data/package' ansible srv -m yum -a 'name=/data/package.rpm'

更新缓存: ansible srv -m yum -a 'update_cache=yes'


更新缓存同时安装dstat包 ansible srv -m yum -a 'name=dstat update_cache=yes'

参数详解:

- config_file:yum的配置文件 (optional)

- disable_gpg_check:关闭gpg_check (optional)

- disablerepo:不启用某个源 (optional)

- enablerepo:启用某个源(optional)

- name:要进行操作的软件包的名字,默认最新的程序包,指明要安装的程序包,可以带上版本号,也可以传递一个url或者一个本地的rpm包的路径

- state:状态(present,absent,latest),表示是安装还卸载
       present:默认的,表示为安装
       lastest: 安装为最新的版本
       absent:表示删除

3.copy 复制文件模块

ansible srv -m copy -a "src=/root/f1.sh dest=/tmp/f2.sh mode=600 backup=yes"
如目标存在,默认覆盖,此处指定先备份

ansible srv -m copy -a "content='test content\n' dest=/tmp/f1.txt"
利用内容,直接生成目标文件

参数详解:

- update_cache: 更新缓存

- name: 要创建的文件名字

- state: 状态(present,absent,latest),表示是安装还卸载
   present:默认的,表示为安装
   lastest: 安装为最新的版本
   absent:表示删除
- mode: 目标文件的权限模式,模式可以被指定为符号模式(例如,u + rwx 或 u = rw,g = r,o = r)

- backup: 如果原目标文件存在,则先备份目标文件

- force: 是否强制覆盖,默认为yes

- owner: 目标文件属主

- group: 目标文件属组

4.file 文件操作模块

创建新文件:
ansible all -m file -a 'name=/data/f3 state=touch'

删除文件:
ansible all -m file -a 'name=/data/f3 state=absent'

创建目录:
ansible all -m file -a 'name=/data/dir1 state=directory'

删除目录:
ansible all -m file -a 'name=/data/dir1 state=absent'

创建软连接:
ansible all -m file -a 'src=/etc/fstab dest /data/fstab.link state=link'

删除软连接:
ansible all -m file -a 'dest /data/fstab.link state=absent'

创建文件指定所有者,权限:
ansible srv -m file -a "path=/root/a.sh owner=wang mode=755"
ansible web -m file -a  'src=/app/testfile dest=/app/testfile-link state=link'

参数详解:

- force:需要在两种情况下强制创建软链接,一种是源文件不存在但之后会建立的情况下;另一种是目标软链接已存在,需要先取消之前的软链,然后创建新的软链,有两个选项:yes|no

- group:定义文件/目录的属组

- mode:定义文件/目录的权限

- owner:定义文件/目录的属主

- path:必选项,定义文件/目录的路径

- recurse:递归的设置文件的属性,只对目录有效

- src:要被链接的源文件的路径,只应用于state=link的情况

- dest:被链接到的路径,只应用于state=link的情况

- state:
   directory:如果目录不存在,创建目录
   file:即使文件不存在,也不会被创建
   link:创建软链接
   hard:创建硬链接
   touch:如果文件不存在,则会创建一个新的文件,如果文件或目录已存在,则更新其最后修改时间
   absent:删除目录、文件或者取消链接文件

5.service 管理服务模块

停止httpd服务: ansible srv -m service -a 'name=httpd state=stopped' 

开启httpd服务: ansible srv -m service -a 'name=httpd state=started’

重新加载httod服务: ansible srv -m service -a 'name=httpd state=reloaded’

重启httpd服务: ansible srv -m service -a 'name=httpd state=restarted’

开启ftp服务,同时设置开机自动启动: ansible srv -m service -a 'name=vsftpd state=started enabled=yes’

重启ftp服务: ansible srv -m service -a 'name=vsftpd state=restarted'

参数详解:

- arguments:给命令行提供一些选项

- enabled:是否开机启动 yes|no, 要求状态(state)和启用(enabled)中至少有一个。

- name:必选项,服务名称

- runlevel:运行级别

- sleep:如果执行了restarted,在则stop和start之间沉睡几秒钟

- state:对当前服务执行启动,停止、重启、重新加载等操作(started,stopped,restarted,reloaded)

6.user 管理用户模块

添加用户,指定uid、家目录、主组及注释: ansible srv -m user -a 'name=user1 comment="test user" uid=2048 home=/app/user1 group=root'

添加一个系统用户: ansible srv -m user -a 'name=sysuser1 system=yes home=/app/sysuser1' 

删除用户: ansible srv -m user -a 'name=user1 state=absent' 

添加一个nginx用户: ansible srv -m user -a 'name=nginx shell=/sbin/nologin system=yes home=/var/nginx groups=root,bin uid=80 comment="nginx service" 

删除nginx用户,同时删除家目录: ansible srv -m user -a 'name=nginx state=absent remove=yes'

参数详解:

- home:指定用户的家目录,需要与createhome配合使用。

- groups:指定用户的属组。

- uid:指定用的uid。

- password:指定用户的密码。
注意:指定password参数时,不能使用明文密码,因为后面这一串密码会被直接传送到被管理主机的/etc/shadow文件中,所以需要先将密码字符串进行加密处理。然后将得到的字符串放到password中即可。

- name:指定用户名。

- createhome:是否创建家目录 yes|no。

- system:是否为系统用户。

- remove:当state=absent时,remove=yes则表示连同家目录一起删除,等价于userdel -r。

- state:是创建还是删除。(present,absent)

- shell:指定用户的shell环境。

- generate_ssh_key:是否为相关用户生成SSH密钥。 这不会覆盖现有的SSH密钥。

- ssh_key_bits:可选择指定要创建的SSH密钥中的位数。

- ssh_key_passphrase:设置SSH密钥的密码。 如果没有提供密码,SSH密钥将默认没有密码。

- ssh_key_file:指定SSH密钥文件名(可选)。 如果这是一个相对的文件名,那么它将是相对于用户的主目录。

- ssh_key_type:指定要生成的SSH密钥的类型(可选)。 可用的SSH密钥类型将取决于目标主机上的实现。

7.group管理组模块

创建一个系统组: ansible srv -m group -a "name=testgroup system=yes"

删除一个组: ansible srv -m group -a "name=testgroup state=absent"

创建nginx组: ansible srv -m group -a 'name=nginx system=yes gid=80'

删除nginx组: ansible srv -m group -a 'name=nginx state=absent'

参数详解:

- gid:指定用的gid。

- name:指定用户名。

- state:是创建还是删除。(present,absent)

- system:如果是,则表示创建的组是系统组。

8.cron 计划任务模块

支持时间:minute,hour,day,month,weekday

创建计划任务:每周1,3,5,每分钟打印,任务名称:warningcron 
ansible all -m cron -a 'minute=* weekday=1,3,5 job="/usr/bin/wall FBI warning" name=warningcron'

注释cronname=waringcron的计划任务:
ansible all -m cron -a 'disabled=true job="/usr/bin/wall FBI warning" name=warningcron'

给cronname=waringcron的计划任务去掉注释:
ansible all -m cron -a 'disabled=true job="/usr/bin/wall FBI warning" name=warningcron'

创建计划任务:每五分钟同步一次服务器时间,任务名称:syntime
ansible srv -m cron -a "minute=*/5 job='/usr/sbin/ntpdate 172.16.0.1 &>/dev/null' name=Synctime"

删除计划任务:Synctime
ansible srv -m cron -a 'state=absent name=Synctime'

9.template模块

基于模板方式生成一个文件复制到远程主机(template使用Jinjia2格式作为文件模版,进行文档内变量的替换的模块。它的每次使用都会被ansible标记为”changed”状态。)

参数详解:

- backup: 如果原目标文件存在,则先备份目标文件

- src:在ansible控制器上的Jinja2格式化模板的路径。 这可以是相对或绝对的路径。

- dest:将模板渲染到远程机器上的位置。

- force:是否强制覆盖,默认为yes

- owner:目标文件属主

- group:目标文件属组

- mode:目标文件的权限模式,模式可以被指定为符号模式(例如,u + rwx或u = rw,g = r,o = r)。

10.setup模块

收集指定服务器的信息,每个被管理节点在接收并运行管理命令之前,会将自己主机相关信息,如操作系统版本、IP地址等报告给远程的ansbile主机。在playbooks里经常会用到的一个参数gather_facts就与该模块相关。setup模块下经常使用的一个参数是filter参数,具体使用示例如下:

ansible all -m setup -a "filter=ansible_os_family"

这里给出filter常用可选项:

ansible_all_ipv4_addresses:仅显示ipv4的信息

ansible_devices:仅显示磁盘设备信息

ansible_distribution:显示是什么系统,例:centos,suse等

ansible_distribution_major_version:显示是系统主版本

ansible_distribution_version:仅显示系统版本

ansible_machine:显示系统类型,例:32位,还是64位

ansible_eth0:仅显示eth0的信息

ansible_hostname:仅显示主机名

ansible_kernel:仅显示内核版本

ansible_lvm:显示lvm相关信息

ansible_memtotal_mb:显示系统总内存

ansible_memfree_mb:显示可用系统内存

ansible_memory_mb:详细显示内存情况

ansible_swaptotal_mb:显示总的swap内存

ansible_swapfree_mb:显示swap内存的可用内存

ansible_mounts:显示系统磁盘挂载情况

ansible_processor:显示cpu个数(具体显示每个cpu的型号)

ansible_processor_vcpus:显示cpu个数(只显示总的个数)

ansible_python_version:显示python版本

11.fetch 从客户端取文件至服务器端

ansible srv -m fetch -a 'src=/root/a.sh dest=/data/scripts'

例: 打包 /var/log 下所有日志文件并远程抓取

  ansible all -m shell -a 'tar Jcf log.tar.xz /var/log/*.log'

  ansible all -m fetch -a 'src=/root/log.tar.xz dest=/data'

常用参数:

- src:远程系统上要获取的文件。 这必须是一个文件,而不是一个目录。 后续版本可能会支持递归提取。

-dest:保存文件的目录。 例如,如果dest目录是/backup,在主机host.example.com上命名为/ etc/profile的src文件将被保存到/backup/host.example.com/etc/profile。

- flat:允许您覆盖将目标文件添加到主机名/ path / to / file的默认行为。

12.apt安装包模块

# 在安装foo软件包前更新然后安装foo 
- apt: name=foo update_cache=yes
# 移除foo软件包
-
apt: name=foo state=absent
# 安装foo软件包
- apt: name=foo state=present
# 安装foo
1.0软件包
- apt: name=foo=1.00 state=present
# 安装nginx最新的名字为squeeze
-backport发布包,并且安装前执行更新
- apt: name=nginx state=latest default_release=squeeze-backports update_cache=yes
# 只下载openjdk
-6-jdk最新的软件包,不安装
- apt: name=openjdk-6-jdk state=latest install_recommends=no
# 安装所有软件包到最新版本
- apt: upgrade=dist
# 更新apt
-get的list
- apt: update_cache=yes
# 3600秒后停止update_cache
- apt: update_cache=yes cache_valid_time=3600
# 安装远程节点上的
/tmp/mypackage.deb软件包
- apt: deb=/tmp/mypackage.deb

参数详解:

- deb: 用于安装远程机器上的.deb后缀的软件包(optional)

- install_recommends:这个参数可以控制远程电脑上是否只是下载软件包,还是下载后安装,默认参数为true,设置为false的时候只下载软件包,不安装

- update_cache: 当这个参数为yes的时候等于apt-get update(optional)

- name: apt要下载的软件包名字,支持name=git=1.6 这种制定版本的模式

- state:状态(present,absent,latest),表示是安装还卸载
   present:默认的,表示为安装
   lastest: 安装为最新的版本
   absent:表示删除

13.command模块

command 模块可以帮助我们在远程主机上执行命令,默认模块,可忽略-m选项

ansible srvs -m command -a 'service vsftpd start'

注意:

  • 使用 command 模块在远程主机中执行命令时,不会经过远程主机的 shell 处理。
  • 在使用 command 模块时,如果需要执行的命令中含有重定向、管道符等操作时,这些符号也会失效,比如 "<" , ">", "|", ";" 和 "&"这些符号,如果你需要这些功能,可以参考后面介绍的 shell 模块。
  • 如果远程节点是 windows 操作系统,则需要使用 win_command 模块

14.shell模块,和command相似,用shell执行命令

ansible srv -m shell -a 'echo magedu |passwd –stdin wang'

shell 模块可以帮助我们在远程主机上执行命令。与 command 模块不同的是,shell 模块在远程主机中执行命令时,会经过远程主机上的 /bin/sh 处理。

使用 shell 模块可以在远程服务器上执行命令,它支持管道与重定向等符号

15.script模块

script 模块可以帮助我们在远程主机上执行 ansible 管理主机上的脚本,也就是说,脚本一直存在于 ansible 管理主机本地,不需要手动拷贝到远程主机后再执行。

------------------------------------------

一些简单的playbook:

1.安装apache服务

- hosts: ubuntu
   sudo: yes 
   tasks:
    - name: 安装apache 服务
      apt: pkg=apache2 state=installed
    - name: 推送默认的配置
      copy: src=files/awesome-app dest=/etc/apache2/sites-available/awesome-app mode=0640 
    - name: 创建文档根目录
      file: dest=/var/www/awesome-app state=directory
    - name: 移除默认的虚拟主机
      file: dest=/etc/apache2/sites-available/000-default.conf state=absent
      notify:
        - restart apache

   handlers:
    - name: restart apache
      service: name=apache2 state=restarted

运行命令:

 ansible-playbook config.yml -K

2.安装nginx服务

- hosts: ubuntu #这个是你选择的主机
#这个是变量
  vars:
    work_user: www-data
    worker_processes: 2
#sudo方式运行
  sudo: yes
  tasks:
#利用apt模块来操作
  - name: ensure nginx is installed
    apt: pkg=nginx state=installed
  - name: write the nginx config file
    template: src=templates/nginx.j2 dest=/etc/nginx/nginx.conf
#触发重启服务器
    notify:
    - restart nginx
  - name: ensure nginx is running
    service: name=nginx state=started
#这里的restart nginx 和上面的触发是配对的。这就是handlers的作用。
  handlers:
    - name: restart nginx
      service: name=nginx state=restarted

3.根据操作系统判断

- hosts: ubuntu
  sudo: yes
  vars:
    epic: true
  tasks:
     - name: 如果是ubuntu
       shell: 'touch /tmp/ubuntu.txt'
       when: ansible_os_family == 'Debian'
     - name: 输出
       shell: echo "aaa" > /tmp/aaa.txt
       when: epic
     - name:  安装ntp 在debian上
       apt: name=ntp state=installed
       when: ansible_os_family == 'Debian'
     - name:  安装ntp 在RedHat上
       yum: name=ntp state=installed
       when: ansible_os_family == 'RedHat'

 

 

参考链接:

https://blog.csdn.net/lv8549510/article/details/80849326

https://www.cnblogs.com/qige2017/p/7906374.html

https://www.jianshu.com/p/f61fe86a18ed

posted @ 2019-04-12 10:26  bmjoker  阅读(...)  评论(... 编辑 收藏