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

 

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

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

Ansible工做原理:nginx

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

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

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

Ansible配置文件:shell

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

Ansible免密登录:数据库

ansible使用ssh登陆,因此要在二者之间配置秘钥登陆,这样才能开始正常的工做apache

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与其余节点之间的链接ubuntu

介绍一下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

http://www.javashuo.com/article/p-vffgbsgc-ds.html

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

相关文章
相关标签/搜索