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

网友投稿 1059 2022-10-16

本站部分文章、图片属于网络上可搜索到的公开信息,均用于学习和交流用途,不能代表睿象云的观点、立场或意见。我们接受网民的监督,如发现任何违法内容或侵犯了您的权益,请第一时间联系小编邮箱jiasou666@gmail.com 处理。

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

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.pubssh-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   [-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,对已经匹配的主机中再过滤一次--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)

这里主要讲一下的匹配规则:

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 -m ping

匹配规则参考上面

2.yum 安装包模块

参数详解:

- 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: 要创建的文件名字

- 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 管理服务模块

参数详解:

- 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:目标文件属组

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'

参考链接:

上一篇:Nginx/Apache之伪静态设置 - 运维小结
下一篇:Keepalived基础知识-运维小结
相关文章

 发表评论

暂时没有评论,来抢沙发吧~