
예를 들어, ansible 을 이용하여 httpd 를 설치했다. 이후 다시 설치를 진행하였다. 이 경우 해당 명령을 bash 를 이용하였다면 추가 설치를 진행시킨다
- 처음 설치시 - Changed : true
- 두번째 설치시 - Changed : false
- 이를 이용하게 되면, 불필요한 작업을 SKIP 하게 되므로 리소르를 줄일 수 있게 된다
ansible all -m user -a "name=newuser1" -k
ansible all -m user -a "name=user2" -k
- user 모듈로 user 를 생성된 상태를 보장하도록 하자. user 가 생성된다
211.183.3.147 | CHANGED => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": true,
"comment": "",
"create_home": true,
"group": 1002,
"home": "/home/user2",
"name": "user2",
"shell": "/bin/bash",
"state": "present",
"system": false,
"uid": 1002
}
- 생성되었으므로 변경 사항이 존재한다. 따라서 changed 가 true 이다
- state 의 present 는 배치되어 있음을 의미한다. 삭제하고 싶을 때는 이 state 를 absent 로 설정해주면 된다
[root@ansible-server ~]# ansible all -m shell -a 'cat /etc/passwd | grep user2'
211.183.3.147 | CHANGED | rc=0 >>
user2:x:1002:1002::/home/user2:/bin/bash
211.183.3.146 | CHANGED | rc=0 >>
user2:x:1002:1002::/home/user2:/bin/bash
211.183.3.145 | CHANGED | rc=0 >>
user2:x:1002:1002::/home/user2:/bin/bash
- 잘 생성됬는지 Shell 모듈로 명령을 전달하여 확인하자
211.183.3.145 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"append": false,
"changed": false,
- 동일한 user 생성 명령을 내리면, 오류가 나는 것이 아닌, 이미 존재하기에 Skip 이 된다. changed 가 false 이다. 이와 같이 ansible 은 상태를 보장한다. 따라서, user 생성을 보장하면 되기에 이미 생성되있다면, 명령을 실행하지 않고 Skip 한다. 오류가 아니기에 SUCCESS 이다
ansible all -m user -a "name=user2 state=absent"
- user2 를 삭제된 상태를 보장해달라고 명령을 내린다. 삭제된 상태를 보장하기에 user2 가 없는 Node 에서는 user2 가 없는 상태이므로 삭제 명령을 Skip 한다. 따라서 없는 것을 삭제하는 명령을 실행하지 않았기에 오류가 나지 않는다
- 그냥 install 은 저장소에 있는 최신 버전을 다운 받는다
- localinstall 은 yum 과 연결하여 의존성을 해결해준다
ansible all -m yum -a "name=curl state=present"
- 모든 Node 에 curl 이 배치되는 것을 보장하도록 하자. state 를 present 로 지정하여 배치된 상태를 보장하게 하였다. 따라서 curl 이 설치된다
- 같은 명령을 다시 실행하면, 명령 결과는 SUCCESS 지만, 변경 사항이 없으므로 changed 는 False 이다
ansible all -m yum -a "name=curl state=absent"
- 모든 Node 에 curl 이 삭제되는 것을 보장하도록 하자. state 를 absent 로 지정하여 삭제된 상태를 보장하게 하였다. 따라서 curl 이 삭제된다
ansible all -m yum -a "name=git state=present"
- git 을 설치해주자
ansible all -m git -a "repo=https://github.com/lijahong/html_css_example.git dest=/root/gittest"
- git 모듈을 이용하여 해당 저장소의 내용을 지정한 디렉토리에 Clone 한 상태를 보장하게 하자
- repo 는 git 저장소 주소, dest 는 해당 내용을 붙여넣을 디렉토리를 지정한다. 이때, dest 는 사전에 없는 디렉토리를 지정해야 한다. 즉, 디렉토리가 생성되고, 해당 git 저장소의 내용을 clone 해서 붙여 넣어준다
[root@ansible-server ~]# ansible all -m shell -a "ls /root/gittest"
211.183.3.147 | CHANGED | rc=0 >>
image2.PNG
image.PNG
index.html
README.md
style.css
211.183.3.145 | CHANGED | rc=0 >>
image2.PNG
image.PNG
index.html
README.md
style.css
211.183.3.146 | CHANGED | rc=0 >>
image2.PNG
image.PNG
index.html
README.md
style.css
- shell 모듈을 이용해 잘 clone 됬는지 확인하자
ansible all -m copy -a "src=원본 dest=붙여넣을 곳" -k
- 위 코드를 통해 원본 파일을 지정한 디렉토리에 붙여넣은 상태를 보장하게 할 수 있다
ansible all -m yum -a "name=httpd state=present" -k
- 웹 서버 설치
echo "<h2>lijahong</h2>" > index.html
- index.html 생성
ansible all -m copy -a "src=index.html dest=/var/www/html/index.html"
- server 의 index.html 을 node 의 디렉토리에 복사
[root@ansible-server ~]# ansible all -m shell -a "ls /var/www/html"
211.183.3.145 | CHANGED | rc=0 >>
index.html
211.183.3.147 | CHANGED | rc=0 >>
index.html
211.183.3.146 | CHANGED | rc=0 >>
index.html
- 잘 복사가 되었다
ansible all -m service -a "name=httpd state=started" # = ansible all -m shell -a "systemctl start httpd"
- service 모듈을 통해 state 를 started 로 지정한다. 이는 해당 서비스가 시작된 상태를 보장해달라는 것이다

- 잘 접속된다
ansible all -m service -a "name=httpd state=stopped"
- 위와 같이 상태를 stopped 로 하여 중지 시킬 수 있다
ansible all -m yum -a "name=httpd state=absent"
- state 를 absent 로 하여 httpd 를 삭제하였다
- github 에 shop 이라고 써있는 index.html 생성
- git 모듈을 이용하여 /var/www/html/shop 아래에 index.html clone
- 확인

- index.html 업로드
ansible all -m git -a "repo=https://github.com/lijahong/test.git dest=/var/www/html/shop"
- clone

- 확인하기. 잘 접속된다. 기본디렉토리/shop 에 넣었으므로, 주소/shop 에 들어가야 한다