Ansible

安装

yum install epel-release
yum install ansible

配置

inventory

inventory的目录下建立inventory.ini

ansible-node1 ansible_connetcion=ssh ansible_user=user1 ansible_ssh_pass=userpass
ansible-node2 ansible_connetcion=ssh ansible_user=user1 ansible_ssh_pass=userpass

可以使用分组

[web]
ansible-node1 ansible_connetcion=ssh ansible_user=user1 ansible_ssh_pass=userpass
#ansible-node2 ansible_connetcion=ssh ansible_user=user1 ansible_ssh_pass=userpass
ansible-node[1:100] ansible_connetcion=ssh ansible_user=user1 ansible_ssh_pass=userpass

ansible web -m ping -i inventory.ini 先用ssh登陆一下,在主机上存在有finger记录
SSH KEY认证
ansible-controller中,ssh-keygen生成key文件

ssh-keygen
ssh-copy-id -i .ssh/ansible ansible-node
ssh -i .ssh/ansible ansible-node1
ansible web -m ping -i inventory.ini --private-key=/home/~~~/

YAML文件

- hosts: webservers
  remote_user: root
  tasks:
  - name: ensure apache is at the lastest version
      yum: httpd
      state: latest
  - name: write the apache config file
    template:
      src: /srv/httpd.js
      dest: /etc/httpd.conf
- hosts: databases
  remote_user: root
  tasks:
  - name: ensure postgresql is at the lastest version
    yum: 
      name: postgresql
      state: lastest
  - name: ensure the postgresql is started
    service:
      name: postgresql
      state: started

执行playbook

ansible-playbook playbook2.yml -i inventory.ini --private-key=/home/~~
Ansible核心

使用Vagrant搭建环境

  • Vagrant官网
  • 下载2个文件varant,一定是两个,不能少。
  • 预先安装好VirtualBox
  • 一个小坑,记住下载的文件目录里不要放文件,在生成虚拟机时会拷贝这两个文件
  • 因为下载的文件里没有epel-release导致安装ansible失败,很奇怪的问题,手工安装成功
  • 常用操作
    • vagrant init 初使化
    • vagrant up 安装虚拟机并配置(时间长一点,耐心等待)
    • vagrant halt 关机
    • vagrant destory 删除虚拟机
实际操作
 ssh-keygen
 ssh-copy-id -i ~/.ssh/id_rsa.pub ansible-node2
ansible -i inventory.ini -m ping web
[vagrant@ansible-controller ~]$ cat inventory.ini
[web]
ansible-node1 ansible_connetcion=ssh ansible_user=vagrant
ansible-node2 ansible_connetcion=ssh ansible_user=vagrant

PlayBook

变量

---

- name: Hello World
  hosts: localhost

  vars: 
    greetings: "hello from vars"
    demo:
      a:
        - a: 1
        - b: 2
      b: test

  tasks: 
    - name: Hello World debug
      debug:
        msg: "{{ demo }}"

引用变量文件

优先级 文件中后定义>文件前定义>文件变量

  vars_files: 
    - "vars/demo.yml"
    - "vars/demo.yml"

循环

- name: Hello World
  hosts: localhost
  gather_facts: no

  vars:
    test:
      - test1
      - test2
      - test3
      - test4

  tasks: 
    - name: Test loop
      debug: 
        msg: "{{ item }}"
      with_items: "{{ test }}"  

多重循环

---

- name: Hello World
  hosts: localhost
  gather_facts: no #不收集服务器数据
  become: yes #作用root权限sudo

  vars:
    test:
      - test1
      - test2
      - test3
      - test4
    demo:
      - demo1
      - demo2
      - demo3

  tasks: 
    - name: Test loop
      debug: 
        msg: "{{ item[0] }} , is {{ item[1] }}"
      with_nested: 
        - "{{ test }}"  
        - "{{ demo }}"

条件

  tasks: 
    - name: Test loop
      debug: 
        msg: "{{ item }} "
      with_items: 
        - "{{ seq }}" 
      when: item >=3 

多个条件

when: 
  - item >=3 
  - item <=5
when: item>3 or item<2

Group和Host变量

在inventory中建立目录group_vars和host_vars,文件hosts
group_vars里是all.yml,db.yml各个组的变量
host_vars里是host1.yml,host2.yml里面是ip啊,端口什么的
这里一个坑我跳进去2天,文件名一定是这两个。不能错,另外host_vars里是主机名为代表的yml


image.png

环境变量优先级

ansible.cfg
ANSIBLE_CONFIG
home 下的 ansible.cfg
/etc/ansible.cfg

模块介绍

file,copy,fetch

- name: create a diretcory
  file:
    path: /etc/test
    state: directory

- name: copy files
  copy:#本地到远程 fetch 远程到本地
    src: files/test.txt
    dest: /etc/test/test.txt
    backup: yes #自动备份,文件加上日期,时间等

system

ping,gather_facts

    - name: ping
      ping:
ansible localhost -m gather_facts --tree ./fact

user,group

    - name: create group
      group:
        name: mygroup
        state: present

    - name: delete group
      group: 
        name: mygroup
        state: absent    
    - name: create user
      user:
        name: demo
        password: "{{ 'demo' | password_hash('sha512') }}"
    - name: drop user
      user: 
        name: user
        state: absent
        remove: yes

yum,apt,packages

    - name: testyum
      yum:
        name: git
        state: present

    - name: testyum delete
      yum:
        name: git
        state: absent
      when: ansible_facts['distribution'] == 'CentOS'
    - name: ensure a list of packages 
      apt:
        name: {{ packages }}
        state: absent
        vars:
          packages:
            - httpd
            - httpd-tools
      when: ansible_facts['distribution'] == 'Ubuntu'

    - name: ensure a list of packages 
      package:
        name: git

pip

- pip:
    name: bottle
    virtualenv: /my_app/venv
    virtualenv_command: virtualenv-2.7
- pip:
    requirements: /my_app/requirements.txt    

get_url,unarchive

- name: test_url
  get_url:
    url: https://****/*.*
    dest: /home/vagrant/
    checksum: md5:3287u3248923743
- name: unarchive
  unarchive:
    src: /home/vagarant/Python-3.8.0.tgz
    dest: /home/vagrant/
    remote_src: yes   #远程是no,默认是no

command

    - name: test command
      command: cat /etc/hosts
      register: host_value

    - debug:
        msg: "{{ host_value.stdout_lines }}"

service

- name: Start service
  become: yes
  service: 
    name: nginx
    state: started
    enabled: true

Ansible Vault文件加密

ansible-vault encrypt inventory/group_vars/all.yml #加密
ansible-vault decrypt inventory/group_vars/all.yml #解密 
ansible-vault encrypt inventory/group_vars/all.yml #加密后执行
ansible-vault view inventory/group_vars/all.yml #查看加密
ansible-vault edit inventory/group_vars/all.yml #编辑加密

ansible-vault encrypt_string "vagrant" --name "ansible_password" #加密字段,然后把字段代替用执行结果代替

set_fact

    - name: Hello World debug
      debug:
        msg: "{{ demo }}"
    - name: gather facts
      setup:
        gather_subset: min
    - name: test set facts
      set_fact:
        test_set_fact: 'set from set_fact'
    - debug:
        var: hostvars[ansible_host]      

fetch和uri模块

fetch:
  src: /etc/test/test.txt
  dest: /tmp
  flat: yes #no会建议每个服务器名的文件夹,yes不会

block的使用 ,失败了执行recure,不失败不执行recure,always始终都会执行,相当于try: except: finally:

tasks:
  - block:
    - name: debg
      debug: 
        msg: "Execute"

    - name: failure
      command: /bin/tests

    rescure:
      - name: debug after
        debug:
          msg: "rerun"
    always:
      - name: always
        debug: 
          msg: "always execute"
    when: ansible_facts['distribution'] == "CentOS"

ansible-lint进行代码风格检查

pip install ansible-lint
ansible-lint site.yml

roules

image.png

使用Handlers
ansible-galaxy

资源

module

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

推荐阅读更多精彩内容