Ansible自動化メンテナンスツールのインストールと構成

13729 ワード

ansibleのインストールと構成の紹介
一、ansible紹介
1、ansible概要
ansibleは新しく登場したメンテナンスツールで、Pythonに基づいて開発されたもので、多くの古いメンテナンスツールの利点を練り合わせて、一括オペレーティングシステムの構成、一括プログラムの配置、一括実行コマンドなどの機能を実現した.その実行構造はC/Sモードとして記述でき、サーバ側にansibleパッケージをインストールし、Client側を一括管理する.ansibleは構成管理ツールとして定義され、通常Chef、Puppet、Saltと同列に論じられる.
2、ansibleの特徴:
a、使いやすい文法
ansibleの構成管理スクリプトはplaybookと呼ばれ、playbookの構文はYAMLに基づいて開発され、YAMLは人間が読み書きしやすいことを設計理念とするデータフォーマット言語である.
b、リモートホストはいかなる依存をインストールする必要がない
ansible管理を使用するサーバはsshとPython 2.5(または更新バージョン)をインストールするか、simplejsonライブラリのPython 2.4をインストールする必要があります.それ以外にagentプログラムやその他のソフトウェアをプリインストールする必要はありません.
注意:サーバ側(リモートホストを制御するホスト)にはPython 2.6以降のインストールが必要です.
c、プッシュモードに基づく
Puppet、Saltstackに代表されるagentプログラムを使用する構成管理システムでは、デフォルトで「プルモード」が使用され、サーバにインストールされたagentプログラムは定期的にセンターサービスにステータスを報告し、対応する構成情報をプルします.ansibleのプッシュモードに比べて複雑で、通話料の時間が比較的多い.しかし、本当に引き取りモードが好きな場合は、ansibleの公式バージョンもサポートされており、ansible-pullというツールを使用することができます.ansibleの公式バージョン内で一緒にリリースされています.
d、内蔵モジュール
管理するリモートサーバ上でansibleを使用して任意のshellコマンドを実行できますが、ansibleが本当に強力なのは、ソフトウェアパッケージのインストール、サービスの再起動、プロファイルのコピーなどのタスクを実行できる一連のモジュールを内蔵していることです.
二、設置配置
実験環境の紹介:
server: ansible          Centos 6.6 x86_64   
client1: web1            Centos 6.6 x86_64   
client2: web2            Centos 6.6 x86_64

ansible中国語権威ガイドアクセスアドレスhttp://www.ansible.com.cn/          
1、サービス側にansibleをインストールし、クライアントにインストールする必要はない(ここでyumインストール方式を紹介し、gitlabソースコードを利用してインストールすることができるが、ここでは紹介しない)
まずepelソースをインストールします
#rpm -ivh http://fr2.rpmfind.net/linux/epel/6/x86_64/epel-release-6-8.noarch.rpm
  ansible
#yum install ansible -y

2、ansibleがクライアントを管理する方式(一般ユーザーとrootユーザー)
a、一般ユーザー
サーバ側とクライアント側でそれぞれansibleユーザーを作成し、パスワードを追加します(ユーザーを追加する手順は説明していません).
ansibleを使用してサービス側にログインし、公開鍵を生成します.
$ssh-keygen -t rsa     #      
         
$/usr/bin/ssh-copy-id -i /home/ansible/.ssh/id_rsa.pub [email protected]  #         ansible   

テスト:
$cat /etc/ansible/hosts
[web]
10.0.90.25
$ansible web -m ping           #ping      
10.0.90.25 | SUCCESS => {
    "changed": false, 
    "ping": "pong"
}
$ansible web -m shell -a "ls /tmp" #  /tmp      
10.0.90.25 | SUCCESS | rc=0 >>
hsperfdata_root
yum.log
zabbix_agentd.log
zabbix_agentd.pid
$ansible web -m shell -a "ls /root" #  /root         ,       
10.0.90.25 | FAILED | rc=2 >>
ls: cannot open directory /root: Permission denied
$ansible web -m shell -a "touch /tmp/test.txt"  #        /tmp   
10.0.90.25 | SUCCESS | rc=0 >>
$ansible web -m shell -a "touch /usr/local/src/test.txt"  #        
10.0.90.25 | FAILED | rc=1 >>
touch: cannot touch `/usr/local/src/test.txt': Permission denied

注意:以上より、通常のユーザでクライアントを管理すると権限の問題でエラーが発生すると判定できますのでrootに切り替えて実行します.
いくつかのパラメータについて説明します.
-S, --su              run operations with su (deprecated, use become)
-R SU_USER, --su-user=SU_USER
                      run operations with su as this user (default=root)
                      (deprecated, use become)
-K, --ask-sudo-pass   ask for sudo password (deprecated, use become)

一般ユーザーの下でsuからrootまで実行されるコマンドは、次のとおりです.
$ansible web -m shell -a "touch /usr/local/src/test.txt" -S -R root -K 
SU password:    #      su  ,   root   
10.0.90.25 | SUCCESS | rc=0 >>

一部の友人は、一般ユーザーを使用して接続し、sudoコマンドを使用してroot権限を実現する傾向があります.フォーマットは次のとおりです.
#ansible web -m ping -u ansible -s

しかし、以上のコマンドを使用すると、ansibleをsudoユーザーに構成する必要があります.そうしないと、エラーも表示されます.以下のようにします.
$ansible web -m ping -u ansible -s     
10.0.90.25 | FAILED! => {
    "changed": false, 
    "failed": true, 
    "module_stderr": "", 
    "module_stdout": "sudo: a password is required\r
",      "msg": "MODULE FAILURE",      "parsed": false }

ansibleをsudoユーザーに構成する(クライアントサーバ10.0.90.25で操作)
#vim /etc/sudoers   ##         :
ansible ALL=(ALL) NOPASSWD: ALL      
Defaults:ansible !requiretty      #  ansible     tty

先ほどのコマンドを再度実行すると、エラーは表示されません.次のようになります.
$ansible web -m ping -u ansible -s
10.0.90.25 | SUCCESS => {
    "changed": false, 
    "ping": "pong"
}
$ansible web -m shell -a "touch /root/test_sudo.txt" -u ansible -s   #        OK 
10.0.90.25 | SUCCESS | rc=0 >>

b、rootユーザー
root権限でserver側にログインし、公開鍵を生成
#ssh-keygen -t rsa     #      
         
#/usr/bin/ssh-copy-id -i /root/.ssh/id_rsa.pub [email protected]  #         root   

サービス側とクライアントのssh信頼を確立しなければ、相対的に安全であるが、コマンドを実行するたびにリモートサーバrootパスワードを入力する必要があり、クライアントrootパスワードが一致しなければならない.
#ansible 10.0.90.25 -m ping -k    
SSH password:   --        root  
10.0.90.25 | success >> {
    "change": false,
    "ping": "pong"
}

注意:サービス側とクライアントはSSH信頼を構成していません.ansibleコマンドを実行するときに-k(小文字kは--ask-passに等しい)パラメータを追加する必要があります.rootを指定する必要があります.(デフォルト)アカウントパスワード.これによりsudoを使ってroot実行コマンドに切り替えたり、root実行コマンドをそのまま使ったりするのは本質的に変わらないと断定できますが、root権限は何でもできるので、操作するときは必ず自分のコマンドがクライアントに回復不可能なエラーを起こさないようにチェックしてから実行します!!!(本人はrootユーザー管理を直接使用しています)
PS:一度centos 6.5 x 86_で64システムがansibleをインストールした後、次のコマンドを実行してエラーを報告します.
#ansible --version --    :
Traceback (most recent call last):
  File "/usr/bin/ansible", line 36, in 
    from ansible.runner import Runner
ImportError: No module named ansible.runner

Googleでたくさんの資料を探しましたが、解決しませんでした.後で/usr/bin/ansibleファイルを修正する最初の行python解釈器を見ました(ansibleはpython 2.6以上のバージョンに依存しています)/usr/bin/pythonを/usr/bin/python 2.6に変更すると、エラーは報告されません.このサーバにpython 2.7バージョンがコンパイルインストールされていたため、#which pythonコマンドを使用して/usr/local/python 2.7/bin/pythonが表示され、/usr/bin/ansibleの最初の行が/usr/bin/pythonを呼び出したため、エラーが発生しました!)
3、一括コピーサービス側の公開鍵からクライアントへの構成
参照先:http://linuxg.blog.51cto.com/4410110/1710110
4、サービス側の構成:
[root@ansible ansible]# cat hosts
[web]
10.0.90.24
10.0.90.25
[hosts1]
172.16.29.193

注意:hostsファイル定義:サービス側がsshパスワードなしでクライアントにログインするように構成されていない場合、hostsファイルの構成は次のとおりです.
[webhosts]  
172.16.10.22 ansible_ssh_user=root ansible_ssh_pass=mima
172.16.10.33 ansible_ssh_user=root ansible_ssh_pass=mima
    
#ansible_ssh_user=root  ssh      
#ansible_ssh_pass=mima  ssh    

簡単なテスト:
[root@ansible ansible]# ansible 172* -m shell -a "hostname"
172.16.29.193 | success | rc=0 >>
guang
[root@ansible ansible]# ansible host1 -m shell -a "hostname"
172.16.29.193 | success | rc=0 >>
guang
         ,    shell     command
[root@ansible ~]# ansible host1 -m command -a 'date'
172.16.29.193 | success | rc=0 >>
Wed Jun 10 22:37:20 CST 2015
       command , “-m command”     
 :ansible host1 -m command -a "uptime"       ansible host1 -a "uptime"
#ansible host1 -m service -a  "name=httpd state=restarted"

5、ansible管理システムユーザー
まず、パスワードを生成します.
#openssl passwd -1 -salt 12345678
Password:    --    ,         
  :
#ansible web -m user -a 'name=test1 comment="add a test user" password="$1$12345678$qT.Vr20lsSaufZbuk4JIb."'
  :
#ansible web -m user -a "name=test1 state=absent"   --          ,          
#ansible web -m user -a "name=test1 state=absent remove=yes" --          ,          

6、プレイブックの簡単な紹介
ansibleを使用する場合、ほとんどの時間はplaybookの作成に費やされます.playbookはansible用語で、管理を構成するためのスクリプトを指し、いくつかのカラムコマンドをplaybookに統合し、統一的に実行し、時間を節約することができます.Playbookはansibleコマンドラインの実行方式とは異なるモードであり、機能が強く柔軟であり、簡単な構成管理とマルチホスト配置システムであり、既存のモードとは異なり、複雑なアプリケーションの配置に適した基礎とすることができ、Playbookは構成をカスタマイズすることができ、指定された操作手順に従って秩序正しく実行することができる.同期および非同期方式をサポートします.同時にplaybookは1つ以上の「play」からなるリストであり、それらを結合して事前に編成されたメカニズムで実行することができる.taskとはansibleを呼び出すmoduleにほかならないが、モジュールパラメータでは変数を使用することができる.モジュール実行はべき乗などであり、結果が一致するため、複数回の実行が安全であることを意味します.
次に簡単な例を示します.ユーザーを一括作成し、wheelグループにユーザーを追加します.wheelグループに追加したくない場合はgroups=wheelを削除します(パスワードは設定されていません).
#cat add_user.yml 
---
- hosts: web
  remote_user: root
  gather_facts: true
  tasks:
  - name: Add several users
    user: name={{ item }} state=present groups=wheel
    with_items:
      - testuser1
      - testuser2

テスト:作成したymlファイルに構文エラーがあるかどうかを検出します.
#ansible-playbook add_user.yml --syntax-check 
playbook: add_user.yml                   ##                 ,      

実行:
#ansible-playbook add_user.yml

「ユーザーの一括削除」--ユーザーのホームディレクトリも削除し、whellグループから削除できます.
#cat del_user.yml 
---
- hosts: web
  remote_user: root
  gather_facts: true
  tasks:
  - name: del several users
    user: name={{ item }} state=absent remove=yes
    with_items:
       - testuser1
       - testuser2

実行:(実行前に--syntax-checkでymlファイルに文法エラーがあるかどうかを検出し、良い習慣を身につけます)
#ansible-playbook del_user.yml

ユーザーの一括作成とパスワードの設定
#cat add_user.yml 
---
- hosts: web
  remote_user: root
  gather_facts: true
  tasks:
  - name: Add several users
    user: name={{ item }} state=present password="$1$1234567$IElhfIqK0wF7y.p/fYkzb/"
    with_items:
       - testuser1
       - testuser2
  :
#ansible-playbook add_user.yml

別の方法:
# cat adduser.yml 
---
- hosts: web
  remote_user: root
  vars:                     ##  
    username: testuser9        
    password: testusermima
  tasks:
    - name: add user
      user: name={{ username }} state=present
    - name: set password
      shell: /bin/echo {{ password }} | /usr/bin/passwd --stdin {{ username }}

前述したように、クライアントにsudoユーザーを構成することは、直接操作される/etc/sudoersファイルであり、クライアントが少ない場合はこの方法も考えられるが、数十台、数百台のクライアントがあれば、この方法は通用しない.ここではplaybookでsudoユーザーを一括追加する方法を紹介します.
#cat add_sudoer.yml 
---
- hosts: all
  vars:
    user: test
    password: "$1$123456$fDuma3GXwl8ivHL9oSoCm1"
  remote_user: root
  tasks:
    - name: Add User test
      user: name={{ user }} comment="manage 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"

パスワードは、前述したopensslで生成するか、次のように生成できます.
#yum install python-pip -y
#pip install passlib -y
#python -c "from passlib.hash import sha512_crypt; import getpass; print sha512_crypt.encrypt(getpass.getpass())"
Password:    #           ,            ,    ,           
$6$rounds=656000$CvpbftENezrD7dtl$hROqRJu77oQST2iqmk24ZaNtZ8OMFohLWRum63EDyqWwYgfaI5kLBHoVGzwdTJLyxOhY5hA9dNtJrBSQMk4cH1

文法エラーがあるかどうかをテストします.以下に正しいことを示します.
#ansible-playbook add_sudoer.yml --syntax-check
playbook: add_sudoer.yml

実行:--クライアントrootのパスワードを入力する必要があるので、クライアントのrootパスワードは一致したままにしたほうがいいです.
#ansible-playbook add_sudoer.yml -k
SSH password: 
PLAY ***************************************************************************
TASK [setup] *******************************************************************
ok: [10.0.90.26]
ok: [10.0.90.25]
TASK [Add User test] ***********************************************************
changed: [10.0.90.25]
changed: [10.0.90.26]
TASK [Config /etc/sudoers] *****************************************************
changed: [10.0.90.25] => (item=test ALL=(ALL) NOPASSWD: ALL)
changed: [10.0.90.25] => (item=Defaults:test  !requiretty)
changed: [10.0.90.26] => (item=test ALL=(ALL) NOPASSWD: ALL)
changed: [10.0.90.26] => (item=Defaults:test  !requiretty)
PLAY RECAP *********************************************************************
10.0.90.25                 : ok=3    changed=2    unreachable=0    failed=0   
10.0.90.26                 : ok=3    changed=2    unreachable=0    failed=0

以上のようにsudoユーザーを追加してOKしました!
複数のアイテムが同時に更新される例:
#cat multi_copy.yml
---
- hosts: host1
  remote_user: root
  gather_facts: false
  tasks:
  - name: copy local server file to clint /tmp
    template: src=/root/install.log dest=/tmp/test-`item`
    with_items:
      - install.log-1
      - install.log-2
      - install.log-3
  :     
#ansible-playbook  multi_copy.yml

条件に基づいて削除:
#cat delete.yml
---
- hosts: host1
  remote_user: root
  gather_facts: true
  tasks:
  - name: if system is centos ,then rm /tmp/install.log-1
    shell: rm -f /tmp/test-install.log-3
    when: ansible_os_family == "Ubuntu"
  :
#ansible-playbook delete.yml
 :     when:ansible_os_family == "Ubuntu"    ,shell:rm -rf /tmp/test-install.log-3      ,  gather_facts: true   true。
redhat     :
when: ansible_os_family == "RedHat"

ansible-playbookの実行時間の最適化:
デフォルトのplaybookはクライアントのfact収集を行いますが、一般的に構成でfactを使用していない場合は、閉じることで実行時間を減らすことができます.
参照ドキュメント:http://www.jb51.net/article/52154.htm
注:私のansibleは勉强と模索の中で、足りないところはどうぞよろしくお愿いします!補足:デフォルトのansibleはkey検証を使用し、パスワードでログインしたサーバでansibleを使用する場合はansibleを変更します.cfgプロファイルのask_pass=Trueキャンセルコメントを与えるか、コマンドを実行するときに-kを付けるか、これは-kを意味します.--ask-pass#ask for SSH passwordクライアントがknow_hostsでは次のようにエラーが表示されます.
#ansible web1 -m shell -a "hostname"
paramiko: The authenticity of host 'web1' can't be established.
The ssh-rsa key fingerprint is 59b5a079b9680998ad40c56166be96cc.
Are you sure you want to continue connecting (yes/no)?
         ,       know_hosts  
    ansible.cfg  , #host_key_checking = False    ,  !