ansible常用模块使用熟练!!!

发布时间 2023-08-31 14:30:16作者: 往事已成昨天

快速上手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

图片

收录于合集 #Linux
 19
上一篇centos迁移至openEuler实践下一篇openEuler系统默认普通用户禁止使用su命令
阅读 1063
运维记事
 
 
关注后可发消息