ansible笔记

1 引言

基于Python开发,集合了众多运维工具(puppet、func、fabric)的优点,实现了通过各种模块批量系统配置、批量程序部署、批量运行命令等功能。
默认通过SSH连接受控机执行任务,无需代理。多并发。

2 安装

管理机应安装Python 2(2.7)或Python 3(3.5或更高版本),另外,管理机不支持Windows控制节点。

  • 通过Pip安装:
    pip install ansible

  • 源码安装:

git clone github.com/ansible/ansible.git
cd ./ansible
source ./hacking/env-setup
  • 下载安装程序(适合生产离线场景):
https://mirrors.huaweicloud.com/ansible/
tar xzvf ansible_v2.9.9_install.tar.gz
sh ansible_v2.9.0_install.sh

安装完毕,添加测试受控机进行简单的测试。
vi /etc/ansible/hosts 添加以下内容

[iweb]
10.0.0.111
10.0.0.112
[root]# ansible all  -m ping -k
SSH password: 
10.0.0.112 | FAILED! => {
    "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."
}
10.0.0.111 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    }, 
    "changed": false, 
    "ping": "pong"
}

管理机生成SSH密钥,然后将SSH公钥复制到所有客户机(112报错就是因为无ssh公钥)。

ssh-keygen -t rsa 
[root]# ll /root/.ssh/
-rw------- 1 root root 1675 Nov  3 18:06 id_rsa
-rw-r--r-- 1 root root  401 Nov  3 18:06 id_rsa.pub
-rw-r--r-- 1 root root  348 Feb  3  2021 known_hosts

[root]# ssh-copy-id -i /root/.ssh/id_rsa.pub root@10.0.0.112
Number of key(s) added: 1
Now try logging into the machine, with:   "ssh 'root@10.0.0.112'"
and check to make sure that only the key(s) you wanted were added.

加完公钥,再次测试,发现两台受控机均成功返回机器名。

[root]# ansible all  -a "uname -a" 
10.0.0.111  | CHANGED | rc=0 >>
Linux dbjf-ebus-mnt 2.6.32-573.el6.x86_64 #1 SMP Thu Jul 23 15:44:03 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux
10.0.0.112 | CHANGED | rc=0 >>
Linux dbjf-istp-lvs1 3.10.0-514.el7.x86_64 #1 SMP Tue Nov 22 16:42:41 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux

批量授权方案

hosts

[nginx]
172.0.0.1
[jboss]
10.10.0.1

initial-ssh.sh

#!/bin/bash
user=''
password=''
for host in $(cat hosts|grep -v '\[')
do
    sshpass -p ${password} ssh-copy-id -o StrictHostKeyChecking=no root@${host}
done

3 升级中常用的模块

  • command:在远程主机中执行命令,不经过远程主机的shell处理。不支持重定向、管道符。如远程节点是windows,则使用win_command模块。
  • shell:在远程主机中执行命令时,会经过远程主机上的/bin/sh程序处理。
  • script:脚本只存在于ansible主机本地,无需手动拷贝到远程主机后再执行。

3.1 调用本地脚本在受控机执行

[root]# ansible iweb -m script  -a "./back-all.sh" 
10.0.0.111 | CHANGED => {
    "changed": true, 
    "rc": 0, 
    "stderr": "Shared connection to 10.0.0.111 closed.\r\n", 
    "stderr_lines": [
        "Shared connection to 10.0.0.111 closed."
    ], 
    "stdout": "", 
    "stdout_lines": []
}

3.2直接调用受控机的脚本执行

10.0.0.111 | CHANGED | rc=0 >>

3.3 远程复制过程中利用copy自带的backup参数备份

  - name: configure httpd
    copy: src=/etc/ansible/files/httpd.conf  dest=/etc/httpd/conf/ backup=yes
    notify: restart httpd

3.4 分发文件到受控机可以使用copy或rsync模块。

[root]# ansible web_jboss_gmjj -m copy  -a "src=/data/down/php-5.4.16-42.el7.x86_64.rpm dest=/upgrade/ owner=root group=root mode=755" 
10.0.0.0 | CHANGED => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    }, 
    "changed": true, 
    "checksum": "7d9868a58c2e2aa6a434c4fb8819c0eebedd391d", 
    "dest": "/upgrade/php-5.4.16-42.el7.x86_64.rpm", 
    "gid": 0, 
    "group": "root", 
    "md5sum": "0334e09f8c56b261eb7f762bcc027f89", 
    "mode": "0755", 
    "owner": "root", 
    "size": 1419816, 
    "src": "/root/.ansible/tmp/ansible-tmp-1636009694.72-34754-140290725324375/source", 
    "state": "file", 
    "uid": 0
}

3.5 checksum文件对比校验。

[root@dbjf-istp-lvs2 down]# sha1sum php-5.4.16-42.el7.x86_64.rpm 
7d9868a58c2e2aa6a434c4fb8819c0eebedd391d  php-5.4.16-42.el7.x86_64.rpm

[root@dbjf-istp-lvs2 down]# ansible web_jboss_gmjj -m stat  -a "path=/upgrade/php-5.4.16-42.el7.x86_64.rpm" 
10.0.0.111 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    }, 
    "changed": false, 
    "stat": {
        "atime": 1636009555.3919408, 
        "charset": "binary", 
        "checksum": "7d9868a58c2e2aa6a434c4fb8819c0eebedd391d", 
        "ctime": 1636009555.3969407,  
        "isuid": false, 
        "mimetype": "application/x-rpm", 
        "mode": "0755", 
        "mtime": 1636009555.065942, 
        "nlink": 1, 
        "path": "/upgrade/php-5.4.16-42.el7.x86_64.rpm", 
        "pw_name": "root", 
        "readable": true, 
        "size": 1419816, 
    }

3.6 下载文件到指定目录:

ansible all -m get_url -a "url=http://www.mp4.com dest=/tmp/mp4 mode=0440 force=yes"

3.7 解压ansible管理机上的压缩文件到远程主机:

ansible all -m unarchive -a "src=/tmp/install/zabbix-3.0.4.tar.gz dest=/tmp/ mode=0755 copy=yes"

3.8 解压远程主机上的文件到目录:

ansible all -m unarchive -a "src=/tmp/install/zabbix-3.0.4.tar.gz dest=/tmp/ mode=0755 copy=no"

4 playbook

将多个play组织在一个playbook中,即可以让它们联合起来按事先编排的机制完成某一任务。

Playbook核心元素

  • Hosts 执行的远程主机列表
  • Tasks,playbook的核心,定义顺序执行的动作 action,调用ansbile module。
  • Varniables 内置变量或自定义变量在playbook中调用
  • Templates 模板,即使用模板语法的文件,比如配置文件等
  • Handlers 和notity结合使用,由特定条件触发的操作,满足条件方才执行,否则不执行
    Handlers will only be fired for tasks which report a changed state.
    只有当 task 执行状态显示是 changed 时,handler 动作才会被触发
    handlers是按照在handlers中定义个顺序执行的,而不是安装notify的顺序执行的。
  • tags 标签,指定某条任务执行,用于选择运行playbook中的部分代码。

[root@dbjf-istp-lvs2 ansible-work]# vi playbooks/web.yml

- hosts: webservers
  vars:
    worker_processes: 4
    num_cpus: 4
    max_open_files: 65535
    root: /upgrade
  remote_user: root
  tasks:
  - name: make sure ntpd is running
    service: name=ntpd state=started
image.png

Tips:
当tasks 参数比较多时,为了美观和不易出错,建议用 yml的字典传参:

  tasks:
  - name: make sure ntpd is running
    service: 
      name: ntpd 
      state: started

playbook语法:

ansible-playbook --**  file.yml
-i hosts
-i hosts -l group1
-C
--list-tasks
--list-hosts #列出目标主机
--list-tags
--syntax-check
-f 10 #并行处理
--syntax-check #语法检验

yml语法一览:

  • 大小写敏感
  • 使用缩进表示层级关系.不允许使用Tab键,只允许使用空格。
  • 缩进的空格数目不重要,只要相同层级的元素左侧对齐即可!
  • '#'表示注释,从这个字符一直到行尾
  • 开始行是 ---. 这是 YAML 格式的一部分, 表明一个文件的开始
  • 列表中的所有成员都开始于相同的缩进级别, 并且使用一个 "- " 作为开头(一个横杠和一个空格)
  • 一个字典是由一个简单的 键: 值 的形式组成(这个冒号后面必须是一个空格)
  • Ansible 使用 “{{ var }}” 来引用变量,foo: "{{ variable }}"

关闭facts

不收集系统信息可以加快执行效率。

- hosts: all
  gather_facts: no

变量的注册和调试

---
- hosts: all
  tasks:
     - name: ls /tmp
       shell: ls -l /tmp
       register: result
       ignore_errors: True

    - name: echo result when rc==5
      shell: echo "{{result}}"
      when: result.rc == 5
    - name: debug show stdout
      debug:
          msg: "{{result.stdout}}"
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,544评论 6 501
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,430评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,764评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,193评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,216评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,182评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,063评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,917评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,329评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,543评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,722评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,425评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,019评论 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,671评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,825评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,729评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,614评论 2 353

推荐阅读更多精彩内容