05 ansible剧本编写

 

1、ansible基础知识部分补充

数据移动模块

05 ansible剧本编写_第1张图片

1.1 ansible软件特点

01.可以实现批量管理

02.可以实现批量部署

03.ad-hoc(批量执行命令)---针对临时性的操作

ansible banana -m command -a "hostname"   <-批量执行命令举例

04.编写剧本-脚本(playbook)---针对重复性的操作

1.2 ansible核心功能

01.pyYAML  <-用于ansible编写剧本所使用的语言格式(saltstack---python)

02.paramiko  <-远程连接与数据传输

03.Jinja2     <-用于编写ansible的模板信息

05 ansible剧本编写_第2张图片

2、 ansible剧本编写规则说明

①规则一:缩进/空格

yaml使用一个固定的缩进风格表示数据层结构关系,需要每个缩进级别由两个空格组成,一定不能使用tab键

注意:编写ansible-playbook文件,一定不能使用tab键

②规则二:冒号

- host: 172.16.1.41

  tasks:

注意:每个冒号前后一定要有空格(以冒号结尾不需要空格,表示文件路径的模板不需要空格)

③规则三:短横线

想要表示列表项,使用一个短横杠加一个空格。多个项使用同样的缩进级别作为同一个列表的一部分

核心规则:有效的利用空格进行剧本的编写,剧本编写是不支持tab的


 

3、 剧本书写格式

 剧本的开头,可以不写
 - hosts: all   #处理所有服务器,找到所有服务器;  -(空)hosts:(空)all
   tasks:    #剧本所要干的事情;                   (空)(空)task:
     - command: echo hello banana linux.      (空)(空)(空)(空)-(空)模块名称:(空)模块中对应的功能
等价于 ansible all -m command -a "echo hello banana linux"

剧本编写内容扩展:剧本任务定义名称

 - hosts: 172.16.1.7   #处理指定服务器                   -(空)hosts:(空)all
   task:    #剧本所要干的事情;                          -(空)(空)task:
     - name:
     command: echo hello banana linux.   (空)(空)(空)(空)-(空)模块名称:(空)模块中对应的功能

   剧本格式示例

gota@gota-linux61:~/ansible$ vim host.yaml
- hosts: 192.168.1.62
  tasks:
    - name: 01-push conf file
      copy: src=/home/gota/ansible/host.yaml dest=/etc/
    - name: 02-creste user
      user: name=gota02 password=$6$oldyboy$tKcigo1KPPzN.Yh8fij5PLc6o6CzqXQBNHOfq38SgPefqVqfjkahHevDeaKCtK/BJ4WbIJnZmGy.NLIROMV7f1

 

4、剧本编写后检查方法

gota@gota-linux61:~/ansible$ ansible-playbook --syntax-check host.yaml  #进行剧本配置信息语法检查

playbook: host.yaml
gota@gota-linux61:~/ansible$ ansible-playbook -C host.yaml #模拟剧本执行(彩排)

PLAY [192.168.1.62] ****************************************************************************************************

TASK [Gathering Facts] *************************************************************************************************
ok: [192.168.1.62]

TASK [01-push conf file] ************************************************************************************************
changed: [192.168.1.62]

TASK [02-creste user] ****************************************************************************************************
changed: [192.168.1.62]

PLAY RECAP ****************************************************************************************************************
192.168.1.62               : ok=3    changed=2    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   

gota@gota-linux61:~/ansible$ ansible-playbook  host.yaml  #正式执行

PLAY [192.168.1.62] ********************************************************************************************************

TASK [Gathering Facts] *****************************************************************************************************
ok: [192.168.1.62]

TASK [01-push conf file] ***************************************************************************************************
changed: [192.168.1.62]

TASK [02-creste user] ******************************************************************************************************
changed: [192.168.1.62]

PLAY RECAP *****************************************************************************************************************
192.168.1.62               : ok=3    changed=2    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   

 

剧本示例

4.1 剧本编写内容扩展:剧本任务编写多个任务

1 - hosts: all
2   tasks:
3     - name: restart-network
4       cron: name='restart network' minute=00 hour=00 job='/usr/sbin/ntpdate time.nist.gov >/dev/null 2>&1'
5     - name: sync time
6       cron: name='sync time' minute=*/5 job="/usr/sbin/ntpdate pool.ntp.com >/dev/null 2>&1"

4.2 剧本编写内容扩展:剧本任务编写多个主机

 1 - hosts: 172.16.1.7
 2   tasks:
 3     - name: restart-network
 4       cron: name='restart network' minute=00 hour=00 job='/usr/sbin/ntpdate time.nist.gov >/dev/null 2>&1'
 5     - name: sync time
 6       cron: name='sync time' minute=*/5 job="/usr/sbin/ntpdate pool.ntp.com >/dev/null 2>&1"
 7 - hosts: 172.16.1.31
 8   tasks:
 9     - name: show ip addr to file
10       shell: echo $(hostname -i) >> /tmp/ip.txt
    [root@m01 ansible-playbook]# cat rsync_server.yaml 
- hosts: rsync_server
  tasks:
    - name: 01-install rsync  
      yum: name=rsync state=installed
    - name: 02-push conf file    
      copy: src=/etc/ansible/server_file/rsync_server/rsyncd.conf dest=/etc/
    - name: 03-create user
      user: name=rsync create_home=no shell=/sbin/nologin
      #shell: useradd rsync -M -s /sbin/nologin 
    - name: 04-create backup dir
      file: path=/backup state=directory owner=rsync group=rsync
    - name: 05-create password file
      copy: content=rsync_backup:oldboy123 dest=/etc/rsync.password mode=600
    - name: 06-start rsync server
      service: name=rsyncd state=started enabled=yes

- hosts: rsync_clients
  tasks:
    - name: 01-install rsync
      yum: name=rsync state=installed
    - name: 02-create password file
      copy: content=oldboy123 dest=/etc/rsync.password mode=600
    - name: 03-create test file
      file: dest=/tmp/test.txt  state=touch
    - name: 04-check test
      shell: rsync -avz /tmp/test.txt rsync_backup@172.16.1.41::backup --password-file=/etc/rsync.password
一键化部署 rsync 服务部署

 

如何配置主机清单(/etc/ansible/hosts)

主机清单的配置方法:
https://docs.ansible.com/ansible/latest/user_guide/intro_inventory.html

第一种方式: 分组配置主机信息

[web]
172.16.1.7
172.16.1.8
172.16.1.9

[data]
172.16.1.31
172.16.1.41

操作过程

[root@m01 ansible-playbook]# ansible data -a "hostname"
172.16.1.31 | CHANGED | rc=0 >>
nfs01
172.16.1.41 | CHANGED | rc=0 >>
backup
[root@m01 ansible-playbook]# ansible web -a "hostname"
172.16.1.7 | CHANGED | rc=0 >>
web01

 

第二种方式: 主机名符号匹配配置

[web]
172.16.1.[7:9]
[web]
web[01:03]  #需要在host文件中指定web01 web02 web03对应的IP


第三种方式: 跟上非标准远程端口

[web]
web01:52113 #需要在host文件中指定web01对应的IP
172.16.1.7:52113


第四种方式: 主机使用特殊的变量

[web]
172.16.1.7 ansible_ssh_port=52113 ansible_ssh_user=root ansible_ssh_pass=123456
[web]
web01 ansible_ssh_host=172.16.1.7 ansible_ssh_port=52113 ansible_ssh_user=root ansible_ssh_pass=123456

 

第五种方式: 主机组名嵌入配置

[rsync:children] --- 嵌入子组信息
rsync_server
rsync_client

[rsync_server]
172.16.1.41

[rsync_client]
172.16.1.31
172.16.1.7

[web:vars] --- 嵌入式变量信息
ansible_ssh_host=172.16.1.7
ansible_ssh_port=52113
ansible_ssh_user=root
ansible_ssh_pass=123456
[web]
web01
gota@gota-linux61:~$ sudo vim /etc/ansible/hosts 

[rsync:children]
rsync_server
rsync_client

[rsync_server]
192.168.1.62 ansible_ssh_user=root ansible_ssh_pass=Gota1234

[rsync_client]
192.168.1.[63:64] ansible_ssh_user=root ansible_ssh_pass=Gota1234

gota@gota-linux61:~$ ansible rsync -a 'hostname'
192.168.1.63 | CHANGED | rc=0 >>
gota-linux63

192.168.1.64 | CHANGED | rc=0 >>
gota-linux64

192.168.1.62 | CHANGED | rc=0 >>
gota-linux62

gota@gota-linux61:~$ ansible rsync_client -a 'hostname'
192.168.1.63 | CHANGED | rc=0 >>
gota-linux63

192.168.1.64 | CHANGED | rc=0 >>
gota-linux64

gota@gota-linux61:~$ ansible rsync_server -a 'hostname'
192.168.1.62 | CHANGED | rc=0 >>
gota-linux62
实例演示一下

 

 

 

 

 

 

第6章 ansible编写剧本排错思路

6.1 剧本排错方法

1. ansible-playbook编写完,检査语法和模拟测试运行

2.打开剧本,定位异常问題原因,将剧本中的内容转换命令执行一次

3. 将参数中的脚本文件推送到远程屎务器,在远程服务器本地执行脚本 sh -x test.sh

说明:ansible执行时,加上-vvvv显示ansible详细执行过程,也可以定位异常原因

--syntax-check或-C ansible语法检查和模拟执行(彩排)

6.2 排错逻辑

01.剧本执行中的错误

02.把剧本中的内容转换为ansible命令执行

ansible banana -m yum -a "name=rsync state=installed"

03.把参数中的脚本文件推送到远端服务器,放在远端被管理服务器本地上执行

     sh -x /server/scripts/test.sh

6.3 ansible无法正常使用

6.3.1 常见问题一:在被控端上 root@notty进程一直存在

1 [root@backup ~]# ps -ef|grep sshd
2 
3 root      35274      1  0 15:25 ?        00:00:00 /usr/sbin/sshd
4 root      37004  35274  0 16:23 ?        00:00:00 sshd: root@pts/2
5 root      37062  35274  0 16:55 ?        00:00:00 sshd: root@notty
6 root      37154  37006  0 16:55 pts/2    00:00:00 grep --color=auto sshd

解决思路:kill pid将该进程杀死,然后使用ansible的 -vvvv 参数查看执行的错误信息

复制代码
Loading callback plugin minimal of type stdout, v2.0 from /usr/lib/python2.6/site-packages/ansible/plugins/callback/__init__.pyc

META: ran handlers
Using module file /usr/lib/python2.6/site-packages/ansible/modules/system/ping.py
<172.16.1.8> ESTABLISH SSH CONNECTION FOR USER: None
<172.16.1.8> SSH: EXEC ssh -vvv -C -o ControlMaster=auto -o ControlPersist=60s -o KbdInteractiveAuthentication=no -o PreferredAuthentications=gssapi-with-mic,gssapi-keyex,hostbased,publickey -o PasswordAuthentication=no -o ConnectTimeout=10 -o ControlPath=/root/.ansible/cp/923ebeb605 172.16.1.8 '/bin/sh -c '"'"'echo ~ && sleep 0'"'"''
复制代码

可能为:在/etc/ssh/sshd_config 文件中的第132行为空,导致sftp 无法连接出错

133 Subsystem       sftp    /usr/libexec/openssh/sftp-server

6.3.2 常见问题二:

1 [root@m01 ~]# ansible -k 172.16.1.51 -m ping

2

3 SSH password:

4 [WARNING]: No hosts matched, nothing to do 

解决思路:在ansible的hosts文件中,没有配置相应主机地址信息

6.3.3 常见问题三:

复制代码
1 # ansible -k 172.16.1.51 -m ping
2 
3 SSH password:
4 172.16.1.51|FAILED! => {
5 "failed": true,
6 "msg": "Using a SSH password instead of a key is not possible because Host Key checking is enabled and sshpass does not support this.  Please add this host's fingerprint to your known_hosts file to manage this host."
7 }
复制代码

解决思路:在known_hosts文件中没有受控端指纹信息

6.4 [附录]pssh命令使用扩展

6.4.1 pssh命令使用场景说明

背景:若同时给上千台服务器执行一个命令,拷贝一个文件,杀一个进程等,有什么简化运维管理的工具呢?

在小型企业中通常使用for循环,但是数量巨大时:一方面不确定操作是否成功;另一方面for循环语句性能不好估计且是否是同步并行执行,故此时会用到批量并行执行的命令如 pdsh,mussh,cssh,dsh等,及下面说明提到的pssh

6.4.2 pssh软件安装部署方式

①通过yum安装pssh软件

 1 yum install -y pssh <-pssh软件下载需要依靠epel源 

说明:pssh是一个软件大礼包,里面有很多软件命令

②通过编译方式安装pssh软件

1 wget http://peak.telecommunity.com/dist/ez_setup.py
2 python ez_setup.py
3 wget http://parallel-ssh.googlecode.com/files/pssh-2.2.2.tar.gz
4 tar zxvf pssh-2.2.2.tar.gz
5 cd pssh-2.2.2
6 python setup.py install

③pssh软件使用操作说明(ssh key认证密钥配置完毕)

01.pssh 多主机并行运行命令

1 [root@server pssh-2.2.2]# vim hosts_info.txt
2 
3 172.16.1.31:22
4 172.16.1.41:22
5 172.16.1.7:22  //注意我的端口号不仅是默认的22

说明:如果想将执行命令的批量输出信息重定向到一个文件 加-o 目录 选项

参数说明:

-h HOST_FILE,  --hosts=HOST_FILE       hosts file (each line "[user@]host[:port]")
-o OUTDIR,     --outdir=OUTDIR         output directory for stdout files (OPTIONAL)
-P,             --print                   print output as we get it

02.pscp 把文件并行地复制到多个主机上(从服务器端给客户端传送文件)

 1 [root@server pssh-2.2.2]# pscp -h test.txt /etc/sysconfig/network /tmp/network 

03.prsync 使用rsync协议从本地计算机同步到远程主机

1 [root@server ~]# pssh -h test.txt -P mkdir /tmp/etc

2 [root@server ~]# prsync -h test.txt -l dongwm -a -r /etc/sysconfig /tmp/etc  

04.pslurp 将文件从远程主机复制到本地,和pscp方向相反

复制代码
 1 [root@server ~]# pslurp -h test.txt   -L /tmp/test -l root /tmp/network test 
 2 
 3 [1] 14:53:54 [SUCCESS] 192.168.9.102 9922
 4 [2] 14:53:54 [SUCCESS] 192.168.9.104 9922
 5 
 6 [root@server ~]# ll /tmp/test/192.168.9.10
 7 192.168.9.102/ 192.168.9.104/
 8 
 9 [root@server ~]# ll /tmp/test/192.168.9.102/
10 总计 4.0K
11 -rw-r--r-- 1 root root 60 2011-04-22 14:53 test
12 
13 [root@server ~]# ll /tmp/test/192.168.9.104/
14 总计 4.0K
15 -rw-r--r-- 1 root root 60 2011-04-22 14:53 test
复制代码

 

此笔记是本人学习摘记整理而成,此为初稿(尚有诸多不完善之处),原创作品允许转载,转载时请务必以超链接形式标明文章原始出处,作者信息和本声明,否则将追究法律责任。http://www.cnblogs.com/bananaaa/

 

转载于:https://www.cnblogs.com/linux985/p/11314747.html

你可能感兴趣的:(05 ansible剧本编写)