自動(dòng)化運(yùn)維工具Ansible筆記

簡(jiǎn)介

? ansible是新出現(xiàn)的自動(dòng)化運(yùn)維工具,基于Python開(kāi)發(fā),集合了眾多運(yùn)維工具(puppet、chef、func、fabric)的優(yōu)點(diǎn),實(shí)現(xiàn)了批量系統(tǒng)配置、批量程序部署、批量運(yùn)行命令等功能。
  ansible是基于 paramiko 開(kāi)發(fā)的,并且基于模塊化工作,本身沒(méi)有批量部署的能力。真正具有批量部署的是ansible所運(yùn)行的模塊,ansible只是提供一種框架。ansible不需要在遠(yuǎn)程主機(jī)上安裝client/agents,因?yàn)樗鼈兪腔趕sh來(lái)和遠(yuǎn)程主機(jī)通訊的。ansible目前已經(jīng)已經(jīng)被紅帽官方收購(gòu),是自動(dòng)化運(yùn)維工具中大家認(rèn)可度最高的,并且上手容易,學(xué)習(xí)簡(jiǎn)單。是每位運(yùn)維工程師必須掌握的技能之一。

ansible 特點(diǎn)

  1. 部署簡(jiǎn)單,只需在主控端部署Ansible環(huán)境,被控端無(wú)需做任何操作;
  2. 默認(rèn)使用SSH協(xié)議對(duì)設(shè)備進(jìn)行管理;
  3. 有大量常規(guī)運(yùn)維操作模塊,可實(shí)現(xiàn)日常絕大部分操作;
  4. 配置簡(jiǎn)單、功能強(qiáng)大、擴(kuò)展性強(qiáng);
  5. 支持API及自定義模塊,可通過(guò)Python輕松擴(kuò)展;
  6. 通過(guò)Playbooks來(lái)定制強(qiáng)大的配置、狀態(tài)管理;
  7. 輕量級(jí),無(wú)需在客戶(hù)端安裝agent(代理),更新時(shí),只需在操作機(jī)上進(jìn)行一次更新即可;
  8. 提供一個(gè)功能強(qiáng)大、操作性強(qiáng)的Web管理界面和REST API接口——AWX平臺(tái)。
  9. Ansible適用于中小型應(yīng)用環(huán)境;SaltStack適合大型(Ansible由于不需要代理,只是通過(guò)ssh,因此只能性能不如Saltstack高)

Ansible安裝

法1.在已有python-pip的情況下

$ pip install ansible

法2:

sudo apt-get install software-properties-common
sudo apt-add-repository ppa:ansible/ansible
sudo apt-get update
sudo apt-get install ansible

如果安裝失敗請(qǐng)換源sudo sed -i -re 's/\w+\.archive\.ubuntu\.com/archive.ubuntu.com/g' /etc/apt/sources.list,更新安裝庫(kù)sudo apt-get update

ansible 架構(gòu)圖

img

  上圖中我們看到的主要模塊如下:

Ansible:Ansible核心程序。
HostInventory主機(jī)清單 , 記錄由Ansible管理的主機(jī)信息,包括端口、密碼、ip等。
Playbooks:“劇本”YAML格式文件,多個(gè)任務(wù)定義在一個(gè)文件中,定義主機(jī)需要調(diào)用哪些模塊來(lái)完成的功能。
CoreModules核心模塊,主要操作是通過(guò)調(diào)用核心模塊來(lái)完成管理任務(wù)。
CustomModules:自定義模塊,完成核心模塊無(wú)法完成的功能,支持多種語(yǔ)言。
ConnectionPlugins:連接插件,Ansible和Host通信使用

ansible配置文件查找順序

  1. 檢查環(huán)境變量ANSIBLE_CONFIG指向的路徑文件(export ANSIBLE_CONFIG=/etc/ansible.cfg);
  2. HOME目錄下的配置文件~/.ansible.cfg
  3. 檢查當(dāng)前目錄下的ansible.cfg配置文件;
  4. /etc/ansible.cfg檢查etc目錄的配置文件。

使用特性

  • 模塊化:調(diào)用特定的模塊,完成特定任務(wù)
  • 有Paramiko,PyYAML,Jinja2(模板語(yǔ)言)三個(gè)關(guān)鍵模塊支持自定義模塊
  • 基于Python語(yǔ)言實(shí)現(xiàn)
  • 部署簡(jiǎn)單,基于python和SSH(默認(rèn)已安裝),agentless安全,基于OpenSSH支持playbook編排任務(wù)
  • 冪等性:一個(gè)任務(wù)執(zhí)行1遍和執(zhí)行n遍效果一樣,不因重復(fù)執(zhí)行帶來(lái)意外情況
  • 無(wú)需代理不依賴(lài)PKI(無(wú)需ssl)可使用任何編程語(yǔ)言寫(xiě)模塊
  • YAML格式,編排任務(wù),支持豐富的數(shù)據(jù)結(jié)構(gòu)
  • 較強(qiáng)大的多層解決方案

管理方式:

  • Ad-Hoc,及Ansible命令,主要用于臨時(shí)命令使用場(chǎng)景
  • Ansible-Playbook,腳本,用于長(zhǎng)期規(guī)劃好,大型項(xiàng)目的場(chǎng)景,需要有提前的規(guī)劃

Ansible-playbook(劇本)執(zhí)行過(guò)程:

  • 將已有編排好的任務(wù)集寫(xiě)入Ansible-Playbook
  • 通過(guò)ansible-playbook命令分拆任務(wù)集至逐條ansible命令,按預(yù)定規(guī)則逐條執(zhí)行

相關(guān)文件

配置文件

/etc/ansible/ansible.cfg 主配置文件,配置ansible工作特性
/etc/ansible/hosts 主機(jī)清單
/etc/ansible/roles/存放角色的目錄

程序

/usr/bin/ansible 主程序,臨時(shí)命令執(zhí)行工具
/usr/bin/ansible-doc 查看配置文檔,模塊功能查看工具
/usr/bin/ansible-galaxy 下載/上傳優(yōu)秀代碼或Roles模塊的官網(wǎng)平臺(tái)
/usr/bin/ansible-playbook定制自動(dòng)化任務(wù),編排劇本工具/usr/bin/ansible-pull遠(yuǎn)程執(zhí)行命令的工具
/usr/bin/ansible-vault 文件加密工具
/usr/bin/ansible-console 基于console界面與用戶(hù)交互的執(zhí)行工具

1.設(shè)置被管理的主機(jī)清單vim /etc/ansible/hosts

2.1口令驗(yàn)證方式.ansible 192.168.30.101 -m ping -k用賬號(hào)密碼去確認(rèn)受控端的身份

▲如果出現(xiàn)了這樣的情況,需要先安裝sshpass , sudo apt install sshpass

192.168.100.180 | FAILED! => {
    "failed": true, 
    "msg": "ERROR! to use the 'ssh' connection type with passwords, you must install the sshpass program"
}

2.2基于key驗(yàn)證

$ ssh-keygen
$ ssh-copy-id 192.168.30.101

Generating public/private rsa key pair.
Enter file in which to save the key (/xxxxxx/): 
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in xxxxxxxxx.
Your public key has been saved in xxxxx.
The key fingerprint is:
SHA256:xxxxxxxxxxxxxx
The key's randomart image is:

如果設(shè)置了passphrase,那么鏈接時(shí)需要輸入passphrase,如果是ad-hoc就相當(dāng)麻煩,而playbooks中有解決方法

ad-hoc使用

host_key_checking取消注釋,否則鏈接對(duì)象必須在known_hosts中

$ sudo vim /etc/ansible/ansible.cfg
 uncomment this to disable SSH key host checking
#host_key_checking = False

顯示日志,取消注釋log_path = /var/log/ansible.log

△.ansible不是長(zhǎng)期執(zhí)行的服務(wù),不長(zhǎng)期執(zhí)行,因此修改配置后不需要重啟服務(wù)

ansible <host-pattern>[-m module_name][-a args]

ansible dbsrvs -m command -a 'ls /root'-u wang-k -b-K
 -u 以wang的身份登錄,-b將wang切換成root,-K 輸入root密碼.
 -m 指定模塊名,-a指定模塊參數(shù)

ansible的Host-pattern即匹配主機(jī)的列表

All:表示所有Inventory中的所有主機(jī)
ansible all-m ping
:通配符
ansible""-m ping
ansible 192.168.1.-m ping
ansible"srvs"-m ping
或關(guān)系
ansible"websrvsiappsrvs"-m ping
ansible"192.168.1.10:192.168.1.20"-m ping

邏輯與
ansible "websrvs:&dbsrvs" -m ping在websrvs組并且在dbsrvs組中的主機(jī),單引號(hào)、雙引號(hào)都行

邏輯非
ansible 'websrvs:ldbsrvs'-m ping在websrvs組,但不在dbsrvs組中的主機(jī)
注意:此處為單引號(hào)

綜合邏輯
ansible 'websrvs:dbsrvs:&appsrvs:lftpsrvs'-m ping

正則表達(dá)式
ansible "websrvs:&dbsrvs" -m ping

ansible "~(webldb).*\.magedu\.com" -m ping


ansible command

  • creates=
    • 存在,不執(zhí)行
  • removes=
    • 不存在,不執(zhí)行
  • chdir=
    • 切換目錄后執(zhí)行

命令返回顏色說(shuō)明

綠色: 表示查看信息,對(duì)遠(yuǎn)程主機(jī)未做改動(dòng)的命令
紅色: 批量管理產(chǎn)生錯(cuò)誤信息
黃色: 對(duì)遠(yuǎn)程主機(jī)做了相應(yīng)改動(dòng)
紫色: 對(duì)操作提出建議或忠告

常用模塊

  • command
  • shell : 遠(yuǎn)程節(jié)點(diǎn)執(zhí)行模塊
    • ansible all -m shel1 -a 'getenforce'
  • script: 在遠(yuǎn)程執(zhí)行本地的腳本
    • ansible test -m script -a "/sh/test.sh"
  • copy : 復(fù)制模塊
    • ansible all -m copy -a 'src=/root/ansible/selinux dest=/etc/selinux/config backup=yes'
    • ansible all -m copy-a 'src=/etc/shadow dest=/data/mode=000 owner=wang'
  • fetch : 遠(yuǎn)程獲取
    • ansible srv-m fetch -a 'src=/root/a. sh dest=/data/scripts'
  • file : 文件操作,刪除、創(chuàng)建
    • ansible test -m file -a "dest=/tmp/hello state=touch"
  • unarchieve、achieve : 壓縮解壓
    • ansible test -m unarchive -a 'src=/srv/tomcat8/apache-tomcat-8.0.29.tar.gz dest=/usr/local copy=no mode=0755'
  • cron
    • 開(kāi)啟ansible all-m cron -a 'minute=* weekday=1,3,5 jcb="/usr/bin/wall FBI warning" name=warningcron'
    • 禁用ansible all -m cron -a 'disabled=true job="/usr/bin/wall FBI warning"name=warningcron'、啟用ansible all -m cron -a 'disabled=falsejob="/usr/bin/wall FBI warning"name=warningcron'
    • 刪除ansible all -m cron -a 'job="/usr/bin/wall FBI warning"name=warningcron state=absent'
  • apt、yum
    • ansible all -m apt 'name=vim update_cache=yes'
  • user
  • group
  • service
    • service:name=httpd state=started enabled=yes
  • setup
    • ansible websrvs -m setup -a 'filter=*address*'
  • template(不能放在ad-hoc)中,只能在playbook中使用

command模塊在針對(duì)管道重定向有*有問(wèn)題==>使用shell模塊

常用模塊介紹

▲一般 present 表示生成、下載, absent 表示刪除或卸載。


系列命令

galaxy

ansible-galaxy install geerlingguy.nginx 其中geerlingguy為角色在./ansible/roles/

playbooks

Yaml

YAML Ain't Markup Language,即YAML不是XML。不過(guò),在開(kāi)發(fā)的這種語(yǔ)言時(shí),YAML的意思其實(shí)是:"Yet Another Markup Language"(仍是一種標(biāo)記語(yǔ)言)

核心元素

  • Hosts 執(zhí)行的遠(yuǎn)程主機(jī)列表
  • Tasks 任務(wù)集
  • Varniables 內(nèi)置變量或自定義變量在playbook中調(diào)用Templates 模板,可替換模板文件中的變量并實(shí)現(xiàn)一些簡(jiǎn)單邏輯的文件Handlers 和notity結(jié)合使用,由特定條件觸發(fā)的操作,滿(mǎn)足條件方才執(zhí)行,否則不執(zhí)行
  • tags 標(biāo)簽指定某條任務(wù)執(zhí)行,用于選擇運(yùn)行playbook中的部分代碼。
    • ansible具有冪等性,因此會(huì)自動(dòng)跳過(guò)沒(méi)有變化的部分,即便如此,有些代碼為測(cè)試其確實(shí)沒(méi)有發(fā)生變化的時(shí)間依然會(huì)非常地長(zhǎng)。此時(shí),如果確信其沒(méi)有變化,就可以通過(guò)tags跳過(guò)此些代碼片斷
      ansible-playbook-t tagsname useradd.yml

加密

加密ansible-vault encrypt hello.yml

解密查看ansible-vault view hello.yml

重新制定口令ansible-vault rekey hello.yml

基礎(chǔ)組件

如果命令或腳本的退出碼不為零,可以使用如下方式替代

tasks:
  - name:run this command and ignore the result
    shell: /usr/bin/somecommand || /bin/true

或者使用ignore_errors來(lái)忽略錯(cuò)誤信息:

tasks:
  - name:run this command and ignore the result
    shell:/usr/bin/somecommand
ignore_errors:True

運(yùn)行playbook的方式

ansible-playbook <filename.yml>..[options]
常見(jiàn)選項(xiàng)
-check(-C)只檢測(cè)可能會(huì)發(fā)生的改變,但不真正執(zhí)行操作
--list-hosts列出運(yùn)行任務(wù)的主機(jī)
--limit主機(jī)列表只針對(duì)主機(jī)列表中的主機(jī)執(zhí)行
-V顯示過(guò)程-vw-vwv更詳細(xì)

handlers和notify

tasks:
  - name: install httpd package 
    yum: name=httpd 
  - name: copy conf file copy:src=files/httpd.conf dest=/etc/httpd/conf/backup=yes 
    notify: restart service 
  - name: start service
    service: name=httpd state=started enabled=yes 
  handlers:
    - name:restart service 
      service:name=httpd state=restarted

標(biāo)簽

指定標(biāo)簽來(lái)執(zhí)行指定任務(wù)

ansible-playbook -t rshttp,xxxx httpd.yml

變量使用

jinjia2語(yǔ)法

{{ var }}
  • 法一:ansible setup facts 遠(yuǎn)程主機(jī)的所有變量都可直接調(diào)用
  • 法二:在/etc/ansible/hosts中定義普通變量:主機(jī)組中主機(jī)單獨(dú)定義,優(yōu)先級(jí)高于公共變量公共(組)變量:針對(duì)主機(jī)組中所有主機(jī)定義統(tǒng)一變量
[websrvs]
192.168.30.101 http_port=81
192.168.30.102 http_port=82
[websrvs:vars]
nodename=www 
domainname=magedu.com
  • 法三:ansible-playbook -e 'var=xxx' app.html,優(yōu)先級(jí)比法二高
  • 法四:
- hosts: 
  remote_user: root
  vars: 
    - var: xxx
  tasks:
    - name: 
       yum: ...

迭代機(jī)制

  tasks:
    - name:
      file: name=/data/{{ item }}
      with_items: 
        - file1
        - file2
        - file3

迭代嵌套自變量

- hosts: websrvs 
  remote_user: root 
  tasks:
    - name: add some groups 
    group: name={{ item ]} state=present 
    with_items:
      - group1
      - group2
      - group3
    - name: add some users 
      user: name={{ item. name ]} group={{ item. group )} state=present 
      with items:
        - { name: user1, group:' group1'}
        - { name: 'user2, group:' group2'}
        - { name: 'user3', group:' group3'}
{% for vhost in nginx_vhosts%}
server{
listen{{ vhost }}
{% endfor %}
- hosts: websrvs 
  remote_user: root
  vars:
    ports:
      - listen_port: 81
      - listen_port: 82
      - listen_port: 83
  tasks:
  - name: copy conf 
    template: src=forl.conf.j2 dest=/data/for1.conf

條件判斷

- hosts: all
  remote_user: root
  tasks:
#如果系統(tǒng)中存在主機(jī)名為nfs或者backup的主機(jī),則創(chuàng)建文件
    - name: Create File
      file: path=/tmp/this_is_{{ ansible_hostname }}_file state=touch
      when: (ansible_hostname == "nfs") or (ansible_hostname == "backup")
 
#系統(tǒng)為centos的主機(jī)才會(huì)執(zhí)行
    - name: Centos Install httpd
      yum: name=httpd state=present
      when: (ansible_distribution == "CentOS")
 
#系統(tǒng)為ubuntu的主機(jī)才會(huì)執(zhí)行
    - name: Ubuntu Install httpd
      yum: name=httpd2 state=present
      when: (ansible_distribution == "Ubuntu")
tasks: 
  - name: run df -h
    sudo_user: test
    sudo: yes
    shell: name=df -h

ansible sudo 即將變更為become

[s21]
#代替原來(lái)192.168.1.21  ansible_ssh_user=i  ansible_ssh_pass=i的寫(xiě)法
192.168.1.21  ansible_ssh_user=i  
ansible_ssh_private_key_file=/home/i/.ssh/id_rsa 
ansible_become=true 
ansible_become_user=root  
ansible_become_pass='i'

獲取執(zhí)行命令的輸出 –Register[轉(zhuǎn)]

- name: echo date 
  command: date 
  register: date_output 

 - name: echo date_output 
  command: echo "30"
  when: date_output.stdout.split(' ')[2] == "30"

判斷文件是否存在[轉(zhuǎn)]

- name: judge a file or dir is exits
  shell: ls /home/sfy
  ignore_errors: True
  register: result

- shell: echo "file exit"
  when: result|succeeded

- shell: echo "file not exit"
  when: result|failed

權(quán)限問(wèn)題

關(guān)于權(quán)限問(wèn)題,可以通過(guò)ansible -h查看

  Privilege Escalation Options:
    control how and which user you become as on target hosts

    -s, --sudo          run operations with sudo (nopasswd) (deprecated, use
                        become)
    -U SUDO_USER, --sudo-user=SUDO_USER
                        desired sudo user (default=root) (deprecated, use
                        become)
    -S, --su            run operations with su (deprecated, use become)
    -R SU_USER, --su-user=SU_USER
                        run operations with su as this user (default=None)
                        (deprecated, use become)
    -b, --become        run operations with become (does not imply password
                        prompting)
    --become-method=BECOME_METHOD
                        privilege escalation method to use (default=sudo),
                        valid choices: [ sudo | su | pbrun | pfexec | doas |
                        dzdo | ksu | runas | pmrun ]
    --become-user=BECOME_USER
                        run operations as this user (default=root)
    --ask-sudo-pass     ask for sudo password (deprecated, use become)
    --ask-su-pass       ask for su password (deprecated, use become)
    -K, --ask-become-pass
                        ask for privilege escalation password

▲其中deprecated表示是將被棄用的,將全部被become代替,(即參數(shù)-b)

關(guān)于-b和-K的作用,可以通過(guò)如下命令進(jìn)行測(cè)試

$ ansible test -m shell -a "whoami"  -K
 mrli身份使用sudo權(quán)限
$ ansible test -m shell -a "whoami"  -b
 切換到root身份
$ ansible test -m shell -a "whoami"  -b -K

▲這個(gè)權(quán)限問(wèn)題在ansible執(zhí)行shell腳本的時(shí)候需要特別注意

個(gè)人寫(xiě)過(guò)的Playbook-demo

- hosts: 192.168.100.190
  remote_user: apollo3d
  become: yes
  vars:
    spark: /home/apollo3d/SimSpark/spark/build
    rcssserver3d: /home/apollo3d/SimSpark/rcssserver3d/build
  tasks:
  - name: judge former platform directory Exsit
    shell: 'ls /home/apollo3d/simspark-0.3.0/build'
    ignore_errors: True
    register: formerDirExsit

  - name: uninstall
    command: 'chdir={{ item }} make uninstall'
    with_items:
      - /home/apollo3d/simspark-0.3.0/build
      - /home/apollo3d/rcssserver3d-0.7.1/build
    when: formerDirExsit|succeeded

  - name: remove
    file:
      dest: '{{ item }}'
      state: absent
    with_items:
      - /home/apollo3d/simspark-0.3.0/
      - /home/apollo3d/rcssserver3d-0.7.1/
    when: formerDirExsit|succeeded

  - name: judge new zip
    shell: ls /home/apollo3d/SimSpark.tar.gz
    ignore_errors: True
    register: zipExsit

  - name: jieya
    unarchive: 
      src: /home/apollo3d/SimSpark.tar.gz
      dest: /home/apollo3d/
      copy: no
      mode: 0755
    when: zipExsit|succeeded


  - name: mk dirs
    file: "dest={{ item }} state=directory"
    with_items:
      - /home/apollo3d/SimSpark/spark/build
      - /home/apollo3d/SimSpark/rcssserver3d/build
    when: zipExsit|succeeded

  - name: install1
    command: 'chdir={{ spark }} {{ item }}'
    with_items:
      - cmake ..
      - make -j4
      - make install
    when: zipExsit|succeeded
    
  - name: install2
    command: 'chdir={{ rcssserver3d }} {{ item }}'
    with_items:
      - cmake ..
      - make -j4
      - make install
    when: zipExsit|succeeded

  - name: config
    shell: '{{ item }}'
    with_items: 
      - echo '/usr/local/lib/simspark\n/usr/local/lib/rcssserver3d' | sudo tee /etc/ld.so.conf.d/spark.conf
      - ldconfig
    when: zipExsit|succeeded


roles

ansilbe自1.2版本引入的新特性,用于層次性、結(jié)構(gòu)化地組織playbook。roles能夠根據(jù)層次型結(jié)構(gòu)自動(dòng)裝載變量文件、tasks以及handlers等。要使用roles只需要在playbook中使用include指令即可。簡(jiǎn)單來(lái)講,roles就是通過(guò)分別將變量、文件、任務(wù)、模板及處理器放置于單獨(dú)的目錄中,并可以便捷地include它們的一種機(jī)制。角色一般用于基于主機(jī)構(gòu)建服務(wù)的場(chǎng)景中,但也可以是用于構(gòu)建守護(hù)進(jìn)程等場(chǎng)景中

復(fù)雜場(chǎng)景:建議使用roles,代碼復(fù)用度高

  • 變更指定主機(jī)或主機(jī)組
  • 如命名不規(guī)范維護(hù)和傳承成本大
  • 某些功能需多個(gè)Playbook,通過(guò)Includes即可實(shí)現(xiàn)

roles目錄結(jié)構(gòu):
playbook.yml
roles/
project/
tasks/
files/
vars/不常用
default/不常用
templates/
handlers/
meta/不常用

附錄

Ansible 配置SSH公鑰認(rèn)證

安裝好Ansible之后,要開(kāi)始工作,還需要?jiǎng)?chuàng)建一個(gè)被控制主機(jī)列表清單.默認(rèn)讀取/etc/ansible/hosts,如果該文件不存在,則要收到進(jìn)行創(chuàng)建.

也可以通過(guò)環(huán)境變量 ANSIBLE_INVENTORY 來(lái)設(shè)置默認(rèn)清單文件,1.9版本之前用 ANSIBLE_HOSTSexport ANSIBLE_INVENTORY=~/ansible_hosts

創(chuàng)建SSH認(rèn)證文件

該操作是在控制主機(jī)中進(jìn)行。

SSH認(rèn)證文件創(chuàng)建成功之后,將控制主機(jī)的公鑰文件 id_rsa.pub 添加到被控制主機(jī)的~/.ssh/authorized_keys。

\ ~指的是控制主機(jī)和被控制主機(jī)通信的用戶(hù)家目錄。

\ id_rsa 是控制主機(jī)的私鑰文件,要嚴(yán)格保管。

\ id_rsa.pub是控制主機(jī)的公鑰文件,可隨意分發(fā)。

法一:ansible all -m shell -a "cat /tmp/authorized_keys >> /root/.ssh/authorized_keys" -k

▲注意

如果被控制主機(jī)中用戶(hù)家目錄中不存在.ssh目錄,就創(chuàng)建。

然后將上傳的公鑰文件追加到用戶(hù)的authorized_keys文件中

法二: (親測(cè))

通過(guò)authorized_key模塊來(lái)進(jìn)行添加

ansible para -i /tmp/inventory.txt -m authorized_key -a "user=root key='{{ lookup('file','/root/.ssh/id_rsa.pub') }}'" -k

lookup('file','/root/.ssh/id_rsa.pub') 是讀取/root/.ssh/id_rsa.pub的內(nèi)容

使用公鑰密鑰對(duì)驗(yàn)證的方法登錄

1. 在本地也創(chuàng)建一個(gè) apple 用戶(hù),并創(chuàng)建 /home/apple/.ssh/ 目錄

$ useradd apple -s /bin/bash -d /home/apple/

創(chuàng)建 .ssh 目錄mkdir /home/apple/.ssh

修改 .ssh 目錄的權(quán)限chmod 700 /home/apple/.ssh

創(chuàng)建 /home/apple/.ssh/known_hosts 文件

2.收集所有遠(yuǎn)程主機(jī)的公鑰,保存在上 /home/apple/.ssh/known_hosts 文件。這一步的作用,是為了在后面第一次ssh 連接時(shí),不需要再輸密碼。

收集所有遠(yuǎn)程主機(jī)的 公鑰,主要是利用 ssh-keyscan 命令:ssh-keyscan -f ip.txt >> /home/apple/.ssh/known_hosts 說(shuō)明: ip.txt 文件存放所有的遠(yuǎn)程主機(jī) ip 地址,一行代表一臺(tái)主機(jī)。

3.創(chuàng)建公鑰私鑰對(duì):

一般在對(duì)應(yīng)用戶(hù)的 /home/apple/.ssh/ 目錄下創(chuàng)建。這也不是強(qiáng)制的,因?yàn)樵趕sh 發(fā)起連接時(shí),可以指定使用的私鑰文件。 ssk-keygen -t rsa 一直按回車(chē)鍵就可以了。但要注意生成的 id_rsa 和 id_rsa.pub 存放的路徑。

4.將公鑰推送到所有的遠(yuǎn)程主機(jī)

我們編寫(xiě)playbook 文件,利用authorized_key 模塊就可以快速完成:

[root@centos_7 roles]$   cat ssh-addkey.yml ---- hosts: apps         對(duì)apps 組里的所有遠(yuǎn)程主機(jī)  
gather_facts: False  
tasks:    
- name: install sshkey      
authorized_key:         
user: apple        
key: "{{ lookup('file', '/home/apple/.ssh/id_rsa.pub') }}"        
state: present 

說(shuō)明: 在前面1,2,3步中,我們已經(jīng)準(zhǔn)備好了公私鑰對(duì)了。推送到遠(yuǎn)程主機(jī),可以手動(dòng)推送,或者使用scp 復(fù)制到遠(yuǎn)程主機(jī)。但是利用scp 復(fù)制之后,還需要修改遠(yuǎn)程主機(jī)上的 /home/apple/.ssh/authorize_keys 文件的權(quán)限等等。 ansible 的 authorized_key 模塊就自動(dòng)幫我們做了這些工作。 執(zhí)行, ansible-playbook ssh-addkye.yml

在多臺(tái)遠(yuǎn)程主機(jī)中創(chuàng)建用戶(hù)

不用ansible,單個(gè)操作

 在 root 用戶(hù)下運(yùn)行這條命令創(chuàng)建一個(gè)新用戶(hù),yangxg 是用戶(hù)名
 因?yàn)槲医袟顚W(xué)光,所以我取的用戶(hù)名是 yangxg
 選擇一個(gè)你喜歡的用戶(hù)名,不一定非得和我的相同
root@localhost:~ useradd -m -s /bin/bash yangxg
 
 把新創(chuàng)建的用戶(hù)加入超級(jí)權(quán)限組
root@localhost:~ usermod -a -G sudo yangxg
 
 為新用戶(hù)設(shè)置密碼
 注意在輸密碼的時(shí)候不會(huì)有字符顯示,不要以為鍵盤(pán)壞了,正常輸入即可
root@localhost:~ passwd yangxg
 
 切換到創(chuàng)建的新用戶(hù)
root@localhost:~ su - yangxg
 
 切換成功,@符號(hào)前面已經(jīng)是新用戶(hù)名而不是 root 了
yangxg@localhost:~$

ansible

---
- hosts: all
  vars:
    user: test
    password: "$6$rounds=100000$O2BHfT2XIF6oDb9w$8Hhv4vOrLN6JF/nRVYDd8zZdnn9TNkQutyYYywIcPF2kRiHgkwAjqHIN7sDUkd1DcjLRABWT9ULHZPBOF2bZS/"
  remote_user: root
  tasks:
  - name: Add user {{ user }}
    user: name={{user}} comment="ceph user" password={{ password }}
  - name: Config /etc/sudoers
    lineinfile: dest=/etc/sudoers state=present  line='{{item}}' validate='visudo -cf %s'
    with_items:
           - "{{ user}} ALL=(ALL) NOPASSWD: ALL"
           - "Defaults: {{user}}  !requiretty"
$ python -c 'import crypt; print crypt.crypt("rescue", "hadoop")'
 hadoop為salt,可以改成其他的。rescue是需要加密的內(nèi)容

$ ansible rescue -m user -a "name=rescue shell=/bin/bash  home=/home/rescue password= state=present" -b -K

$ ansible rescue -m shell -a "usermod -a -G sudo rescue" -b -K

 user模塊增加 update_password=always時(shí),可以更新密碼

一鍵掛載NFS:

ansible full -m mount -a "name=/data src=192.168.100.179:/data fstype=nfs state=mounted" -b -K

掛載需要用SUDO權(quán)限,所以-K必不可少.同時(shí),在這之前已經(jīng)使用過(guò)ssh進(jìn)行了配對(duì)因此不需要輸入登錄用戶(hù)密碼.


其他命令記錄
ss -ntl | grep 80

vim /etc/sysconfig/network-scripts/ifcfg-eth0建議可以使用Alias

service network restart重啟網(wǎng)絡(luò)服務(wù)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容