Ansible常用模块的介绍和使用
发表于:2024-11-27 作者:千家信息网编辑
千家信息网最后更新 2024年11月27日,这篇文章为大家分享Ansible常用模块的介绍和使用。文章涵盖inventory主机清单、YAML语言介绍、实现playbook剧本等内容,希望大家通过这篇文章能有所收获。inventory主机清单a
千家信息网最后更新 2024年11月27日Ansible常用模块的介绍和使用
这篇文章为大家分享Ansible常用模块的介绍和使用。文章涵盖inventory主机清单、YAML语言介绍、实现playbook剧本等内容,希望大家通过这篇文章能有所收获。
inventory主机清单
ansible默认的主机清单是/etc/ansible/hosts文件,主机清单可以手动设置,也可以通过Dynamic Inventory动态生成,一般主机名使用FQDN
vim /etc/ansible/hosts[webserver] #方括号设置组名www1.example.org #定义被监控主机,这边可以是主机名也可以是IP地址,主机名需要修改/etc/hosts文件www2.example.org:2222 #冒号后定义远程连接端口,默认是ssh的22端口
如果是名称类似的主机,可以使用列表的方式标识各个主机
[webserver]www[01:50].example.org ansible_ssh_user=root ansible_ssh_pass=123456[dbbservers]db-[a:f].example.org
inventory变量
- 主机变量
[webserver]www1.magedu.com http_port=80 maxRequestsChild=808www2.magedu.com http_port=8080 maxRequestsChild=909
- 组变量
[servers:vars]ntp_server=ntp.example.orgnfs_server=nfs.example.org
- 组嵌套
[apache]http1.example.orghttp2.example.org[nginx]ngx1.example.orgngx2.example.org[webservers:children]apachenginx
- inventory变量参数
参数 | 说明 |
---|---|
ansible_ssh_host | 将要连接的远程主机名.与你想要设定的主机的别名不同的话,可通过此变量设置 |
ansible_ssh_port | ssh端口号.如果不是默认的端口号,通过此变量设置 |
ansible_ssh_user | 默认的 ssh 用户名 |
ansible_ssh_pass | ssh 密码(这种方式并不安全,我们强烈建议使用 --ask-pass 或 SSH 密钥) |
ansible_ssh_private_key_file | ssh 使用的私钥文件.适用于有多个密钥,而你不想使用 SSH 代理的情况 |
ansible_ssh_common_args | 此设置附加到sftp,scp和ssh的缺省命令行 |
ansible_sftp_extra_args | 此设置附加到默认sftp命令行 |
ansible_scp_extra_args | 此设置附加到默认scp命令行 |
ansible_ssh_extra_args | 此设置附加到默认ssh命令行 |
ansible_ssh_pipelining | 确定是否使用SSH管道. 这可以覆盖ansible.cfg中得设置 |
ansible_shell_type | 目标系统的shell类型.默认情况下,命令的执行使用 'sh' 语法,可设置为 'csh' 或 'fish' |
ansible_python_interpreter | 目标主机的 python 路径.适用于的情况: 系统中有多个 Python, 或者命令路径不是"/usr/bin/python",比如 *BSD, 或者 /usr/bin/python |
ansible_*_interpreter | 这里的"*"可以是ruby 或perl 或其他语言的解释器,作用和ansible_python_interpreter 类似 |
ansible_shell_executable | 这将设置ansible控制器将在目标机器上使用的shell,覆盖ansible.cfg中的配置,默认为/bin/sh |
YAML标记语言
YAML:另一种标记语言。是用来写配置文件的语言,非常简洁和强大。YAML语法和其他语言类似,也可以表达散列表、标量等数据结构。结构通过空格来展示;序列里配置项通过-来代表;Map里键值用:来分隔;YAML的扩展名为yaml
基本语法规则
1.大小写敏感2.使用缩进表示层级关系3.缩进时不允许使用Tab键,只允许使用空格。4.缩进的空格数目不重要,只要相同层级的元素左侧对齐即可
- YAML支持的数据结构
1.对象:键值对的集合,又称为映射(mapping)/ 哈希(hashes) / 字典(dictionary)例如:name:Example Developer 键 值2.数组:一组按次序排列的值,又称为序列(sequence) / 列表(list)例如:-Apple -Orange3.纯量:单个的、不可再分的值例如:number:12.30 sure:true
yaml实例:
name:zhangsanage:20name:lisiage:22people:
-name:zhangsan age:20 -name:lisi age:22
Ansible剧本-playbook
Playbook是一种完全不同的运用ansible的方式,类似与saltstack的state状态文件。ad-hoc无法持久使用,playbook可以持久使用。playbook是由一个或多个play组成的列表,play的主要功能在于将事先归并为一组的主机装扮成事先通过ansible中的task定义好的角色。从根本上来讲,所谓的task无非是调用ansible的一个module。将多个play组织在一个playbook中,即可以让它们联合起来按事先编排的机制完成某一任务。通过task调用ansible的模板将多个play组织在一个playbook中运行。
Playbook核心元素
名称 | 含义 |
---|---|
Hosts | 执行的远程主机列表 |
Tasks | 任务集,即调用模块完成的某操作 |
Varniables | 变量,内置变量或自定义变量在playbook中调用 |
Templates | 模板,即使用模板语法的文件,比如配置文件等 |
Handlers | 处理器,和notity结合使用,由特定条件触发的操作,满足条件方才执行,否则不执行 |
tags | 标签,指定某条任务执行,用于选择运行playbook中的部分代码 |
Roles | 角色 |
Playbook语法
1、playbook使用yaml语法格式,后缀可以是yaml,也可以是yml。在单一的一个playbook文件中,可以连续三个连子号(---)区分多个play。还有选择性的连续三个点好(...)用来表示play的结尾,也可省略。2、当行开始正常写playbook的内容,一般都会写上描述该playbook的功能。3、使用#号注释代码。4、缩进必须统一,不能空格和tab混用。缩进的级别也必须是一致的,同样的缩进代表同样的级别,程序判别配置的级别是通过缩进结合换行实现的。5、YAML文件内容和Linux系统大小写判断方式保持一致,是区分大小写的,k/v的值均需大小写敏感6、k/v的值可同行写也可以换行写。同行使用:分隔。v可以是个字符串,也可以是一个列表7、一个完整的代码块功能需要最少元素包括 name: task
实例演示:
vim a.yaml- hosts: webserver #定义的主机组,即应用的主机 vars: #定义变量 http_port: 80 max_clients: 200 user: root tasks: #执行的任务 - name: ensure apache is at the latest version yum: pkg=httpd state=latest - name: write the apache config file template: src=/srv/httpd.j2 dest=/etc/httpd.conf notify: - restart apache - name: ensure apache is running service: name=httpd state=started handlers: #处理器 - name: restart apache service: name=httpd state=restarted
- 执行一个playbook的格式
ansible-playbook [yaml文件名]
实例演示:
#执行剧本ansible-playbook ping.yaml
参数:
-k(-ask-pass) 用来交互输入ssh密码-K(-ask-become-pass) 用来交互输入sudo密码-u 指定用户
补充命令:
#检查yaml文件的语法是否正确ansible-playbook nginx.yaml --syntax-check#检查tasks任务ansible-playbook nginx.yaml --list-task#检查生效的主机ansible-playbook nginx.yaml --list-hosts#指定从某个task开始运行ansible-playbook nginx.yaml --start-at-task='Copy Nginx.conf'
hosts和users介绍
实例演示:
vim a.yaml- hosts: webserver #指定主机组,可以是一个或多个组。 remote_user: root #指定远程主机执行的用户名#执行剧本ansible-playbook a.yaml
- 在原有基础上为每个任务定义远程执行用户
!vim- hosts: mysql remote_user: root tasks: - name: test connection ping: remote_user: mysql #指定远程主机执行tasks的运行用户为mysql#执行playbook剧本ansible-playbook ping.yml -k #验证语法ansible-playbook a.yml --syntax-check#执行剧本ansible-playbook a.yml
- 指定远程主机sudo切换用户
!vim- hosts: mysql remote_user: root become: yes #2.6版本以后的参数,之前是sudo,意思为切换用户运行 become_user: mysql #指定sudo用户为mysql#执行playbook剧本ansible-playbook ping.yml -K#执行剧本ansible-playbook a.yml
tasks列表和action
1.Play的主体部分是task列表,task列表中的各任务按次序逐个在hosts中指定的主机上执行,即在所有主机上完成第一个任务后再开始第二个任务。在运行playbook时(从上到下执行),如果一个host执行task失败,整个tasks都会回滚,请修正playbook 中的错误,然后重新执行即可。Task的目的是使用指定的参数执行模块,而在模块参数中可以使用变量,模块执行时幂等的,这意味着多次执行是安全的,因为其结果一致。2.每一个task必须有一个名称name,这样在运行playbook时,从其输出的任务执行信息中可以很好的辨别出是属于哪一个task的。如果没有定义name,'action'的值将会用作输出信息中标记特定的task。3.定义一个task,常见的格式:"module: options" 例如:yum: name=httpd4.ansible的自带模块中,command模块和shell模块无需使用key=value格式
实例演示:
- 实例1
vim a.yml - hosts: webserver remote_user: root tasks: - name: disable selinux command: '/sbin/setenforce 0' - name: make sure apache is running service: name=httpd state=started#play中只要执行命令的返回值不为0,就会报错,tasks停止#检查语法ansible-playbook a.yml --syntax-check#执行剧本ansible-playbook a.yml #检查结果rpm -q httpd
修改如下内容:
!vim- hosts: webserver remote_user: root tasks: - name: disable selinux command: '/sbin/setenforce 0' ignore_errors: True #忽略错误,强制返回成功 - name: make sure apache is running service: name=httpd state=started#检查语法ansible-playbook a.yml --syntax-check#执行剧本ansible-playbook a.yml
- 实例2
vim b.yml - hosts: webserver remote_user: root tasks: - name: create nginx group group: name=nginx system=yes gid=208 - name: create nginx user user: name=nginx uid=208 group=nginx system=yes- hosts: mysql remote_user: root tasks: - name: copy file to mysql copy: src=/etc/inittab dest=/opt/inittab.back#检查语法ansible-playbook b.yml --syntax-check#执行剧本ansible-playbook b.yml
Handlers介绍
Handlers也是一些task的列表,和一般的task并没有什么区别。是由通知者进行的notify,如果没有被notify,则Handlers不会执行,假如被notify了,则Handlers被执行不管有多少个通知者进行了notify,等到play中的所有task执行完成之后,handlers也只会被执行一次
实例演示:
vim c.yml- hosts: webserver remote_user: root tasks: - name: install httpd package yum: name=httpd state=latest - name: install configuration file for httpd copy: src=/opt/httpd.conf dest=/etc/httpd/conf/httpd.conf notify: -restart httpd - name: start httpd service service: enabled=true name=httpd state=started handlers: - name: restart httpd service: name=httpd state=restarted#检查语法ansible-playbook c.yml --syntax-check#执行剧本ansible-playbook c.yml
亦可引入一些变量:
!vim- hosts: webserver remote_user: root vars: - package: httpd - service: httpd tasks: - name: install httpd package yum: name={{package}} state=latest - name: install configuration file for httpd copy: src=/opt/httpd.conf dest=/etc/httpd/conf/httpd.conf notify: -restart httpd - name: start httpd service service: enabled=true name={{service}} state=started handlers: - name: restart httpd service: name={{service}} state=restarted#检查语法ansible-playbook c.yml --syntax-check#执行剧本ansible-playbook c.yml
playbook使用变量的方法
1.通过ansible命令传递
实例演示:
#编辑如下ymlvim a.yml- hosts: mysql remote_user: root vars: - user: tasks: - name: add new user user: name={{user}}#执行剧本ansible-playbook a.yml -e "user=testvar"#执行命令查看文件ansible mysql -m command -a 'tail /etc/passwd'
2.直接在yaml中定义变量---如上handlers示例
3.直接引用一些变量
实例演示:
- 引用ansible的固定变量
vim test.yml- hosts: mysql remote_user: root tasks: - name: copy file copy: content="{{ansible_all_ipv4_addresses}}," dest=/opt/vars.txt#执行剧本ansible-playbook test.yml#在122主机上查看vars.txt文件内容cat /opt/vars.txt
- 引用主机变量
vim /etc/ansible/hosts#在mysql组的主机后面添加如下内容[mysql]192.168.142.122 testvar="42.122" #定义testvar变量的值为42.122vim test.yml #添加{{testvar}}主机变量- hosts: mysql remote_user: root tasks: - name: copy file copy: content="{{ansible_all_ipv4_addresses}},{{testvar}}" dest=/opt/vars.txt#执行剧本ansible-playbook test.yml#在122主机上查看vars.txt文件内容cat /opt/vars.txt
条件测试
如果需要根据变量、facts(setup)或此前任务的执行结果来作为某task执行与否的前提时要用到条件测试,在Playbook中条件测试使用when子句。在task后添加when子句即可使用条件测试:when子句支持正则表达式或语法。
实例演示:
vim when.yml- hosts: mysql remote_user: root tasks: - name: "shutdown CentOS" command: /sbin/shutdown -h now when: ansible_distribution == "CentOS"#执行剧本,执行后会发现192.168.142.122主机已经被关机ansible-playbook when.yml
- 多条件判断
vim when.yml- hosts: mysql remote_user: root tasks: - name: "shut down CentOS 6 systems" command: /sbin/shutdown -r now when: - ansible_distribution == "CentOS" - ansible_distribution_major_version == "6"#执行剧本ansible-playbook when.yml
- 组条件判断
vim when.yml- hosts: mysql remote_user: root tasks: - name: "shut down CentOS 6 and Debian 7 systems" command: /sbin/shutdown -t now when: (ansible_distribution == "CentOS" and ansible_distribution_major_version == "6") or (ansible_distribution == "Debian" and ansible_distribution_major_version == "7")#执行剧本ansible-playbook when.yml
- 自定义变量进行条件测试
vim when.yml- hosts: all vars: exist: "True" tasks: - name: creaet file command: touch /tmp/test.txt when: exist | match("True") - name: delete file command: rm -rf /tmp/test.txt when: exist | match("False")#执行剧本ansible-playbook when.yml
迭代
当有需要重复性执行的任务时,可以使用迭代机制。其使用格式为将需要迭代的内容定义为item变量引用,并通过with_items语句指明迭代的元素列表即可。
实例演示:
vim d.yml- hosts: webserver remote_user: root tasks: - name: "Install Packages" yum: name={{ item }} state=latest with_items: - httpd - mysql-server - php#检查语法ansible-playbook d.yml --syntax-check#执行剧本ansible-playbook d.yml#在所有主机上查看是否有指定添加的用户tail -5 /etc/passwd
亦可自行定义:
vim e.yml- hosts: webserver remote_user: root tasks: - name: "Add users" user: name={{ item.name }} state=present groups={{ item.groups }} with_items: - { name:'test1', groups:'wheel'} - { name:'test2', groups:'root'}#检查语法ansible-playbook e.yml --syntax-check#执行剧本ansible-playbook e.yml#在所有主机上查看是否有指定添加的用户tail -5 /etc/passwd
Templates模块
#创建工作目录mkdir templates#复制配置文件cp /etc/httpd/conf/httpd.conf templates/httpd.conf.02#修改httpd.conf.02文件vim templates/httpd.conf.02Listen {{http_port}}ServerName {{ansible_fqdn}}MaxClients {{maxClients}}#修改ansible/hosts文件vim /etc/ansible/hosts[webserver]192.168.142.121 http_port=80 maxClients=100192.168.142.122 http_port=8080 maxClients=200#编写剧本vim apache.yml- hosts: webserver remote_user: root vars: - package: httpd - service: httpd tasks: - name: install httpd package yum: name={{package}} state=latest - name: install configuration file for httpd template: src=/root/templates/httpd.conf.2 dest=/etc/httpd/conf/httpd.conf notify: - restart httpd - name: start httpd service service: enabled=true name={{service}} state=started handlers: - name: restart httpd service: name={{service}} state=restarted#检查语法ansible-playbook e.yml --syntax-check#执行剧本ansible-playbook apache.yml
#在两台被管理服务器上查看grep -i listen /etc/httpd/conf/httpd.confgrep -i maxClient /etc/httpd/conf/httpd.confgrep -i servername /etc/httpd/conf/httpd.conf
tags模块
在一个playbook中,我们一般会定义很多个task,如果我们只想执行其中的某一个task或多个task时就可以使用tags标签功能了。格式如下:
vim hosts.yml- hosts: webserver remote_user: root tasks: - name: Copy hosts file copy: src=/etc/hosts dest=/etc/hosts tags: - only - name: touch file file: path=/opt/hosts state=touch#检查语法ansible-playbook e.yml --syntax-check#执行剧本ansible-playbook hosts.yml --tags="only"ansible-playbook hosts.ym
事实上,不光可以为单个或多个task指定同一个tags。playbook还提供了一个特殊的tags为always。作用就是当使用always当tags的task时,无论执行哪一个tags时,定义有always的tags都会执行。
实例演示:
vim hosts.yml
- hosts: webserver
remote_user: root tasks: - name: Copy hosts file copy: src=/etc/hosts dest=/etc/hosts tags: - only - name: touch file file: path=/opt/hosts state=touch tags: - always#检查语法ansible-playbook e.yml --syntax-check#为了不影响此次操作删除远程主机中/opt/hosts文件rm -rf /opt/hosts #执行剧本ansible-playbook hosts.yml --tags="only"
#分别在两台被管理服务器上去查看文件创建情况ls /opt/
看完上述内容,你们对Ansible常用模块有进一步的了解吗?如果还想学到更多技能或想了解更多相关内容,欢迎关注行业资讯频道,感谢各位的阅读!
主机
剧本
变量
文件
语法
检查
实例
任务
模块
内容
命令
用户
演示
多个
条件
运行
参数
格式
语言
配置
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
数据库对象放在同一文件中吗
忻州网络技术服务
天津明远软件开发有限公司
筑家易软件开发怎么样
vc股软件开发
360 服务器安全登陆不上
网络技术研究院 廖军
手动软件开发教程
软件开发能考什么事业编
微信读取数据库结构
软件开发系统建设方案文档
美哆哆互联网科技
大学校园网络安全教育文章
5g信息网络安全工程师
access数据库与表
浙江节能刀片服务器设计
东莞微信软件开发中心
香肠派对连接不上服务器怎么回事
宜昌市公安局网络安全等保大队
什么部门对网络安全管理
怎样设置服务器
网络安全民主化
南平游戏软件开发招聘
中兴基带软件开发跳槽
数据库中的主键是什么东西
软件开发流程所需技术
软件开发可以做的副业
his系统数据库出问题的投诉
饥荒联机版云服务器崩
手机版好玩的服务器号