~]# vim /etc/ansible/ansible.cfg
[defaults]
# uncomment this to disable SSH key host checking
host_key_checking = False //第一次鏈接別的機器的時候,都會出現保存密鑰指紋的提示,這裏False的意思是免去第一次鏈接出現這個麻煩的問題
#SSH timeout
timeout = 2 //ssh鏈接超時時長,由於是內網傳輸,因此能夠設置的小點,默認爲10s
[ssh_connection]
# Control the mechanism for transfering files
# * smart = try sftp and then try scp [default]
# * True = use scp only
# * False = use sftp only
scp_if_ssh = True //使用scp來傳輸
[root@localhost ~]# ssh-keygen //生成公鑰和私鑰
[root@localhost ~]# ssh-copy-id root@172.16.9.2 //分發公鑰至對端主機上
[root@localhost ~]# ansible 172.16.9.8 -m ping
[WARNING]: No hosts matched, nothing to do
當出現這種狀態時,私鑰已經發給對端了,那就是hosts文件裏沒有寫對應的ip地址,寫上就行了。
[root@localhost ~]# cd .ssh/
[root@localhost .ssh]# ls //在本地路徑下生成相應的文件來支持免密交互
authorized_keys id_rsa id_rsa.pub known_hosts
[root@localhost .ssh]# cat known_hosts
172.16.9.4 ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBBYMef7fW7y5uM+vQtdQUuYyMNiY9UWNj9YMpWTZUPrE+jbUiFp3u3JnMfqBdJ9gI/1gqIrVBh6YEgeEfUrZVeM=
172.16.9.3 ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBOMXVpFc5Hfu814Xz1KOfWVAIpQaX1en7uaiNpRh25JHU/sUWInI7ggCHphPg9FIx/i3GgzH7Wa+XjHjeIpx/TU=
172.16.9.2 ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBPssRsKsOpds0BWjuvH272Ym9CBjqKGbQzGjKs7cdSy7hv4VRyLDT8BBY8cPlb9lvKXtqrdWd3rJ68HNIFqMLDc=
172.16.9.1 ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBPBmV6HJ92KTxueEYjxQZQmbFjB4NY2/eqq5WPxkt/RiL/H7cZmoXkpWV80tyLq9vx1Uq+2Bac8n8cJXkZG/VMQ=
[WARNING]: No hosts matched, nothing to do
配置用戶組至hosts文件中php
~]# vim /etc/ansible/hosts //在最後一行你所須要管理的服務器地址
[web] //名稱就叫web組
172.16.9.1
172.16.9.2
172.16.9.3
172.16.9.4
ansible[-f forks] [-m module_name] [-a args]
-f forks:啓動的併發線程數
-m module_name:要使用的模塊
-a args: 模塊特有的參數
-C 幹跑一遍,就是測試一下
~]# ansible 172.16.9.2 -m setup //查看某一臺主機的信息,而後從中挑選所須要關注的就好
~]# ansible 172.16.9.2 -m setup | grep processor
"ansible_processor": [
"ansible_processor_cores": 1,
"ansible_processor_count": 1,
"ansible_processor_threads_per_core": 1,
"ansible_processor_vcpus": 1, //這個變量就能知道個人機器有多少個核心,也就能夠用來定義nginx的工做核心
~]# ansible all -m ping
~]# ansible web -m command -a 'ls'
172.16.9.3 | SUCCESS | rc=0 >>
anaconda-ks.cfg
172.16.9.2 | SUCCESS | rc=0 >>
172.16.9.3
anaconda-ks.cfg
~]# ansible web -m shell -a 'useradd natasha && echo natasha | passwd --stdin natasha'
172.16.9.3 | SUCCESS | rc=0 >>
Changing password for user natasha.
passwd: all authentication tokens updated successfully.
172.16.9.2 | SUCCESS | rc=0 >>
Changing password for user natasha.
passwd: all authentication tokens updated successfully.
~]# ansible web -m copy -a 'src=/etc/fstab dest=/ mode=777 backup=yes'
~]# ls
-rwxrwxrwx. 1 root root 465 Jul 8 08:05 fstab
-rw-r--r--. 1 root root 465 Jul 8 08:04 fstab.2717.2017-07-08@08:05:29~
生成的備份文件
~]# ansible web -m copy -a 'content="Hello World!" dest=/world'
將"Hello World!" 放入/world文件中,文件不存在會自動建立
~]# ansible web -m cron -a 'name="check dirs" minute="0" hour="5,2" job="ls -alh > /dev/null"'
~]# crontab -l
#Ansible: check dirs
0 5,2 * * * ls -alh > /dev/null
~]# ansible web -m file -a 'src=/fstab dest=/fstab.link state=link'
將目標主機上的/fstab 建立一個軟連接
~]# ansible web -m file -a 'path=/fstab.link state=absent'
刪除連接
~]# ansible web -m file -a 'path=/new.xx src=/new state=link owner=tom group=tom mode=777'
將/new生成一個/new.xx的連接,而且屬主屬組都爲tom且權限爲777
~]# ansible web -m hostname -a 'name=niao'
修改web組的成員的hostname=niao
~]# ansible web -m yum -a 'name=nginx state=latest' //安裝最新版nginx
~]# ansible web -m yum -a 'name=nginx state=absent' //卸載nginx
~]# ansible test -m yum -a 'name=http://nginx.org/packages/centos/6/noarch/RPMS/nginx-release-centos-6-0.el6.ngx.noarch.rpm state=present' //直接下載安裝
~]# ansible web -m service -a 'name=nginx state=started enabled=yes runlevel=2345 ' //開啓nginx服務,而且開機啓動,運行級別2345
~]# ansible web -m service -a 'name=network state=restarted args=eth0'
//重啓網卡
~]# ansible web -m user -a 'name=jerry password="$1$9DgSSTxd$zJE2FHK1rxtyQhkzeHzk50"' //建立用記,並給定密碼
~]#
~]# echo "jerry" | openssl passwd -1 -salt $(< /dev/urandom tr -dc '[:alnum:]' | head -c 32) -stdin //md5加密,若是不生成密碼,而是直接在ansible中寫的話,密碼會以明文的方式記錄在passwd文件中
$1$9DgSSTxd$zJE2FHK1rxtyQhkzeHzk50
~]# ansible web -m user -a 'name=josn uid=10000 groups=tom,jerry shell=/bin/zsh '
~]# ansible web -m user -a 'name=jerry state=absent remove=yes' //刪除用戶的同時 ,刪除用記家目錄
~]# ansible web -m script -a '/root/a.sh' //將本地的腳本在別的主機上執行
~]# ansible 172.16.9.2 -m synchronize -a 'mode=pull src=/ming dest=/'
從9.2的主機/ming目錄拉取到本機上
~]# ansible 172.16.9.2 -m synchronize -a ' src=/ming dest=/ '
將ming目錄推送至9.2的主機上
mode:push和pull模塊,push模塊的話,通常用於從本機向遠程主機上傳文件,pull模式用於從遠程主機上取文件
~]# vim nginx.yml
---
#This is admin nginx.
- hosts: web
remote_user: root
tasks:
- name: install nginx
yum: name=nginx state=latest //一個命令對應一個name
- name: start nginx
command: systemctl start nginx
- name: ever nginx
command: systemctl enable nginx
---
- hosts: web //操做的主機組,在/etc/ansible/hosts中定義
remote_user: root //操做的用戶
# gather_facts: No #禁止ansible收集setup信息,默認是開啓的,只有是開啓的,才能判斷when條件
tasks: //任務
- name: install nginx
yum: name=nginx state=latest
tags: install //打標記,能夠單獨執行
- name: 9.3 start nignx //任務描述
service: name=nginx state=restarted //調用ansible的service模塊重啓nginx
when: ansible_hostname == "dai" //條件判斷,符合就執行service 模塊操做,可用and或or。可以使用ansible 172.16.9.3 -m setup 就能夠獲取整個主機的全部信息
tags: restart nginx
~]# ansible-playbook --tags="restart nginx" setup.yml //執行playbook中指定的tags
~]# ansible-playbook --skip-tags="install" setup.yml //也能夠跳過tags
注意:在notify中定義內容必定要和tasks中定義的- name內容同樣,這樣才能達到 觸發的效果,不然會不生效java
---
#This is admin nginx.
- hosts: web
remote_user: root
vars:
- filename: "nginx.conf.j2"
tasks:
- name: deliver config
template: src={{ filename }} dest=/etc/nginx/nginx.conf //用的是模塊,且調用兩次變量,一次是本地filename,每二次是/etc/ansible/hosts中的web_ports
notify: restart nginx //要和handler中的name相同
handlers:
- name: restart nginx
service: name=nginx state=restarted
~]# vim /etc/ansible/hosts
...
[web:vars] //某個組中的變量,若是不在這定義變量,也能夠執行命令的時候跟上 -e 選項在賦值也是能夠的,而且在命令行中優先級高
web_ports=10000 //給變量賦值
..
~]# cp /etc/nginx/nginx.conf /nginx.conf.j2
~]# vim nginx.conf.j2 //ansible中模版文件要以.j2格式結尾,才能使用
...
worker_processes {{ ansible_processor_vcpus }}; //這個值是自動去操做的主機上獲取相應的參數來設定的,
...
listen {{ web_ports+1 }} default_server; //調用變量,變量要用{{ }},也可以使用各種運算符
...
~]# vim nginx.conf.j2 //在http中添加for循環
{% for vhost in xiaoniao %} //xiaoniao是數組,要在yml文件中定義,vhost是變量
server {
{% if http_port is defined %} //條件判斷,http_port有沒定義變量值,有的話就替換該值,沒有就該行
listen {{ http_port }};
{% endif %} //結束條件判斷
server_name {{ vhost }}.xiaoniao.com; //每次都引用
root /web;
location / {
}
}
{% endfor%} //結束循環
若是此處的vhost變量是ip地址的話,正常的賦值是不成功的,必須加上「[]」才行,由於其中有點號
[172.16.9.1]
} //這個括號是http的
~]# vim template.yml
---
- hosts: web
remote_user: root
vars: //在語法中添加變量的成員
- xiaoniao:
- www
- new
- girl
- photo
- http_port: "1000" //定義條件判斷的值,也可在hosts中定義變量
tasks:
- name: template config
template: src=nginx.conf.j2 dest=/etc/nginx/nginx.conf
notify: restart nginx
handlers:
- name: restart nginx
service: name=nginx state=restarted
若是此處的vhost變量是ip地址的話,正常的賦值是不成功的,必須加上「[]」才行,由於其中有點號
[172.16.9.1]
---
- hosts: web
remote_user: root
tasks:
- name: install app
yum: name={{ item }} state=present //固定的變量名
with_items: //元素列表
- httpd
- php
with_items字典:linux
---
- hosts: web
remote_user: root
tasks:
- name: add user
user: name={{ item.name }} groups={{ item.group }} //字典功能,可有多個值
with_items:
- { name: "niao" , group: "natasha" } //爲一組
- { name: "xiao" , group: "root"}
Roles用於層次性,結構化地組織playbook,roles可以根據層次型結構自動裝載變量文件、tasks以及handlers等。要使用roles只須要在playbook中使用include指令便可。簡單來說,roles就是經過分別將變量、文件、任務、模板及處理器放置於單獨的目錄中並能夠便捷地include他們的一種機制,角色通常用於主機構建服務的場景中,但也能夠是用於構建守護進程等場景中。nginx
[root@localhost ansible]# tree roles/
roles/
├── httpd //服務名稱,直接用include調用
│ ├── default //爲當前角色設定默認變量時使用此目錄
│ ├── files //存放由copy或script等模塊調用的文件
│ ├── handlers //此目錄中應當包含一個main.yml,用於定義此角色用到的和handler;也可包含其它文件
│ ├── meta //應當包含一個main.yml,用於定義此角色的特殊設定及其依賴關係
│ ├── tasks //至少包含一個名爲main.yml的文件,其定義了此角色的任務列表;此文件可使用include包含其它的位於此目錄中的task文件
│ ├── templates //template模塊會自動在此目錄中尋找Jinja2模板文件
│ └── vars //應當包含一個main.yml文件,用於定義此角色用到的變量
~]# mkdir -pv /etc/ansible/roles/jdk/{vars,templates,handlers,meta,default,tasks,files}
~]# cd /etc/ansible/roles/jdk/
~]# cp jdk-7u79-linux-x64.rpm /etc/ansible/roles/jdk/files/
~]# vim files/java.sh
exprot JAVA_HOME=/usr/java/latest
export PATH=$JAVA_HOME/bin:$PATH
~]# vim tasks/main.yml
- name: copy jdk.rpm file
copy: src=jdk-7u79-linux-x64.rpm dest=/
- name: install jdk
shell: yum -y install /jdk-7u79-linux-x64.rpm
- name: provides jdk.sh
copy: src=java.sh dest=/etc/profile.d/java.sh
tags: jdksh//只要是提供文件的,最好都給個tags,以避免下次要從新執行所有web
notify:
- source /etc/profile.d/java.sh //當提供的文件出現改動時,就能夠觸發條件,在去讀取一下;因此就須要在handlers下提供配置文件
- name: read /etc/profile.d/java.sh //提供完文件要從新讀取環境變量
shell: source /etc/profile.d/java.sh
- name: source /etc/profile.d/java.sh //這裏的名稱要和notify一致,方纔能匹配到
shell: source /etc/profile.d/java.sh
~]# vim /etc/ansible/site.yml
~]# cat ../../site.yml
- hosts: jdk //對哪一個組進行工做
remote_user: root
roles: //哪一個角色
- jdk //jdk目錄
~]# vim /etc/anisble/hosts
...
[jdk] //給這四個主機定義爲一個組
172.16.9.1
172.16.9.2
172.16.9.3
172.16.9.4
~]# ansible-playbook site.yml
PLAY [jdk] *********************************************************************
TASK [setup] *******************************************************************
ok: [172.16.9.1]
ok: [172.16.9.4]
ok: [172.16.9.3]
ok: [172.16.9.2]
TASK [jdk : install jdk] *******************************************************
changed: [172.16.9.4]
[WARNING]: Consider using yum module rather than running yum //這個報錯,只是想提示,用yum最好,可是我就是要用shell模塊
changed: [172.16.9.2]
changed: [172.16.9.3]
changed: [172.16.9.1]
TASK [jdk : provides jdk.sh] ***************************************************
changed: [172.16.9.2]
changed: [172.16.9.3]
changed: [172.16.9.4]
changed: [172.16.9.1]
TASK [jdk : read /etc/profile.d/java.sh] ***************************************
changed: [172.16.9.2]
changed: [172.16.9.3]
changed: [172.16.9.4]
changed: [172.16.9.1]
RUNNING HANDLER [jdk : source /etc/profile.d/java.sh] **************************
changed: [172.16.9.3]
changed: [172.16.9.4]
changed: [172.16.9.2]
changed: [172.16.9.1]
PLAY RECAP *********************************************************************
172.16.9.1 : ok=5 changed=4 unreachable=0 failed=0
172.16.9.2 : ok=5 changed=4 unreachable=0 failed=0
172.16.9.3 : ok=5 changed=4 unreachable=0 failed=0
172.16.9.4 : ok=5 changed=4 unreachable=0 failed=0
~]# echo $JAVA_HOME
//這裏的JAVA_HOME沒有讀出來,不知道爲何,我用的source啊,待我在查查資料,若是有朋友知道,也能夠告訴我一下
~]# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin //PATH環境變量卻是讀出來了,真是奇怪了
可是,我重開一個會話,JAVA_HOME變量就能夠讀出來了shell
~]# echo $JAVA_HOME
/usr/java/latest //想不明白
vim /etc/ansible/roles/jdk/files/java.sh
...
export CLASSPATH=.:$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/dt.jar //添加一行
還好個人tasks中傳送文件那裏作了tags和notify,就是爲了等這個機會呢
~]# ansible-playbook --tags="jdksh" /etc/ansible/site.yml
//此次操做只發送了java.sh而且重讀了一下,多方便
~]# ansible-playbook --tags="jdksh" /etc/ansible/site.yml
總結就到這了,有什麼問題,歡迎討論,知無不言。vim