; ansible日常入门指南 | Linux运维部落

ansible日常入门指南

ansible的一些基本用法

ansible

特性

模块化:调用特定的模块,完成特定任务

有paramiko,pyYAML,   jinja2(模板语言)三个关键模块

支持自定义模块

基于Python语言实现

部署简单,基于Python和SSH(默认已安装),agentless

安全,基于openssh

支持playbook编排任务

幂等性:一个任务执行1遍和执行n遍效果一样,不因重复执行带来意外情况

无需代理不依赖PKI(无需ssl)

可使用任何编程语言写模块

YAML格式,编排任务,支持丰富的数据结构

较强大的多层解决方案

Ansible主要组成部分

Ansible playbooks:任务剧本,编排定义ansible任务集的配置文件,由ansible顺序依次执行,通常是JSON格式的YML文件

Inventory:ansible管理主机的清单/etc/anaible/hosts

MODULES:ansible执行命令的功能模块,多数为内置的核心模块,也可自定义

Plugins 模块功能的补充,如连接类型插件、循环插件、变量插件、过滤插件等,该功能不常用

API:供第三方程序调用的应用程序编程接口

ANSIBLE:组合inventory、api。Modules

Plugins的绿框,可以理解为是ansible命令工具,其核心执行工具

Ansible命令执行来源

USER,普通用户,即SYSTEM ADMINISTRATOR

CMDB(资产管理系统),API调用

PUBLIC/PRIVATE CLOUD API 调用

USER–>ANSIBLE PLAYBOOK –>ANSIBILE

利用ansible细线管理的方式

Ad-hoc 即ansible命令,主要用于临时命令使用场景

Ansible-playbook 主要用于长期规划好的,大型项目的场景,需要有前提的规划

 

 

[root@centos7 ~]# Hostnamectl   set-hostname  ansible   该主机名字,

[root@centos7 ~]#exec bash

[root@centos7 ~]# vim /etc/ansible/hosts   将被管理主机加入主机清单

[root@centos7 ~]# vim /etc/ansible/ansible.cfg

host_key_checking = False  修改注释  不验证

 

[root@centos7 ~]# ansible 192.168.27.130 -m ping -k 执行 测试 是否处于连接状态

[root@centos7 ~]# vim /etc/ansible/hosts

[web]

192.168.27.130

[db]

192.168.27.120

[root@centos7 ~]# ansible web -m ping -k

基于k验证

[root@centos7 ~]# ssh-keygen

[root@centos7 .ssh]# ssh-cop-id 192.168.27.120

[root@centos7 .ssh]# ssh-copy-id 192.168.27.130

[root@centos7 .ssh]# vim /etc/ansible/ansible.cfg

启动日志功能

log_path = /var/log/ansible.log

Ansible不受ssh服务的影响,但是受network的影响

[root@centos7 ~]# ansible web -m command -a “ls /root”   一root身份连接

Command命令模块

[root@centos7 ~]# ansible db -m command -a “ls /app”

[root@centos7 ~]# ansible db -m command -a “removes=/etc/fstab ls /app” 不存在就不执行

[root@centos7 ~]# ansible db -m command -a “creates=/etc/fstab ls /app”存在就不执行

[root@centos7 ~]# ansible web -m command -a ‘chdir=/app ./f1.sh’   执行脚本

 

Ansible db -m shell -a ‘echo magedu | passwd –stdin test1’ 修改用户test1的密码

Ansible db -m copy -a ‘src=/etc/selinux/config dest=/etc/selinux/ backup=yes’  远程拷贝文件

Ansible db -m copy -a ‘src=/etc/fstab dest=/app/fstab2 mode=600 owner=test1’ 改权限

Ansible db -m copy -a ‘src=/etc/sysconfig dest=/app/’ 复制目录

Ansible db -m copy -a ‘content=”de -h\nhostname\nls\n” dest=/app/f1.sh’  将内容复制到文件

 

[root@centos7 ~]# ansible db -m fetch -a ‘src=/etc/passwd dest=/app/’  将远程的文件抓到我的主机上

[root@centos7 ~]# ansible db -m file -a ‘path=/app/testfile state=touch mode=600 owner=test1’  创建空文件

 

[root@centos7 ~]# ansible db -m file -a ‘path=/app/dir2 state=directory’ 创建空文件夹

[root@centos7 ~]# ansible db -a ‘ls -l /app’   查看

Ansible db -m shell -a ‘ls -la /app’

[root@centos7 ~]# ansible 192.168.27.120 -m hostname -a ‘name=centos7-120.magedu.com’  该主机名

 

Ansible-vault encrypt file.yml  加密文件

Ansible-vault view file.yml 看文件

Ansible-vault edit file.yml 编辑文件

Ansible-vault rekey file.yml  更改口令

Ansible-vault decrypt file.yml   解密文件

 

 

 

[root@centos7 ~]# ansible-galaxy install geerlingguy.nginx

[root@centos7 ~]# cd /etc/ansible/roles/geerlingguy.nginx/

[root@centos7 geerlingguy.nginx]# cd tasks

[root@centos7 tasks]# cat setup-RedHat.yml     playbook

 

Playbook是由一个或多个play组成的列表

Play的主要功能在于将事先归并为一组的主机装扮成事先通过ansible中的task定义好的角色。从根本上来讲,所谓task无非是调用ansible的一个module。将多个play组织在一个playbook中,既可以让他们连同起来按事先编排的机制同唱一台大戏

Playbook采用yaml语言编写

YAML语法简介

在单一档案中,可用连续三个连字号(—)区分多个档案。另外,还有选择性的连续三个点号(…)用来表示档案结尾

次行开始正常写playbook的内容,一般建议写明该playbook的功能

使用#号注释代码

缩进必须是统一的,不能空格和tab混用

缩进的级别也必须是一致的,同样的缩进代表同样的级别,程序判别配置的级别是通过缩进结合换行来实现的

YAML文件的内容和LINUX系统大小写判断方式保持一致,是区别大小写的,k/v的值均需大小写敏感

K/v的值可同行写也可换行写。同行使用:分隔

V可是个字符串,也可是另一个列表

一个完整的代码块功能需最少元素包括name:task

一个name只能包括一个task

YAML文件扩展通常为yml或yaml

Ansible all -m yum -a ‘name=vsftpd’ state=absent    卸载服务

 

 

[root@centos7 ~]# vim test1.yml   在远程服务器上安装一个软件包

[root@centos7 ~]# ansible-playbook -C test1.yml  测试运行

 

– hosts: db

remote_user: root

 

tasks:

– name: install package

yum: name=httpd state=present

– name: start service

service: name=httpd state=started enabled=yes

[root@centos7 ~]# ansible-playbook test1.yml   运行脚本

 

[root@centos7 ~]# cp test1.yml test2.yml

[root@centos7 ~]# vim test2.yml

– hosts: db

remote_user: root

 

tasks:

– name: install package

yum: name=httpd state=present

– name: start service

service: name=httpd state=started enabled=yes

– hosts: web

remote_user: root

 

tasks:

– name: copy file

copy: src=/etc/fstab dest=/app/ owner=wang mode=600

– name: create user

user: name=test3 shell=/sbin/nologin system=yes

[root@centos7 ~]# ansible-playbook -C test2.yml  测试运行

 

[root@centos7 ~]# vim httpd.yml   装包yum  配置文件覆盖    启动服务

#

– hosts: web

remote_user: root

 

tasks:

– name: install httpd

yum: name=httpd

– name: copy config file

copy: src=/app/httpd.conf dest=/etc/httpd/conf/ backup=yes

– name: start httpd

service: name=httpd state=started enabled=yes

Ansible-playbook httpd.yml  运行

 

 

#

– hosts: web

remote_user: root

 

tasks:

– name: install httpd

yum: name=httpd

– name: copy config file

copy: src=/app/httpd.conf dest=/etc/httpd/conf/ backup=yes

notify: restart httpd

– name: start httpd

service: name=httpd state=started enabled=yes

handlers:

– name: restart httpd

service: name=httpd state=restarted

第一次,执行照常执行;第二次执行时,notify 触发handlers执行

Handlers

是task列表,这些task与前述的task并没有本质上的不同,用于当关注的资源发生变化时,才会采取一定的操作

Notify这个action可用于在每个play的最后被触发,这样可以避免多次有改变发生时每次都执行指定的操作,仅仅在所有的变化发生完成后一次性地执行指定操作。在notify中列出的操作称为handler,也即notify中调用handler中定义的操作

Ansible -playbook –tages copyconf -C httpd.yml  从我的剧本中挑出tages代表的我的任务执行,其他不执行

 

 

 

 

[root@centos7 ~]# ansible all –list-hosts     主机管理的所有列表

[root@centos7 ~]# ansible all -m setup     列出主机对应的所用信息

[root@centos7 ~]# ansible all -m setup |grep version   列出版本信息

Playbook中变量使用

变量名:仅能由字母,数字和下划线组成,且只能以字母开头

变量来源

  • ansible setup facts 远程主机的所有变量都可直接调用
  • 在/etc/ansible/host中定义

普通变量:主机组中主机单独定义,优先级高于公共变量

公共变量:针对主机组中所有主机定义统一变量

  • 通过命令行指定变量,优先级最高  ansible-playbook -e varname=value
  • 在playbook中定义
  • Vars:

 

 

[root@centos7 ~]# vim var1.yml

– hosts: web

remote_user: root

 

tasks:

– name: install package

yum: name={{ pkname }}

[root@centos7 ~]# ansible-playbook -e pkname=vsftpd var1.yml            可以传一个值  

[root@centos7 ~]# ansible web -m shell -a ‘rpm -qa|grep vsftpd’  查找看是否装了 vsftpd

 

[root@centos7 ~]# vim var1.yml

– hosts: web

remote_user: root

 

tasks:

– name: install package

yum: name={{ pkname }}

– name: copy file

copy: src=/app/{{ filename }} dest=/app/

[root@centos7 ~]# ansible-playbook -e “pkname=htop filename=httpd.conf” var1.yml   使用多个变量

[root@centos7 ~]# ansible web -m yum -a ‘name=vsftpd,htop state=absent’   删除两个服务

 

 

 

[root@centos7 ~]# vim var2.yml    在playbook中定义变量和使用变量

– hosts: web

remote_user: root

vars:

– username: user1

– groupname: group1

 

tasks:

– name: create group

group: name={{ groupname }}

– name: create user

user: name={{ username }} group={{ groupname }} home=/app/{{ username }}dir

[root@centos7 ~]# ansible-playbook var2.yml   运行

 

[root@centos7 ~]# vim var3.yml   创建文件

– hosts: web

remote_user: root

 

tasks:

– name: create file

file: name=/app/{{ ansible_hostname }}.txt state=touch

[root@centos7 ~]# ansible web -a ‘la /app/’  运行

[root@centos7 ~]# ansible web -a ‘ls /app/’  检查文件是否生成

 

[root@centos7 ~]# vim /etc/ansible/hosts  在配置文件中定义

[web]

192.168.27.130 http_port=85

[root@centos7 ~]# ansible web -m hostname -a ‘name=web{{http_port}}’

[root@centos7 ~]# hostname

web85

  普通变量

[root@centos7 ~]# vim /etc/ansible/hosts

[web]

192.168.27.130 http_port=85 hname=httpd

[root@centos7 ~]# vim var4.yml

– hosts: web

remote_user: root

 

tasks:

– name: set hostname

hostname: name={{hname}}-{{http_port}}

[root@centos7 ~]# ansible-playbook -C var4.yml

公共变量

[root@centos7 ~]# vim /etc/ansible/hosts

[web]

Hname=web

 

模板templates

文本文件,嵌套有脚本(使用模板编程语言编写)

Jinjia2语言,使用字面量,有下面形式

字符串:使用单引号或双引号

数字:整数,浮点数

 

复制功能

[root@centos7 templates]# vim tmphttpd.yml

– hosts: web

remote_user: root

 

tasks:

– name: template

template: src=httpd.conf.j2 dest=/app/httpd.conf

~

[root@centos7 templates]# ansible-playbook tmphttpd.yml

 

 

 

 

[root@centos7 templates]# cd /etc/ansible

[root@centos7 ansible]# cp /etc/nginx/nginx.conf templates/nginx.conf.j2

[root@centos7 ansible]# cp tmphttpd.yml tmpnginx.yml

[root@centos7 ansible]# vim tmpnginx.yml

– hosts: web

remote_user: root

 

tasks:

– name: install nginx

yum: name=nginx

– name: template

template: src=nginx.conf.j2 dest=/etc/nginx/nginx.conf

tags: instconf

– name: start service

service: name=nginx state=started

~

[root@centos7 ansible]# ansible-playbook -C tmpnginx.yml

[root@centos7 templates]# ansible web -m shell -a ‘ss -ntl|grep :80’  查看80 端口 在客户端

 

实现centos6和centos7上的httpd安装和启动

[root@centos7 ansible]# vim tmphttpd.yml

 

– hosts: all

remote_user: root

 

tasks:

– name: install httpd

yum: name=httpd

 

– name: template 6

template: src=httpd-6.conf.j2 dest=/etc/httpd/conf/httpd.conf

when: ansible_distribution_major_version==”6″

 

– name: template 7

template: src=httpd-7.conf.j2 dest=/etc/httpd/conf/httpd.conf

when: ansible_distribution_major_version==”7″

– name: start service

service: name=httpd state=started

[root@centos7 ansible]# ansible-playbook -C tmphttpd.yml  试运行

 

[root@centos7 ansible]# vim  tmphttpd.yml  使用when

– hosts: all

remote_user: root

tasks:

– name: install httpd

yum: name=httpd

– name: template 6

template: src=httpd-6.conf.j2 dest=/etc/httpd/conf/httpd.conf

when: ansible_distribution_major_version==”6″

– name: template 7

template: src=httpd-7.conf.j2 dest=/etc/httpd/conf/httpd.conf

when: ansible_distribution_major_version==”7″

– name: start service

service: name=httpd state=started

迭代:with_items

迭代:当有需要重复性执行的任务时,可以用迭代机制

对迭代项的引用,固定变量名为“item”

要在task中使用with_item给定要迭代的元素列表

列表格式  字符窜,字典

[root@centos7 ansible]# vim item1.yml

– hosts: web

remote_user: root

 

tasks:

– name: create servel user

user: name={{item}} group=root groups=wang,bin

with_items:

– itemuser1

– itemuser2

[root@centos7 ansible]# ansible-playbook -C item1.yml   检测执行

[root@centos7 templates]# ansible web -m shell -a ‘getent passwd |tail -n2’  查看生成的用户

复制文件,迭代

[root@centos7 ansible]# vim item2.yml

– hosts: web

remote_user: root

tasks:

– name: copy conf files

copy: src={{item}} dest=/app/

with_items:

– /app/file1

– /app/file2

– /app/file3

– name: install packages

yum: name={{item}}

with_items:

– vsftpd

– memcached

– hping3

 

For循环

[root@centos7 ansible]# vim templates/for1.conf.j2

– hosts: web

remote_user: root

vars:

ports:

– 81

– 82

– 83

tasks:

– name: test for1

template: src=for1.conf.j2 dest=/app/for1.conf

[root@centos7 ansible]# vim templates/for1.conf.j2  写模板

{%for port in ports %}

server {

listen port;

}

{%for port in ports %}

server {

listen {{port}};

}

{%endfor%}

[root@centos7 ansible]# ansible-playbook -C for1.yml  运行

另一种方法

[root@centos7 ansible]# vim  for2.yml

 

– hosts: web

remote_user: root

vars:

ports:

– listen_port: 81

– listen_port: 82

– listen_port: 83

tasks:

– name: test for2

template: src=for2.conf.j2 dest=/app/for2.conf

[root@centos7 ansible]# vim  templates/for2.conf.j2

 

{%for port in ports %}

server {

listen {{port.listen_port}};

}

{%endfor%}

使用if 定义的时候使用该行,不定义的时候就嵌入代码,

[root@centos7 ansible]# vim for4.yml

– hosts: web

remote_user: root

vars:

vhosts:

– web1:

port: 81

#name: web1.magedu.com

root: /app/webroot1

– web2:

port: 82

name: web2.magedu.com

root: /app/webroot2

– web3:

port: 83

#name: web3.magedu.com

root: /app/webroot3

tasks:

– name: test for1

template: src=for4.conf.j2 dest=/app/for4.conf

定义模板

[root@centos7 ansible]# vim templates/for4.conf.j2

 

{%for vhost in vhosts %}

server {

listen {{vhost.port}};

{%if vhost.name is defined%}

servername {{vhost.name}};

{%endif%}

rootdir {{vhost.root}};

}

{%endfor%}

roles

Ansible自1.2版本引入的新特性,用于层次性、结构化地组织playbook。Roles能够根据层次型结构自动装载变量文件、tasks以及handlers等。要使用roles只需要在playbook中使用include指令即可。简单来讲,roles就是通过分别将变量、文件、任务、模板及处理器放置于单独的目录中,并可以便捷地include他们的一种机制。角色一般用于基于主机构建服务的场景中,但也可以是用于构建守候进程等场景中

复杂场景:建议使用roles,

变更指定主机或主机组

如命令不规范维护和传承成本大

某些功能需多个playbook,通过include即可实现

 

实现文件复制的角色

[root@dnsclient roles]# mkdir filecopy/tasks -pv

[root@dnsclient roles]# mkdir filecopy/files

[root@dnsclient ansible]# vim roles/filecopy/tasks/main.yml

 

– name: file copy

copy: src=fstab dest=/app/

 

– name: file create

file: name=/app/testfile mode=600 state=touch

[root@dnsclient ansible]# vim filecopy-role.yml

 

– hosts: web

remote_user: root

 

roles:

– role: filecopy

[root@dnsclient ansible]# ansible-playbook filecopy-role.yml  -C   试运行

 

本文来自投稿,不代表Linux运维部落立场,如若转载,请注明出处:http://www.178linux.com/91295

发表评论

电子邮件地址不会被公开。 必填项已用*标注

联系我们

400-080-6560

在线咨询:点击这里给我发消息

邮件:1660809109@qq.com

工作时间:周一至周五,9:30-18:30,节假日同时也值班