1、Ansible是什么?
Ansible是一個自動化運維工具,基於Python開發,集合了眾多運維工具的優點,可以實現批量系統配置、批量程序部署、批量運行命令等功能。並且它是基於模塊工作的,本身沒有批量部署的能力,真正批量部署的是ansible所運行的模塊,而ansible只是提供一種框架。
2、Ansible常用模塊(至少6個)?
command ping yum copy service shell file replace user group
ping # 主機連通性測試
command # 在遠程主機上執行命令,不支持管道
shell # 在遠程主機上調用shell解析器,支持管道命令個
copy # 用於將文件復制到遠程主機,支持設定內容和修改權限.
file # 創建文件,創建連接文件,刪除文件等
fetch # 從遠程復制文件到本地
cron # 管理cron計划任務
yum # 用於模塊的安裝
service # 管理服務
user # 管理用戶賬號
group # 用戶組管理
script # 將本地的腳本在遠端服務器運行
setup # 該模塊主要用於收集信息,是通過調用facts組件來實現的,以變量形式存儲主機上的信息
3、什么是 Ansible 模塊?
模塊被認為是 Ansible 的工作單元。每個模塊大多是獨立的,可以用標准的腳本語言編寫,如 Python、Perl、Ruby、bash 等。模塊的一個重要屬性是冪等性,意味着一個操作執行多次不會產生副作用。
4、什么是 Ansible 的 playbooks ?
Playbooks 是 Ansible 的配置、部署和編排語言,它是基於YAML語言編寫的。他們可以描述您希望遠程系統實施的策略,或者描述一般 IT 流程中的一系列步驟。
5、描述Ansible是如何工作的?
Ansible由節點和控制機器組成。 控制機器是安裝Ansibles的地方,節點由這些機器通過SSH管理。 借助SSH協議,控制機器可以部署臨時存儲在遠程節點上的模塊。
控制機器使用ansible或者ansible-playbooks在服務器終端輸入的Ansible命令集或者playbook后,Ansible會遵循預先編排的規則將PLAYbook逐條拆解為Play,再將Play組織成Ansible可以識別的任務tasks,隨后調用任務涉及到的所有MODULES及PLUGINS,根據主機清單INVENTORY中定義的主機列表通過SSH協議將任務集以臨時文件或者命令的形式傳輸到遠程節點並返回結果,如果是臨時文件則執行完畢后自動刪除。
6、ansible 與 docker
ansible內置多種雲計算相關模塊,如aws,openstack,docker等,下圖是ansible與docker相關的模塊:
6.1、使用ansible創建docker鏡像
通過playbook和dockerfile相結合的方式生成鏡像, 示例如下:
FROM ansible/ubuntu14.04-ansible:stable
MAINTAINER xxx
ADD ansible /srv/ansible
WORKDIR /srv/ansible
RUN ansible-playbook web-app.yaml -c local
VOLUME /srv/project/static
WORKDIR /srv/project
EXPOSE 8000
CMD ["gunicorn_django", "-c", "gunicorn.conf.py"]
6.2、啟動容器
ansible可以通過docker模塊來操作容器,示例如下:
- name: start the postgres container
docker:
image: postgres:9.4
name: postgres
public_all_ports: True
env:
POSTGRES_USER: "{{ database_user }}"
POSTFRES_PASSWORD: "{{ database_password }}"
練習題:
1、ansible使用copy模塊來將/opt/aa.txt復制到/home/jack中
ansible node1 -m copy -a 'src=/opt/aa.txt dest=/home/jack/'
[root@manager ~]# ansible node1 -m copy -a 'src=/opt/aa.txt dest=/home/jack/'
node1 | CHANGED => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": true,
"checksum": "da39a3ee5e6b4b0d3255bfef95601890afd80709",
"dest": "/home/jack/aa.txt",
"gid": 0,
"group": "root",
"md5sum": "d41d8cd98f00b204e9800998ecf8427e",
"mode": "0644",
"owner": "root",
"size": 0,
"src": "/root/.ansible/tmp/ansible-tmp-1592384605.11-1992-33979510717979/source",
"state": "file",
"uid": 0
}
[root@manager ~]# ansible node1 -a 'ls -l /home/jack'
node1 | CHANGED | rc=0 >>
總用量 0
-rw-r--r-- 1 root root 0 6月 17 17:03 aa.txt
2、使用file模塊,來定義/home/jack/aa.txt的權限為777,歸屬為所有者是jack,所屬組為jack
ansible node1 -m file -a 'path=/home/jack/aa.txt owner=jack group=jack mode=0777’
[root@manager ~]# ansible node1 -m file -a 'path=/home/jack/aa.txt owner=jack group=jack mode=0777'
node1 | CHANGED => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": true,
"gid": 1001,
"group": "jack",
"mode": "0777",
"owner": "jack",
"path": "/home/jack/aa.txt",
"size": 0,
"state": "file",
"uid": 1001
}
[root@manager ~]# ansible node1 -a 'ls -l /home/jack'
node1 | CHANGED | rc=0 >>
總用量 0
-rwxrwxrwx 1 jack jack 0 6月 17 17:03 aa.txt
3、使用yum模塊,安裝httpd服務
ansible node1 -m yum -a 'name=httpd state=present’
[root@manager ~]# ansible node1 -m yum -a 'name=httpd state=present'
node1 | CHANGED => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": true,
"changes": {
"installed": [
"httpd"
]
},
"msg": "Repository base is listed more than once in the configuration\n",
"rc": 0,
"results": [
"Loaded plugins: fastestmirror\nLoading mirror speeds from cached hostfile\n * base: mirrors.aliyun.com\n * epel: mirrors.yun-idc.com\n * extras: mirrors.aliyun.com\n * updates: mirrors.aliyun.com\nResolving Dependencies\n--> Running transaction check\n---> Package httpd.x86_64 0:2.4.6-93.el7.centos will be installed\n--> Finished Dependency Resolution\n\nDependencies Resolved\n\n\n Package Arch Version Repository Size\n\nInstalling:\n httpd x86_64 2.4.6-93.el7.centos base 2.7 M\n\nTransaction Summary\n================================================================================\nInstall 1 Package\n\nTotal download size: 2.7 M\nInstalled size: 9.4 M\nDownloading packages:\nRunning transaction check\nRunning transaction test\nTransaction test succeeded\nRunning transaction\n Installing : httpd-2.4.6-93.el7.centos.x86_64 1/1 \n Verifying : httpd-2.4.6-93.el7.centos.x86_64 1/1 \n\nInstalled:\n httpd.x86_64 0:2.4.6-93.el7.centos \n\nComplete!\n"
]
}
[root@manager ~]#
[root@manager ~]# ansible node1 -a 'rpm -q httpd'
[WARNING]: Consider using the yum, dnf or zypper module rather than running 'rpm'.
If you need to use command because yum, dnf or zypper is insufficient you can add
'warn: false' to this command task or set 'command_warnings=False' in ansible.cfg
to get rid of this message.
node1 | CHANGED | rc=0 >>
httpd-2.4.6-93.el7.centos.x86_64
4、使用cron模塊,定義一個任務,每周五的14點30分執行備份/var
ansible node1 -m cron -a 'name=“crontab test” weekday=5 hour=14 minute=30 job="/usr/bin/tar -czf /opt/var.tar.gz /var"'
[root@manager ~]# ansible node1 -m cron -a 'name="crontab test" weekday=5 hour=14 minute=30 job="/usr/bin/tar -czf /opt/var.tar.gz /var"'
node1 | CHANGED => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": true,
"envs": [],
"jobs": [
"crontab test"
]
}
5、使用user模塊,創建用戶student,讓其是系統用戶,屬組為root,uid為2000
ansible node1 -m user -a 'name=student system=yes group=root uid=2000’
[root@manager ~]# ansible node1 -m user -a 'name=student system=yes group=root uid=2000'
node1 | CHANGED => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": true,
"comment": "",
"create_home": true,
"group": 0,
"home": "/home/student",
"name": "student",
"shell": "/bin/bash",
"state": "present",
"system": true,
"uid": 2000
}
[root@manager ~]# ansible node1 -m shell -a 'id student'
node1 | CHANGED | rc=0 >>
uid=2000(student) gid=0(root) 組=0(root)
)
原文鏈接:https://blog.csdn.net/qq_40003309/article/details/106793950
Ansible總結:
https://www.jianshu.com/p/c82737b5485c